Coelacanth's Dream

HWレイトレーシングをサポートする RDNA APU 「Cyan Skilfish (gfx1013)」

2021/06 に GPUID: gfx1013 のサポート追加する LLVM へのパッチが公開されてから、関連する情報を追い続けてきたが、ある程度集まってくると同時に断片化してきたと感じてきたため、集約し整理した記事を作ることにした。

ここでも最初に一応書くが、AMD GPU ドライバーのコード中では SKILLFISH で統一されているが、パッチタイトルの一部では SKILFISH となっていること、アブラボウズの英名として SKILFISH があることを踏まえて、ここでは SKILFISH で統一している。
コード内では統一されているため問題は起きないし、amd-gfx メーリングリスト内で指摘するメッセージも無いため、どちらが正しいとも言い切れず、またそこまでこだわるような事柄でもないように思える。

Index

gfx1013

まず出てきたのは GPUID: gfx1013 であり、GPUID はその割り当てられた GPU の IPバージョンを表現しており、gfx{major}_{minor}_{stepping} のフォーマットとなっている。
RDNA アーキテクチャ は GFX10.1 (gfx101x) [Major: 10, Minor: 1] を、RDNA 2 アーキテクチャ は GFX10.3 (gfx103x) [Major: 10, Minor: 3] を基本に Stepping で同アーキテクチャを採用する AMD GPU を区別している。
gfx1013 の場合は [Major: 10, Minor: 1, Stepping: 3] となり、GPUID (GFX IP) 的には RDNA アーキテクチャ だと言える。
RDNA/GFX10.1世代に新たな GPUID、gfx1013? | Coelacanth’s Dream

LLVM へのパッチから分かる gfx1013 の特徴としては、RDNA APU であること、対応命令的には Navi10 (gfx1010) をベースにしていること、RDNA 2 アーキテクチャ がサポートしているレイトレーシング命令をサポートしていることが挙げられる。
GPUID: gfx1013 は RDNA/Navi10ベースの APU で、レイトレーシング命令をサポートしている? | Coelacanth’s Dream

Navi10 (gfx1010)Navi12 (gfx1011)/Navi14 (gfx1012) がサポートしている一部ドット積命令 (dot[1,2,5-7]-insts)をサポートせず、gfx1013 も同様にそれら命令をサポートしていないことになっている。

     case GK_GFX1012:
     case GK_GFX1011:
       Features["dot1-insts"] = true;
       Features["dot2-insts"] = true;
       Features["dot5-insts"] = true;
       Features["dot6-insts"] = true;
       Features["dot7-insts"] = true;
       LLVM_FALLTHROUGH;
     case GK_GFX1013:
     case GK_GFX1010:
       Features["dl-insts"] = true;
       Features["ci-insts"] = true;
       Features["flat-address-space"] = true;
       Features["16-bit-insts"] = true;
       Features["dpp"] = true;
       Features["gfx8-insts"] = true;
       Features["gfx9-insts"] = true;
       Features["gfx10-insts"] = true;
       Features["s-memrealtime"] = true;
       Features["s-memtime-inst"] = true;
       break;

パッチでは、レイトレーシング命令 (image_bvh_intersect_ray/image_bvh64_intersect_ray) と、サンプラーを用いずにコンポーネントから最大 4個のサンプルをロードする image_msaa_load サポートの有無を判定する FeatureGFX10_AEncoding が追加されており、それを gfx1013RDNA 2 アーキテクチャ/gfx103x が持つとしている。

 def FeatureISAVersion10_1_3 : FeatureSet<
   !listconcat(FeatureGroup.GFX10_1_Bugs,
     [FeatureGFX10,
      FeatureGFX10_AEncoding,
      FeatureLDSBankCount32,
      FeatureDLInsts,
      FeatureNSAEncoding,
      FeatureWavefrontSize32,
      FeatureScalarStores,
      FeatureScalarAtomics,
      FeatureScalarFlatScratchInsts,
      FeatureGetWaveIdInst,
      FeatureMadMacF32Insts,
      FeatureDsSrc2Insts,
      FeatureLdsMisalignedBug,
      FeatureSupportsXNACK])>;
 def FeatureGFX10_AEncoding : SubtargetFeature<"gfx10_a-encoding",
   "GFX10_AEncoding",
   "true",
   "Has BVH ray tracing instructions"
 >;

RDNA アーキテクチャ を採用する APU であり、Navi10 (gfx1010) をベースに RDNA 2/GFX10.3 世代同様のレイトレーシング命令周りを追加した奇妙な AMD GPU が gfx1013 となる。

RDNA 2 とは異なる HWレイトレーシング IP

オープンソースドライバー等で明らかにされている情報として、AMD GPU の HWレイトレーシング IP には現時点で 2バージョン存在する、というものがある。
現時点で 2バージョン存在する AMD GPU の HWレイトレーシング IP | Coelacanth’s Dream

