Coelacanth's Dream

現時点で 2バージョン存在する AMD GPU の HWレイトレーシング IP

AMD がオープンソースで開発し、公式的に提供している Vulkanドライバー、AMDVLK の v-2021.Q2.5 がリリースされ、それを構成する LLPC (LLVM-Based Pipeline Compiler)PAL (Platform Abstraction Library)XGL (Vulkan API Layer) が共にアップデートされたが、
その中で AMD GPU が搭載するレイトレーシングハードウェアの IPバージョンが 2種類存在することが新たに明かされた。
レイトレーシングHW は AMD GPU の CU内に、Ray Accelerator という名で搭載されている。1

RT IP 1.0, 1.1

今回 PAL (Platform Abstraction Library) のアップデートで追加された内容によれば、レイトレーシングHW の IP には現時点で、最初の実装となる RtIp1_0 と、そこにトライアングルの重心座標 (triangle barycentrics) を処理する機能を追加した RtIp1_1 が存在するとされる。

 /// 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 とそれ以降の HWレイトレーシング IP が RtIp1_1 だとしている。 (IsGfx103Plus() は処理的には RDNA/GFX10.1 以降の場合に true を返すようになっている2)

このことは “RDNA 2” Instruction Set Architecture: Reference Guide の 「8.2.10 Ray Tracing」セクションでも触れられており、そこでも レイトレーシングHW は重心座標の計算処理を直接サポートするよう設計されていると説明している。

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

そして、RDNA 2/GFX10.3 とそれ以降のレイトレーシングHW が RtIp1_1 だとされていることからは、RDNA 2/GFX10.3 以前は RtIp1_0 を搭載している可能性が示される。
先日、LLVM に追加された GPUID: gfx1013 は、Navi10 (gfx1010) をベースにしながら RDNA 2/GFX10.3 でサポートされているレイトレーシング命令をサポートし、さらには APU という奇妙なものだったが、
GPUID: gfx1013 は APU で、レイトレーシング命令をサポートしている? | Coelacanth’s Dream 今回 PAL に追加された内容と合わせて、 gfx1013 で実装されているレイトレーシングHW RDNA 2/GFX10.3 とは異なると考えられる。
そもそも今回追加された部分は、gfx1013 に関する LLVM の変更に合わせたか、AMD のソフトウェアエンジニアが gfx1013 のサポートに向けて動き始めたことによるものなのかもしれない。

レイトレーシングHW がトライアングルの重心座標を直接する計算する機能の有無がどれだけ影響するかは、正直自分には推し量れないし、IPバージョンの違いが分かってもまだ gfx1013 の正体にはまだ遠いが、わずかでも明らかにされたこと、それを知ることができたことは嬉しい。

参考リンク