Coelacanth's Dream

AMD GPU のダイアグラムを出力するスクリプトを作った話

気が付けばもう 2020年がほとんど残っていなかったので雑記、くだらないことを書きたくなった。

タイトルの通り、AMD GPU のダイアグラムを出力するシェルスクリプトを作った。

実行例は以下みたいな感じ。

## RX 560

 +- ShaderEngine(00) -----------------+  +- ShaderEngine(01) -----------------+ 
 | +- ShaderArray(00) --------------+ |  | +- ShaderArray(00) --------------+ | 
 | | ====  ====  CU (00) ====  ==== | |  | | ====  ====  CU (00) ====  ==== | | 
 | | ====  ====  CU (01) ====  ==== | |  | | ====  ====  CU (01) ====  ==== | | 
 | | ====  ====  CU (02) ====  ==== | |  | | ====  ====  CU (02) ====  ==== | | 
 | | ====  ====  CU (03) ====  ==== | |  | | ====  ====  CU (03) ====  ==== | | 
 | | ====  ====  CU (04) ====  ==== | |  | | ====  ====  CU (04) ====  ==== | | 
 | | ====  ====  CU (05) ====  ==== | |  | | ====  ====  CU (05) ====  ==== | | 
 | | ====  ====  CU (06) ====  ==== | |  | | ====  ====  CU (06) ====  ==== | | 
 | | ====  ====  CU (07) ====  ==== | |  | | ====  ====  CU (07) ====  ==== | | 
 | |  [ RB ] [ RB ]                 | |  | |  [ RB ] [ RB ]                 | | 
 | |  [ Rasterizer/Primitive Unit ] | |  | |  [ Rasterizer/Primitive Unit ] | | 
 | +--------------------------------+ |  | +--------------------------------+ | 
 |      [- Geometry Processor -]      |  |      [- Geometry Processor -]      | 
 +------------------------------------+  +------------------------------------+ 
    [L2$ 256K]      [L2$ 256K]      [L2$ 256K]      [L2$ 256K]      

機能はシンプルで、RadeonSI (OpenGL) ドライバーのデバッグ機能から得られる情報を元にそれっぽいダイアグラムを出力する。

作った動機は、RX 560 で CU数を変えて性能への影響を確かめる検証を行なった時、ShaderEngine、ShaderArray、CU がそれぞれどのような位置にあるかを画像で示したが、これが単純に面倒くさかった。ささっと軽く作ったが、センスの無さもあってチープなのも気に入らない。
RX 560 で CU数が GPU性能にどれだけ影響を与えるかを調査 【性能編】 | Coelacanth’s Dream そうしたことがあって、RX 6800 について書いた時は画像を作らなかったが、やはり図があった方が説明も理解もしやすい。
AMD GPU としては珍しい構成の Radeon RX 6800 | Coelacanth’s Dream

実際には持ってない AMD GPU の解説にも使えるよう、一部情報を上書きするオプションも付けてある。
テキストダイアグラムを使うことで、作成に掛ける時間を大幅に短縮しつつデータの転送量を抑えることができる。
問題点はフォントに左右されることで、ダイアグラムの描画には基本的な記号を用いているから一般的な等幅フォントであれば問題ないはずだが、ブラウザ環境は種々雑多であるからそう言い切れない。
それを回避しようと Imagemagick で画像を出力する機能も持たせようとしたが、上の実行例ぐらい小さいダイアグラムでは問題なく綺麗に出力されるが、大きくなると失敗する不具合があったため、今の所はコメントアウトしてある。成功した時の画像サイズから、設定されている最大サイズは超えないはずなのだが、エラーメッセージは超えていると言ってくる。

自分以外に需要があるかは怪しいけど、一応下記のように各情報とピーク性能を出力する機能も持たせてる。

   Driver Version:		Mesa 21.0.0-devel (git-b9fccafed6)
   
   GPU ASIC:		POLARIS11
   Chip class:		GFX8
   Marketing Name:		Radeon RX 560 Series
   GPU Type:		Discrete GPU
   
   Compute Units:		  16 CU
   GFX Clock Range:	 214 MHz - 1080 MHz
   Peak GFX Clock:		1196 MHz
   
   Peak FP16:		 2.44 TFlops
   Peak FP32:		 2.44 TFlops
   
   RBs (Render Backends):		  4 RB (16 ROP)
   Peak Pixel Fill-Rate:		 19.13 GP/s
   TMUs (Texture Mapping Units):	 64 TMU
   Peak Texture Fill-Rate:		 76.54 GT/s
   
   VRAM Type:		    GDDR5
   VRAM Size:		  4096 MB
   VRAM Bit Width:		   128-bit
   Memory Clock Range:	   300 MHz - 1750 MHz
   Peak Memory Clock:	  1750 MHz
   Peak VRAM Bandwidth:	   112.00 GB/s
   
   L2 Cache Blocks:	  4 Block
   L2 Cache Size:		  1 MB (1024 KB)
   
   Power cap:		 48 W
   
   Card Interface:		PCIe Gen3 x8 
   
   AMD Smart Access Memory

今まさに画面を描画している AMD GPU のスペックと、ダイアグラムによって大体の構造を知り、興味を持つきっかけとなってくれたら幸いだ。