HLSL シェーダー モデル 6.0
HLSL シェーダー モデル 6.0 に追加されたウェーブ操作の組み込みについて説明します。
シェーダー モデル 6.0
以前のシェーダー モデルの場合、HLSL プログラミングでは 1 つの実行スレッドのみが公開されます。 現在の GPU の並列処理を明示的に利用するために、モデル 6.0 以降の新しいウェーブ レベル操作が提供されます。多くのスレッドは、同じコアのロックステップで同時に実行できます。 たとえば、モデル 6.0 の組み込みでは、同期のスコープが SIMD プロセッサの幅内にある場合、または相互に対してアトミックであることが知られている他のスレッドのセットがバリア コンストラクトを排除できます。
潜在的なユース ケースとしては、ストリーム圧縮、削減、ブロックの転置、ビットニック並べ替えまたは高速フーリエ変換 (FFT)、ビン分割、ストリーム重複除去、同様のシナリオなどがあります。
ほとんどの組み込み関数はピクセル シェーダーとコンピューティング シェーダーに表示されますが、いくつかの例外があります (各関数に関する説明)。 関数は、API レベル 12 の DirectX 機能レベル 12.0 の要件に追加されています。
これらの関数の型>パラメーターと戻り値は<式の型を意味します。サポートされている型は、アプリのターゲット シェーダー モデルにも存在する次の一覧の型です。
- half、half2、half3、half4
- float、float2、float3、float4
- double、double2、double3、double4
- int、int2、int3、int4
- uint、uint2、uint3、uint4
- short、short2、short3、short4
- ushort、ushort2、ushort3、ushort4
- uint64_t、uint64_t2、uint64_t3、uint64_t4
一部の操作 (ビット演算子など) では、整数型のみがサポートされます。
用語
用語 | 定義 |
---|---|
レーン | 1 つの実行スレッド。 バージョン 6.0 より前のシェーダー モデルでは、これらのうちの 1 つだけが言語レベルで公開されるため、並列 SIMD 処理への拡張は実装に完全に任されます。 |
Wave | プロセッサで同時に実行される一連のレーン (スレッド)。 並列実行を保証するために明示的なバリアは必要ありません。 同様の概念には、"反り" と "波面" が含まれます。 |
非アクティブレーン | たとえば、制御の流れのために実行されていないレーン、または波の最小サイズを埋めるのに不十分な作業。 |
アクティブ レーン | 実行が実行されているレーン。 ピクセル シェーダーでは、任意のヘルパー ピクセル レーンを含めることができます。 |
四角形 | 2 x 2 の正方形に配置されたピクセルに対応する 4 つの隣接するレーンのセット。 x または y の差分によってグラデーションを推定するために使用されます。 波は複数のクワッドで構成される場合があります。 アクティブなクワッド内のすべてのピクセルが実行されますが ("アクティブ レーン" の場合もあります)、表示される結果が生成されないピクセルは "ヘルパー レーン" と呼ばれます。 |
ヘルパー レーン | ピクセル シェーダー の四角形のグラデーションのみを目的として実行されるレーン。 このようなレーンの出力は破棄されるため、宛先サーフェスにはレンダリングされません。 |
網かけ言語の組み込み
このシェーダー モデルのすべての操作は、さまざまな組み込み関数に追加されています。
Wave クエリ
1 つのウェーブに対してクエリを実行するための組み込み。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
WaveGetLaneCount | 現在のウェーブ内のレーンの数を返します。 | * | * |
WaveGetLaneIndex | 現在のウェーブ内の現在のレーンのインデックスを返します。 | * | * |
WaveIsFirstLane | インデックスが最も小さい現在の波のアクティブ なレーンに対してのみ true を返します | * | * |
ウェーブ投票
この組み込みのセットは、現在のウェーブから現在アクティブなスレッド間で値を比較します。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
WaveActiveAnyTrue | 現在のウェーブ内のアクティブなレーンで式が true の場合は true を返します。 | * | * |
WaveActiveAllTrue | 現在のウェーブ内のすべてのアクティブなレーンで式が true の場合は true を返します。 | * | * |
WaveActiveBallot | 指定したウェーブ内のすべてのアクティブ レーンに対するブール式の評価の 64 ビット符号なし整数ビットマスクを返します。 | * | * |
Wave ブロードキャスト
これらの組み込みにより、現在のウェーブ内のすべてのアクティブ なレーンが、指定したレーンから値を受信し、効果的にブロードキャストできるようになります。 無効なレーンからの戻り値は未定義です。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
WaveReadLaneAt | 指定したウェーブ内の指定されたレーン インデックスの式の値を返します。 | * | * |
WaveReadLaneFirst | インデックスが最も小さい現在のウェーブのアクティブ レーンの式の値を返します。 | * | * |
波の減少
これらの組み込み関数は、ウェーブ内のすべてのアクティブ レーンにわたって指定された操作を計算し、最終的な結果をすべてのアクティブ なレーンにブロードキャストします。 したがって、最終的な出力は波間で均一であることが保証されます。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
WaveActiveAllEqual | 式が現在の波のすべてのアクティブなレーンで同じ (したがって、その間で均一である) 場合は true を返します。 | * | * |
WaveActiveBitAnd | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの AND を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveBitOr | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの OR を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveBitXor | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの排他 OR を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveCountBits | 現在のウェーブ内のすべてのアクティブなレーンで true と評価されるブール変数の数をカウントし、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveMax | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の最大値を計算し、その結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveMin | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の最小値を計算し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveProduct | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の値を乗算し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveSum | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の値を合計し、現在のウェーブ内のすべてのレーンにレプリケートし、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
Wave スキャンとプレフィックス
これらの組み込み関数は、各レーンに演算を適用し、計算の各部分的な結果を対応するレーンに残します。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
WavePrefixCountBits | 現在のレーンより小さいインデックスを持つすべてのアクティブなレーンで true に設定されたすべての指定されたブール変数の合計を返します。 | * | * |
WavePrefixSum | この値より小さいインデックスを持つアクティブなレーン内のすべての値の合計を返します。 | * | * |
WavePrefixProduct | 指定したウェーブの前のレーン内のすべての値の積を返します。 | * | * |
Quad-wide シャッフル操作
これらの組み込み関数は、ここで定義されているピクセル シェーダー クワッドを含むことがわかっているウェーブ全体の値に対してスワップ操作を実行します。 四角形内のピクセルのインデックスは、スキャンラインまたは読み取り順で定義されます。クワッド内の座標は次のとおりです。
+---------> X
|[0] [1]
|[2] [3]
v
Y
これらのルーチンは、コンピューティング シェーダーまたはピクセル シェーダーのいずれかで機能します。 コンピューティング シェーダーでは、SIMD ウェーブ内で 4 の均等に分割されたグループとして定義されたクワッドで動作します。 ピクセル シェーダーでは、WaveQuadLanes によってキャプチャされたウェーブで使用する必要があります。それ以外の場合、結果は未定義です。
Intrinsic | 説明 | ピクセル シェーダー | コンピューティング シェーダー |
---|---|---|---|
QuadReadLaneAt | quadLaneID [0..3] で識別される現在のクワッドのレーンから読み取られた指定されたソース値を返します。これは、四角形全体で均一である必要があります。 | * | |
QuadReadAcrossDiagonal | この四角形の対角線の反対側のレーンから読み取られた、指定されたローカル値を返します。 | * | |
QuadReadAcrossX | この四角形の他のレーンから X 方向に読み取られた指定されたソース値を返します。 | * | |
QuadReadAcrossY | この四角形のもう一方のレーンから Y 方向に読み取られた指定されたソース値を返します。 | * |
ハードウェア機能
ウェーブ操作機能が特定のハードウェアで使用可能であることをチェックするには、ID3D12Device::CheckFeatureSupport を呼び出し、D3D12_FEATURE_DATA_D3D12_OPTIONS1構造の説明と使用に関する説明を書き出します。