D3D Shader/OpenGL」カテゴリーアーカイブ

Direct3D12 GPU と ShaderModel 6.1 の対応状況

Direct3D 12 は Metal や Vulkan と同じ低レベル API に属します。新しい API Set ですが、GPU の世代更新に合わせたというよりも Direct3D 11 世代の再定義に近いものでした。ShaderModel は 5.1 のままで、GPU の新機能対応も当初は 11/12 両方に行われています。

D3D API ShaderModel OS Windows 10
Direct3D 11.0 5.0 Vista/7
Direct3D 11.1 5.0 7/8
Direct3D 11.2 5.0 7/8.1
Direct3D 11.3 5.1 10
Direct3D 11.4 5.1 10 (1511) November Update
Direct3D 12 5.1 10
Direct3D 12 6.0 10 (1607) Anniversary Update
Direct3D 12 6.1 10 (1709) Fall Creators Update
Direct3D 12 6.2 10 (1803) April 2018 Update

Direct3D 11 の Release は Windows 7 と同時ですが、Windows 10 になっても 11.3/11.4 と更新が続いていたことがわかります。しかしながら Windows 10 1607 以降は ShaderModel 6.0 も導入されており、機能面での違いも増えてきたように思います。

コメントで Vega の ShaderModel 6.0 の対応状況について情報を教えていただいたので、あらためてそれぞれの GPU で確認してみました。新しい世代の GPU はいずれも最新ドライバで 6.1 に対応していることがわかりました。

GPU FL SM Driver
GeForce GTX 1070 Pascal 12_1 6.1 397.44
GeForce GTX 960 Maxwell 2 12_1 6.1 398.11
GeForce GTX 750 Ti Maxwell 1 11_0 6.1 398.11
RADEON Vega 56 GCN 5 Vega 12_1 6.1 18.5.1
RADEON RX 480 GCN 4 Polaris 12_0 6.1 18.5.1
RADEON R7 (A10-7870K) GCN 2 (1.1) 12_0 6.1 18.5.1
Intel HD Graphcis 530 (i7-6700K) Gen 9 12_1 6.1 23.20.16.4973

下記は ShaderModel 6.0 の wave 命令の lane 数

GPU min max total
GeForce GTX 1070 Pascal 32 32 30720
GeForce GTX 960 Maxwell 2 32 32 16384
GeForce GTX 750 Ti Maxwell 1 32 32 10240
RADEON Vega 56 GCN 5 Vega 64 64 3584
RADEON RX 480 GCN 4 Polaris 64 64 2304
RADEON R7 (A10-7870K) GCN 2 (1.1) 64 64 512
Intel HD Graphcis 530 (i7-6700K) Gen 9 8 32 768

その他 GPU 毎の対応状況の詳細は下記のページに載せています。

Direct3D 12 (DirectX 12) Windows 詳細

GPU は頂点や Pixel のように大量のデータを扱います。これは並列化が容易なので、CPU の Multi Thread と同じように複数の Shader Core で分散実行しています。

CPU と異なっているのは、一定の Thread Group (wave) 毎に実行する命令 (Instruction) を共有していることです。同じ Instruction で同じ演算を行うという意味では SIMD に近いのですが、各 Thread はそれぞれ単一の Scalar 要素にだけアクセスできるようになっています。これは SIMT と呼ばれています。

例えば 4 並列の SIMT を考えてみると、Thread 0 は SIMD Vector Register の x だけ、Thread 1 は y だけ使って演算を行っていることになります。コード上は Scalar 演算と同等です。

ShaderModel 6.0 の wave 命令では、この Thread 毎の Scalar アクセスの制限が緩和されており、ある程度相互に情報をやり取りできるようになりました。先程の例でいえば、本来 Thread 0 しかアクセスできない x の要素を Thread 1~3 からも参照できることになります。

なお ShaderModel 6.0 からは ShaderCompiler が変更されているようです。5.1 までは fxc.exe (D3DCompiler_47.dll) ですが、6.0 以降は dxc.exe (dxcompiler.dll) を使います。

dxc shader.hlsl -T ps_6_0 -E pmain -Fo shader_ps.bin

dxc でコンパイルした bytecode はそのまま PipelineState (D3D12_GRAPHICS_PIPELINE_STATE_DESC) に渡すことができます。

