Coelacanth's Dream

AMD、RDNA 2 ISA Reference Guide を公開

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 から対応しており、Navi12Navi14 も対応していた。
その中で 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)

参考リンク