Coelacanth's Dream

新たな CDNA系の GPUID 「gfx940」

AMDGPU におけるコンパイラバックエンドとしても採用されている LLVM に、新たな Target/GPU/GFX ID、gfx940 を追加するパッチが投稿されている。

ISA として gfx90agfx90a/CDNA 2/Aldebaran とほぼ一致し、その特徴である 行列演算命令 MFMA (Matrix-Fused-Multiply-Add) やフルレートFP64演算 (FullRate64Ops)、パックドFP32演算 (FeaturePackedFP32Ops) をサポートしている。
そのことから、gfx940 は CDNA系列の GPU を示す Target/GPU/GFX ID と考えられる。
CPU+GPU のメモリ空間統合に関係する XNACK 機能も同様にサポートされている。

今回 gfx940 のサポート追加にあたって新しい命令、機能は現時点で追加されておらず、またコードコメントでも gfx940gfx90a の派生 (derivation) と語られている。
GPU としては、コア部やメモリの規模、I/O部の改良がメインになるのではないかと思われる。

   // GFX940 is a derivation to GFX90A. hasGFX940Insts() being true implies that
   // hasGFX90AInsts is also true.
   bool hasGFX940Insts() const { return GFX940Insts; }

それ以外では、gfx940 は dGPU とし、Vega20/gfx906 からサポートされている SRAMECC 機能、Aldebaran/gfx90a からの TgSplit 機能もサポートしている。

 +     ``gfx940``                  ``amdgcn``   dGPU  - sramecc         - Architected                   *TBA*
 +                                                    - tgsplit           flat
 +                                                    - xnack             scratch                       .. TODO::
 +                                                                      - Packed
 +                                                                        work-item                       Add product
 +                                                                        IDs                             names.
 +

gfx90agfx940 がサポートする機能の差分が以下。
主要な命令、機能としては FeatureMadMacF32Insts が削除され、FeatureArchitectedFlatScratch が追加されている。
FeatureMadMacF32InstsV_MAD_F32/V_MAC_F32/V_MADAK_F32/V_MADMK_F32 命令をサポートすることを示す機能フラグとなる。1 それら命令は RDNA 2/GFX10.3 世代ではサポートされておらず、より丸め誤差、ULP (Unit of Last Place) が小さい V_FMA_F32 命令に置き換えられた。
RadeonSIドライバーに FMA32命令を強制するオプションが追加 | Coelacanth’s Dream gfx90a ではまだサポートが残されていたが、FeatureMadMacF32Insts が削除されたことから gfx940 では RDNA 2/GFX10.3 に揃えたと見られる。
他にも gfx940 は、RDNA系アーキテクチャ では RDNA 1/GFX10.1 から対応していた、ソースオペランドの 1つに定数を用いる V_FMAMK_F32/V_FMAAK_F32 に対応する。2

 def FeatureISAVersion9_0_A : FeatureSe |  def FeatureISAVersion9_4_0 : FeatureSe
   [FeatureGFX9,                             [FeatureGFX9,
    FeatureGFX90AInsts,                       FeatureGFX90AInsts,
                                        >     FeatureGFX940Insts,
    FeatureFmaMixInsts,                       FeatureFmaMixInsts,
    FeatureLDSBankCount32,                    FeatureLDSBankCount32,
    FeatureDLInsts,                           FeatureDLInsts,
    FeatureDot1Insts,                         FeatureDot1Insts,
    FeatureDot2Insts,                         FeatureDot2Insts,
    FeatureDot3Insts,                         FeatureDot3Insts,
    FeatureDot4Insts,                         FeatureDot4Insts,
    FeatureDot5Insts,                         FeatureDot5Insts,
    FeatureDot6Insts,                         FeatureDot6Insts,
    FeatureDot7Insts,                         FeatureDot7Insts,
    Feature64BitDPP,                          Feature64BitDPP,
    FeaturePackedFP32Ops,                     FeaturePackedFP32Ops,
    FeatureMAIInsts,                          FeatureMAIInsts,
    FeaturePkFmacF16Inst,                     FeaturePkFmacF16Inst,
    FeatureAtomicFaddInsts,                   FeatureAtomicFaddInsts,
    FeatureMadMacF32Insts,              <
    FeatureSupportsSRAMECC,                   FeatureSupportsSRAMECC,
    FeaturePackedTID,                         FeaturePackedTID,
                                        >     FeatureArchitectedFlatScratch,
    FullRate64Ops]>;                          FullRate64Ops]>;

ほとんど余談だが、これまで GFX9/Vega 世代では Target/GPU/GFX ID ({Major}.{Minor}.{Stepping}) を、Stepping ver を刻む形で更新し割り当ててきたが、今回で初めて Minor ver が更新された。
RDNA/GFX10 世代では Minor ver に、RDNA 1 では 1 (GFX10.1.x)、RDNA 2 では 3 (GFX10.3.x) を割り当てる形で活用しているため、そうした面も RDNA/GFX10 世代に合わせたのだろうか。

参考リンク