LLVM において GFX11 で有効化あるいはサポートされる機能のメモ。
Automatically Release VGPRs
AMDGPU からホスト CPU にメッセージ (割り込み) を送信する命令として S_SENDMSG
があるが、GFX11 ではメッセージの種類に新しく MSG_DEALLOC_VGPRS
をサポートする。
AMD の Jay Foad 氏により LLVM にパッチが投稿されている。
MSG_DEALLOC_VGPRS
はシェーダーの VGPR (ベクタレジスタ、Vector general-purpose register) の解放に使用できる。
通常はシェーダーの最後に呼ばれる S_ENDPGM
命令で VGPR が解放されるが、S_ENDPGM
の前に MSG_DEALLOC_VGPRS
を送信することで、S_ENDPGM
の段で VMEM (Vector Memory) への Store 処理の完了を待機する必要がある場合に、MSG_DEALLOC_VGPRS
によって先に VGPR を解放できるため、システム全体のパフォーマンスが向上するとしている。
S_PACK_HL
GFX11 では SALU (Scalar ALU) がサポートする命令に S_PACK_HL
が追加される。
S_PACK
系の命令では 2つのソースレジスタの上位 (H, High) 16-bit か下位 (Low, L) 16-bit をそれぞれ指定して、1つのレジスタに詰め込む (パック) する。
RDNA 2/GFX10.3 世代では S_PACK_{LL,LH,HH}
をサポートしており、GFX11 世代でサポートしていなかった S_PACK_HL
が追加される形となる。
+ /// Return true if the target has the S_PACK_HL_B32_B16 instruction. + bool hasSPackHL() const { return GFX11Insts; }
Cluster stores
これまで AMDGPU 向けには Cluster loads のみが有効化されていたが、GFX11 では Cluster stores も有効化される。
- [AMDGPU] gfx11 subtarget features & early tests · llvm/llvm-project@18ed279
- ⚙ D128517 [AMDGPU] Cluster stores as well as loads for GFX11
+ + // \returns true if it's beneficial on this subtarget for the scheduler to + // cluster stores as well as loads. + bool shouldClusterStores() const { return getGeneration() >= GFX11; }
Cluster loads/stores は LLVM側のスケジューリングに関する機能であり、レジスタ使用量を増やすことで、キャッシュ効率の向上、Load/Store 命令後のスケジューリングにおける自由度の向上を目的とした機能と思われる。
Cluster stores は一度 AMDGPU 向けに有効化されたが1、利点がほとんど無いとして、その後に無効化された経緯がある。2
その時 AMD の Jay Foad 氏は、Cluster loads はキャッシングにおける利点があるが、Cluster stores はレジスタプレッシャーによりスケジューリングの自由度が下がる傾向にあると語っている。
詳細はまだ不明だが、GFX11 では Load/Store 周りに何かしらの改良が加えられたものと思われる。
Cluster stores を無効化するパッチは 2020/08/07 に投稿されており、GFX11 で再度有効化される背景には SW開発チームから HW開発チームへのフィードバックがあったのかもしれない。