PS_OUT  pmain( VS_OUT pin )
{
    PS_OUT  pout;
    float2  pos= pin.Position.xy;
    if( WaveIsFirstLane() ){
        pos.x*= 1.0f/500.0f;
        pos.y*= 1.0f/500.0f;
    }
    pos= WaveReadLaneFirst( pos );
    if( WaveIsFirstLane() ){
        pout.Color= float4( 0.0f, 0.0f, 1.0f, 1.0f );
    }else{
        pout.Color= float4( pos.x, pos.y, 0.0f, 1.0f );
    }
    return  pout;
}

少々わかりにくいですが、上の PixelShader で Wave Size (Lane 数) の違いを視覚化してみたものです。同一 Wave を同じカラーで塗りつぶします。

null

↑左から RADEON Vega56, Skylake (Intel HD Graphics 530), GeForce GTX1070

Vega が最も Lane 数が多いので tile の色分けがわかりやすくなっています。真ん中の Intel HD Graphcis が最も細かいことがわかります。

関連エントリ
AMD Vega と Direct3D 12
Direct3D 12 GPU GeForce GTX 1070 Pascal と RADEON RX 480 Polaris

AMD Vega と Direct3D 12

遅くなりましたが DirectX 12 の対応状況に Vega 56 のデータを追加しました。Vega (GCN 5) は FEATURE_LEVEL 12_1 に対応しており、ROV 等 D3D12 の機能を搭載しています。ただし ShaderModel は 5.1 のままでした。

Direct3D 12 (DirectX 12) GPU の対応

GeForce, Intel HD Graphcs のテスト結果も更新しています。新しいドライバでは GeForce の Maxwell, Pascal も ResourceBindingTier が Tier 3 に上がっていることがわかりました。また ShaderModel 6.0 (WaveOps == true) にも対応しているようです。

GPU Driver FeatureLevel ShaderModel
RADEON Vega GCN 5 18.3 12_1 5.1
RADEON RX Polaris GCN 4 18.3 12_0 5.1
RADEON R3/R7/R9 GCN 2 18.2 12_0 5.1
GeForce GTX 1000 Pascal 388.13 12_1 6.0
GeForce GTX 900 Maxwell 388.13 12_1 6.0
GeForce GTX 750Ti Maxwell 388.43 11_0 6.0
Skylake Intel HD Graphcis Gen 9 12_1 6.1
Broadwell Intel HD Graphcis Gen 8 11_1 5.1
Haswell Intel HD Graphcis Gen 7.5 11_1 5.1

Intel HD Graphcis も Skylake 世代からは ShaderModel 6.1 対応となっています。結果は今後ドライバの更新で変わる可能性があります。

関連ページ
Direct3D 12 (DirectX 12) GPU の対応

関連エントリ
Direct3D 12 GPU GeForce GTX 1070 Pascal と RADEON RX 480 Polaris

Direct3D 12 と GeForce GTX 560 Ti (Fermi)

ついに GeForce GTX400/500 (Fermi) 世代の GPU が Direct3D 12 に対応したようです。2年間待ちました。手持ちの GeForce GTX560 Ti で早速プログラムを走らせてみましたが問題なく動いています。

PC Watch: NVIDIAの最新ドライバでFermi世代のGPUがDirectX 12対応に

FeatureLevel は 11_0 なので基本的な機能は Kepler 世代と大きな違いはないようです。ただし ResourceBinding Tire が 1 なので、Shader から一度に参照できるリソースの個数に上限があります。低レベル API のメリットの一つがリソース数制限の撤廃ですが、Tier 1 の場合は D3D11 と変わらないことになります。

詳細は下記ページよりどうぞ。表に GeForce GTX 560 Ti を追加しました。

Direct3D 12 (DirectX 12) Windows 詳細

これで GeForce は Direct3D 11 世代の GPU がすべて DirectX12 対応となりました。なお Fermi は Vulkan には対応していないようです。

Direct3D 11 世代 GPU の対応 API まとめ↓ (Vulkan は Windows の場合のみ)

GPU FL Tier D3D12 Vulkan Metal GL
GeForce GTX 400/500 (Fermi) 11_0 1 Y N N 4.5
GeForce GTX 600/700 (Kepler) 11_0 2 Y Y Y 4.5
GeForce GTX 750 (Maxwell1) 11_0 2 Y Y Y 4.5
GeForce GTX 900 (Maxwell2) 12_1 2 Y Y Y 4.5
GeForce GTX 1000 (Pascal) 12_1 2 Y Y Y 4.5
RADEON HD 5000 11_0 N N N 4.5
RADEON HD 6000 11_0 N N N 4.5
RADEON HD 7000 (GCN 1.0) 11_1 3 Y Y Y 4.5
RADEON Rn 200/300 (GCN 1.1) 12_0 3 Y Y Y 4.5
RADEON R9 285/380 (GCN 1.2) 12_0 3 Y Y Y 4.5
RADEON RX 400/500 (GCN Polaris) 12_0 3 Y Y Y 4.5
Intel HD Graphics (Gen 7) Ivy Bridge 11_0 N N Y 4.0
Intel HD Graphics (Gen 7.5) Haswell 11_1 1 Y N Y 4.3
Intel HD Graphics (Gen 8) Broadwell 11_1 1 Y N Y 4.4
Intel HD Graphics (Gen 9) Skylake 12_1 3 Y Y Y 4.4

