RDNA 2 Instruction Set Architecture Reference Guide がいつの間にか公開されていた。
ドキュメント内の日付は 2020/11/30 となっているが、GPUOpen のページはこれを書いている現時点で反映されておらず、RDNA 2 ISA Reference Guide へのリンクは無い。1
(追記 2020/12/10)GPUOpen の方にも反映された。
RDNA 2 ISA Reference Guide の公開により、オープンソースドライバーの開発、特に ACOバックエンド の RDNA 2 アーキテクチャ 最適化が進むと思われる。
HWレイトレーシング実行のための命令とその仕様も公開された。Windowsドライバーでは既に Vulkan のレイトレーシング拡張に対応しており、オープンソースドライバーもそれに続くことが期待される。2
RDNA 2 アーキテクチャの変更点
レイトレーシング
RDNA 2 アーキテクチャ におけるハードウェアレイトレーシングは以下の命令によって実行される。
- IMAGE_BVH_INTERSECT_RAY
- IMAGE_BVH64_INTERSECT_RAY
これらの命令は、レイデータを WGP(CU) 内に配置されている (近い) ベクタレジスタから受け取り、BVH (Bounding Volume Hierarchy) は WGP(CU) からは遠いメモリから持ってきて処理する。
BVH データをメモリから持ってくるからこそメモリキャッシュ、特に RDNA 2 / GFX10.3 世代で追加された新たなメモリキャッシュ階層 Infinity Cache が効果を発揮するのだろう。
レイ交差の処理性能は、ボックスに対しては 4個の交差を検出でき、トライアングルに対しては 1個の交差が検出できるものとなっている。
推論、学習向けのドット積命令に対応
主に、推論、機械学習の高層化を目的とした、以下のドット積の混合精度演算命令に新しく対応した。
- V_DOT2_F32_F16 / V_DOT2C_F32_F16
- V_DOT2_I32_I16 / V_DOT2_U32_U16
- V_DOT4_I32_I8 / V_DOT4C_I32_I8
- V_DOT4_U32_U8
- V_DOT8_I32_I4
- V_DOT8_U32_U4
ただ新しくと言っても、これらの命令は Vega 7nm / Veag20 から対応しており、Navi12、Navi14 も対応していた。
その中で Navi10 だけが対応していなかったため、Navi10 からの変更点と言えば嘘ではない。3
ベクタレジスタと LDS の割り当てサイズを倍増
RDNA 2 アーキテクチャ の SIMDユニットごとが持つベクタレジスタ、WGP (2CU) 内のユニットで共有する LDS (Local Data Share) の容量、バンク数に変更は無いが、
ベクタレジスタと LDS を割り当てるユニットサイズが倍増された。
ベクタレジスタは、Wave64 (Wave32x2) での実行時は 8 Dwords、Wave32 時は 16 DWords のグループに割り当てられる。(DWord: Double Word, 32-bit, 4-Byte)
LDS は 256 DWords のブロックが Work-group、または Wave ごとに割り当てられる。
Wave はスレッドの塊の意だが、Work-group は Wave の塊で、Wave間の同期、LDS を用いたデータ共有が可能。
ただこの部分に関しては正直自信がなく、ベクタレジスタと LDS の割り当てに言及してる資料が他に見つからなかった。
そのため、ベクタレジスタを 8個か 16個のグループに分けて割り当てるのか、8 Dowrds あるいは 16 DWords ごとのグループに、Wave のサイズによって割り当てるのか 自分の中で
曖昧である。
RDNA アーキテクチャ では、Wave64 (Wave32x2) 時に 4 DWords、Wave32 時に 8 DWords のグループに割り当てていたため、前者の解釈だと割り当てられるベクタレジスタの粒度は小さく、後者は大きくなる。
RadeonSIドライバーに、RDNA アーキテクチャ でも Wave64 (Wave32x2) で各シェーダーを実行する変更が為された時のコメントから、後者の粒度が大きくなったという解釈のが正しいようには思える。自信はない。
RadeonSI ドライバーでは RDNA GPU も Wave64モードで各シェーダーを実行するように | Coelacanth’s Dream
他には、1つのコンポーネントに対して最大 4つのサンプルを、サンプラーを用いずに読み込む IMAGE_MSAA_LOAD
、
グローバルメモリへの TID (Thread-ID) によるアドレッシング等が新たにサポートされている。
以前にそのような話はあったが、RDNA 2 アーキテクチャ では MAD を使わず FMA のみを使うようになり、以下の命令は置き換えられた。
AMD GPU の世代における FMA、MAD 命令の微妙な仕様と違い | Coelacanth’s Dream
- V_MAC_LEGACY_F32 (replaced by V_FMAC_LEGACY_F32)
- V_MAD_LEGACY_F32 (replaced by V_FMA_LEGACY_F32)
- V_MAC_F32, V_MADMK_F32, V_MADAK_F32 (replaced by FMA equivalents)