AMDVLK ドライバーを構成する一部である PAL (Platform Abstraction Library) 内のコードによれば、HWレイトレーシング IPは RtIp1_0RtIp1_1 の 2バージョンが存在し、
RtIp1_0 は最初の実装となり、RtIp1_1 はそこにトライアングルの重心座標 (triangle barycentrics) を処理する機能を追加したものとなる。

 /// Supported RTIP version enumeration
 enum class RayTracingIpLevel : uint32
 {
     _None = 0,
 #ifndef None
     None = _None,      ///< The device does not have an RayTracing Ip Level
 #endif
	
     RtIp1_0 = 0x1,     ///< First Implementation of HW RT
     RtIp1_1 = 0x2,     ///< Added computation of triangle barycentrics into HW
 };

関連するコード部では、RDNA 2/GFX10.3 とそれ以降の AMD GPU では RtIp1_1 を採用するとしている記述が存在し、“RDNA 2” Instruction Set Architecture: Reference Guide でも「8.2.10 Ray Tracing」セクションにて、HWレイトレーシングは重心座標の計算処理を直接サポートするよう設計されていると説明されている。

         if (IsGfx103Plus(pInfo->gfxLevel))
         {
             pInfo->gfx9.rayTracingIp = RayTracingIpLevel::RtIp1_1;
         }

上記引用部の判定から、gfx1013RDNA/GFX10.1 でありながら HWレイトレーシングをサポートしているとすると、RDNA 2/GFX10.3 より前の世代、トライアングルの重心座標の処理機能を持たない RtIp1_0 を採用していると考えられる。

Cyan Skilfish

Cyan Skilfish は 2021/07/20、AMD GPU ドライバーにサポートを追加するパッチが公開された RDNA APU
Linux Kernel に RDNA APU 「Cyan Skilfish」 をサポートするパッチが投稿される | Coelacanth’s Dream

LLVM においては gfx1013 が、AMD GPU ドライバーでは Cyan Skilfish が唯一の RDNA APU であることから関連が考えられていたが、先日投稿された AMDGPU KFD (Kernel Fusion Driver) に、GPUID 情報を追加するパッチにより、2つが確実に結び付けられた。
Cyan Skilfish の GPUID は gfx1013 であり、上で述べた特徴は Cyan Skilfish に適用されることとなる。

  static const struct kfd_device_info cyan_skillfish_device_info = {
  	.asic_family = CHIP_CYAN_SKILLFISH,
  	.asic_name = "cyan_skillfish",
 +	.gfx_version = 100103,
  	.max_pasid_bits = 16,
  	.max_no_of_hqd  = 24,
  	.doorbell_size  = 8,

ディスプレイ出力を持たない 8-Core APU

AMD GPU ドライバーへのパッチから分かる Cyan Skilfish の特徴 というより奇妙な点 を言えば、当パッチでは Cyan Skilfish のディスプレイエンジン/コントローラーとマルチメディアエンジンの IPブロックのサポートが追加されていない。

 +	case CHIP_CYAN_SKILLFISH:
 +		amdgpu_device_ip_block_add(adev, &nv_common_ip_block);
 +                amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);
 +                amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);
 +                if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
 +                        amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block);
 +                amdgpu_device_ip_block_add(adev, &gfx_v10_0_ip_block);
 +                amdgpu_device_ip_block_add(adev, &sdma_v5_0_ip_block);
 +		break;

また、GPU ドライバーであるから APU の CPU側の情報は少ないが、SMU (System Management Unit) に関する部分に Cyan Skilfish が 8-Core APU とする記述が存在する。

 +#define NUMBER_OF_PSTATES		8
 +#define NUMBER_OF_CORES			8
 +typedef enum {
 +	CPU_CORE0 = 0,
 +	CPU_CORE1,
 +	CPU_CORE2,
 +	CPU_CORE3,
 +	CPU_CORE4,
 +	CPU_CORE5,
 +	CPU_CORE6,
 +	CPU_CORE7
 +} CORE_ID_e;

ディスプレイ出力機能を持たない、あるいは想定されておらず、CPU 8-Core を持つ AMD APU。
これに近い存在として AMD 4700S Desktop Kit がいる。

AMD 4700S は GDDR6メモリを採用することからゲーム機 APU をベースにしている可能性が考えられるCPU で、Zen 2 アーキテクチャ 8-Core を持つ。
AMD 4700S の正体は GPU部を無効化したゲーム機向け APU だったか | Coelacanth’s Dream しかし、APU だとしても AMD 4700S Desktop Kit ではディスプレイ出力がボードに実装されておらず、PCIeスロットに搭載した dGPU に頼る必要があり、APU としての GPU部は実質無効化されている。
ディスプレイ出力がボードに実装されておらず、APU の出力機能を活用することができず、CPU 8-Core を搭載する ―― こうした点が Cyan SkilfishAMD 4700S Desktop Kit で共通する。

あくまでもこれは推測であり、AMD 4700Slspci 実行結果でも得られればもう少し近付けるように思うが、信頼できる実行結果が必要となる。自分で購入して確かめるのが手っ取り早いが、入手性とか、未だに構成を更新していないメインマシンを後回しにしてまで買うべきなのかとか、まあ色々問題と葛藤が起こる。