2018/06/18
Direct3D12 GPU と ShaderModel 6.1 の対応状況
Direct3D 12 は Metal や Vulkan と同じ低レベル API に属します。新しい API Set ですが、GPU の世代更新に合わせたというよりも Direct3D 11 世代の再定義に近いものでした。ShaderModel は 5.1 のままで、GPU の新機能対応も当初は 11/12 両方に行われています。
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 に対応していることがわかりました。
下記は ShaderModel 6.0 の wave 命令の lane 数
その他 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 でコンパイルした bytecode はそのまま PipelineState (D3D12_GRAPHICS_PIPELINE_STATE_DESC) に渡すことができます。
少々わかりにくいですが、上の PixelShader で Wave Size (Lane 数) の違いを視覚化してみたものです。同一 Wave を同じカラーで塗りつぶします。

↑左から 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
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;
}
{
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 を同じカラーで塗りつぶします。

↑左から 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
2018/05/06
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) にも対応しているようです。
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 (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
2017/07/08
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 の場合のみ)
・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 の違いをまとめてみました。
関連エントリ
・2015/06/29: Direct3D 12 (DirectX12) GPU と API の対応表
・2015/06/26: DirectX 12 (Direct3D 12) と GPU の対応
関連ページ
・Direct3D 12 (DirectX 12) Windows 詳細
・GPU 世代対応表
・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 |
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 世代対応表
2017/06/01
AMD CPU Ryzen とコンパイル時間の比較 (2)
他の CPU の結果も追加してみました。
すべて 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 とコンパイル時間の比較
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 とコンパイル時間の比較
2017/05/31
HTC Vive Tracker (VR)
HTC Vive の Vive Tracker 購入しました。

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 で動くかどうか

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 で動くかどうか
| 次のページ(日付が古い方向)>>