Coelacanth's Dream

Aldebaran/MI200 はダイあたり 55CU、トータル 110CU か?

オープンソースで開発される AMD GPU の高性能な機械学習用ライブラリ MIOpen に、Aldebaran/MI200 (gfx90a) に向けた畳み込みアルゴリズムの最適化情報を記述したデータベースファイルを追加するプルリクエストが投稿されている。
そこに Aldebran/MI200 の CU数を示すようなコメントがあった。

 Binary file has shrunk: only includes perf entries for gfx906_60, gfx908_120, gfx90a_110.

MIOpen では、いくつかの製品に向けて CU数を含めた最適化情報を記述したデータベースファイルを作成、使用している。
コメントにある gfx906_60Instinct MI50gfx908_120AMD instinct MI100 を想定しているものと思われる。

110CU?

まず断っていくと、多くのことに言えるが いくつか根拠はあっても 100%正しくは無い。取分け、自分が取り上げるような情報や推測は。
そのため、110CU という規模を前提して何かしら書くのではなく、あくまでもその規模がどうか、ということを書いていきたい。

Aldebran/MI200 (gfx90a) で確定してる情報をいくつか列挙すれば、

等がある。

そして、KFD (Kernel Fusion Driver) 部に追加されたキャッシュ情報から、Shader Engine あたり 14CU の構成を採ると考えられる。
AMD GPU のキャッシュ構成情報 ―― Dimgrey Cavefish / Aldebaran / VanGogh | Coelacanth’s Dream

   +static struct kfd_gpu_cache_info aldebaran_cache_info[] = {
   +	{
   +		/* TCP L1 Cache per CU */
   +		.cache_size = 16,
   +		.cache_level = 1,
   +		.flags = (CRAT_CACHE_FLAGS_ENABLED |
   +				CRAT_CACHE_FLAGS_DATA_CACHE |
   +				CRAT_CACHE_FLAGS_SIMD_CACHE),
   +		.num_cu_shared = 1,
   +	},
   +	{
   +		/* Scalar L1 Instruction Cache per SQC */
   +		.cache_size = 32,
   +		.cache_level = 1,
   +		.flags = (CRAT_CACHE_FLAGS_ENABLED |
   +				CRAT_CACHE_FLAGS_INST_CACHE |
   +				CRAT_CACHE_FLAGS_SIMD_CACHE),
   +		.num_cu_shared = 2,
   +	},
   +	{
   +		/* Scalar L1 Data Cache per SQC */
   +		.cache_size = 16,
   +		.cache_level = 1,
   +		.flags = (CRAT_CACHE_FLAGS_ENABLED |
   +				CRAT_CACHE_FLAGS_DATA_CACHE |
   +				CRAT_CACHE_FLAGS_SIMD_CACHE),
   +		.num_cu_shared = 2,
   +	},
   +	{
   +		/* L2 Data Cache per GPU (Total Tex Cache) */
   +		.cache_size = 8192,
   +		.cache_level = 2,
   +		.flags = (CRAT_CACHE_FLAGS_ENABLED |
   +				CRAT_CACHE_FLAGS_DATA_CACHE |
   +				CRAT_CACHE_FLAGS_SIMD_CACHE),
   +		.num_cu_shared = 14,
   +	},
   +};

従来の AMD GPUアーキテクチャでは、各 Shader Engine の規模がそれぞれが同規模になるように設定される。例えば Arcturus/MI100 は Shader Engine 8基、各 SE に最大 16基の CU を持つが、歩留まり向上等の理由から、製品では各 SE の CU を 1基を無効化し、合計 CU 120基という設定を採っていた。

これを Aldebran/MI200 にも適用すると、全体では 10基の SE を持ち、各 SE から CU 3基を無効化、合計 CU 110基となる。
各 SE から CU 3基を無効化というのは、わずかに冗長部が多いようにも感じるが、フルレートFP64 に対応する関係で CU のリソース量は大幅に増えていると予想され、歩留まり向上のため冗長部が増えるのは自然だとも考えられる。

関係して、Arcturus/MI100 では FP64 の性能が FP32 の半分のレートであったため、Aldebaran/MI200 が CU 110基という Arcturus/MI100 より 10基少ない規模だとしても性能は大きく向上している。

別の Shader Engine、CU の設定を考えると、Aldebaran/MI200 は GPUダイ 2基による MCM構成であるため、仮に Shader Engine ではなくダイ単位で対称となる設定を採るならば、各ダイが SE 4基 (CU 56基) を持ち、その内 1基をそれぞれ無効化して合計 CU 110基という構成も有り得る。
こちらの方が構成としてはシンプルで、すっきりした印象を受ける。

CU 110基という規模自体はそうおかしいものではなく、Aldebaran/MI200 は各ダイに 4基の UMC (メモリインターフェイス: 4096-bit) を持ち、これは Arcturus/MI100 と同じ規模だ。
Aldebran/MI200 は HBM2e に対応しているが、Arcturus/MI100 は 2.4 Gbps の HBM2 を採用しているため、メモリ帯域の向上は約 1.2〜1.3倍程度に留まると思われる。それよりもメモリスタックあたり 16GB の容量が選択できることの恩恵が大きい。
そして Aldebaran/MI200 では CU あたりの演算性能が大幅に向上し、クロックあたりのピーク性能は倍になることを考えれば、各ダイに CU 55基というのは演算性能とメモリ性能のバランスを保った構成ということがわかる。

CDNA Arcturus/MI100 Aldebaran/MI200
Active CUs 120 CU 110 CU?
(2x 55 CU?)
FP32:FP64 Rate
(Arcturus FP32 = 1)
1 : 0.5 2 : 1 ?
FP32 Ops/clk
([CU] * [SP per CU] * [FP32 Rate] * 2 [Ops])
15360 28160 ?
(2x 14080) ?
FP64 Ops/clk
([CU] * [SP per CU] * [FP64 Rate] * 2 [Ops])
7680 14080 ?
(2x 7040) ?
Memory HBM2 2.4Gbps HBM2e
Memory Bus width 4096-bit 8192-bit?
(2x 4096-bit)
Memory Size 32 GB 128GB ?
(2x 64GB ?)