・FL = Feature Level

D3D11 世代で D3D12 に対応していない GPU は Intel HD Graphics 4000 系 (Ivy Bridge) と GCN より前の RADEON になります。そもそも D3D12 や Vulkan といった低レベル API の元になっているのは GCN 向けに作られた Mantle なので、AMD の場合は仕方がないともいえます。

GPU ごとの対応 API については、下記のページも参照してください。

GPU 世代対応表

Windows の更新とともに Direct3D 12 にも修正が入っているようです。Creators Update の 1703 では ID3DDevice2 が追加されています。Version の違いをまとめてみました。

Windows Version Windows SDK D3D12Device Interface
Windows 10 1703 10.0.15063.0 ID3D12Device2
Windows 10 1607 10.0.14393.0 ID3D12Device1
Windows 10 1511 10.0.10586.0 ID3D12Device
Windows 10 1507 10.0.10240.0 ID3D12Device

関連エントリ
2015/06/29: Direct3D 12 (DirectX12) GPU と API の対応表
2015/06/26: DirectX 12 (Direct3D 12) と GPU の対応

関連ページ
Direct3D 12 (DirectX 12) Windows 詳細
GPU 世代対応表

AMD CPU Ryzen とコンパイル時間の比較 (2)

他の CPU の結果も追加してみました。

CPU Clock Core/Thread RAM Storage 1回目 2回目
(1) Ryzen 7 1800X (Zen) 3.6GHz 8 / 16 32GB SSD 20分 19分
(2) Core i7-6700K (Skylake) 4.0GHz 4 / 8 32GB SSD 27分 26分
(3) Core i7-4790K (Haswell) 4.0GHz 4 / 8 16GB HDD 39分 32分
(4) A10-7870K (Steamroller) 3.9GHz 4 / 4 16GB SSD 74分 82分
(5) Core i5-3210M (IvyBridge) 2.5GHz 2 / 4 16GB SSD 86分 85分
(6) Athlon 5350 (Jaguar) 2.0GHz 4 / 4 16GB HDD 204分 168分
(7) Celeron N3150 (Airmont) 1.6GHz 4 / 4 16GB HDD 236分 184分

すべて Windows 10 x64。GitHub 版 UE4 4.15.2 のビルド時間の比較です。Development Editor 指定で Unity Build が有効な状態です。二回とも Clean 後に Build しています。2回目はある程度キャッシュに乗った状態を想定しています。1回目、2回目とも数値が小さい方が高速です。

HDD では 1回目と 2回目の差が大きく開いており、(7) では 52分もの差があります。SSD は 1回目と 2回目の差がほぼありません。初回から RAM 上にキャッシュされた状態とほぼ同等のパフォーマンスが出ていることになります。

関連エントリ
AMD CPU Ryzen とコンパイル時間の比較

HTC Vive Tracker (VR)

HTC Vive の Vive Tracker 購入しました。

null

Controller は HMD と Bluetooth で通信しますが、認識出来るのは最大 2個までです。3個目以上は有線で接続する必要がありました。

Vive Tracker には USB ドングルが付属しており、PC と直接無線でも通信できるようになっています。ペアリング操作は Vive Controller と全く一緒です。そのせいか、先に Controller の電源が入っていないと HMD 側にペアリングされてしまうことがあります。

・先に Vive Controller の電源を 2個とも入れておく (Tracker が付属のドングルと対応付けられるように)
・複数の Tracker をペアリングする時は、他の Tracker の USB ドングルを外しておく

Controller と違い形状が安定しており固定しやすくなっています。Base Station でよく使う三脚ネジがそのまま使えます。置いたときに軸が水平になるのも Controller との違いで、位置を合わせやすくなりました。とりあえずクロマキー合成の時の位置検出に活用しています。

関連エントリ
VR 対応 GPU の値段と Vive Controller 置き場
HTC Vive (VR ヘッドマウントディスプレイ) の接続
HTC Vive のセットアップと PC スペック、遅い PC で動くかどうか