HLSL シェーダー モデル 6.0 に追加されたウェーブ演算組み込み関数について説明します。
- シェーダー モデル 6.0
- 用語
-
シェーディング言語の組み込み
- Wave クエリ
- ウェーブ投票
- Wave Broadcast
- ウェーブリダクション
- ウェーブ スキャンとプレフィックス
- クワッド全体のシャッフル操作 を する
- ハードウェア機能の
- 関連トピック
シェーダー モデル 6.0
以前のシェーダー モデルの場合、HLSL プログラミングでは 1 つの実行スレッドのみが公開されます。 モデル 6.0 以降では、現在の GPU の並列処理を明示的に利用するために、新しいウェーブ レベルの操作が提供されます。多くのスレッドは、同じコアのロックステップで同時に実行できます。 たとえば、モデル 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 処理への拡張は実装に完全に任されます。 |
波 | プロセッサで同時に実行されるレーン (スレッド) のセット。 並列で実行されることを保証するために明示的なバリアは必要ありません。 同様の概念には、"warp" と "wavefront" があります。 |
非アクティブレーン | 制御の流れや、ウェーブの最小サイズを埋める作業が不十分な場合など、実行されていないレーン。 |
アクティブ レーン | 実行が実行されているレーン。 ピクセル シェーダーでは、任意のヘルパー ピクセル レーンを含めることができます。 |
クワッド | 2x2 の正方形に配置されたピクセルに対応する 4 つの隣接するレーンのセット。 x または y の差分によってグラデーションを推定するために使用されます。 ウェーブは複数のクワッドで構成される場合があります。 アクティブなクワッド内のすべてのピクセルが実行されますが ("アクティブ レーン" の場合もあります)、表示される結果を生成しないピクセルは "ヘルパー レーン" と呼ばれます。 |
ヘルパー レーン | ピクセル シェーダー クワッドのグラデーションのみを目的として実行されるレーン。 このようなレーンの出力は破棄されるため、宛先サーフェスにはレンダリングされません。 |
シェーディング言語の組み込み関数
このシェーダー モデルのすべての操作は、組み込み関数の範囲に追加されています。
Wave クエリ
1 つのウェーブに対してクエリを実行するための組み込み関数。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
WaveGetLaneCount | 現在のウェーブ内のレーンの数を返します。 | * | * |
WaveGetLaneIndexの | 現在のウェーブ内の現在のレーンのインデックスを返します。 | * | * |
WaveIsFirstLane | インデックスが最も小さい現在のウェーブ内のアクティブ レーンに対してのみ true を返します。 | * | * |
ウェーブ投票
この組み込み関数のセットは、現在のウェーブから現在アクティブなスレッド間で値を比較します。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
WaveActiveAnyTrue | 現在のウェーブ内のアクティブなレーンで式が true の場合は true を返します。 | * | * |
WaveActiveAllTrue | 現在のウェーブ内のすべてのアクティブなレーンで式が true の場合は true を返します。 | * | * |
WaveActiveBallot | 指定したウェーブ内のすべてのアクティブ レーンに対するブール式の評価の 64 ビット符号なし整数ビットマスクを返します。 | * | * |
Wave Broadcast
これらの組み込み関数を使用すると、現在のウェーブ内のすべてのアクティブなレーンが、指定されたレーンから値を受信し、効果的にブロードキャストできます。 無効なレーンからの戻り値は未定義です。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
WaveReadLaneAt | 指定したウェーブ内の指定されたレーン インデックスの式の値を返します。 | * | * |
WaveReadLaneFirstの | インデックスが最も小さい現在のウェーブのアクティブ レーンの式の値を返します。 | * | * |
ウェーブリダクション
これらの組み込み関数は、ウェーブ内のすべてのアクティブ レーンにわたって指定された操作を計算し、最終的な結果をすべてのアクティブ レーンにブロードキャストします。 したがって、最終的な出力はウェーブ全体で均一であることが保証されます。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
WaveActiveAllEqual | 式が現在のウェーブ内のすべてのアクティブレーンで同じ (したがって、その間で均一である) 場合は true を返します。 | * | * |
WaveActiveBitAnd | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの AND を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveBitOr | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの OR を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveBitXor | 現在のウェーブ内のすべてのアクティブなレーンにわたって式のすべての値のビットごとの排他 OR を返し、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
WaveActiveCountBits | 現在のウェーブ内のすべてのアクティブレーンで true と評価されるブール変数の数をカウントし、ウェーブ内のすべてのレーンに結果をレプリケートします。 | * | * |
WaveActiveMax | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の最大値を計算し、ウェーブ内のすべてのレーンに結果をレプリケートします。 | * | * |
WaveActiveMin | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の最小値を計算し、ウェーブ内のすべてのレーンに結果をレプリケートします。 | * | * |
WaveActiveProduct | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の値を乗算し、ウェーブ内のすべてのレーンに結果をレプリケートします。 | * | * |
WaveActiveSum | 現在のウェーブ内のすべてのアクティブなレーンにわたって式の値を合計し、現在のウェーブ内のすべてのレーンにレプリケートし、結果をウェーブ内のすべてのレーンにレプリケートします。 | * | * |
ウェーブ スキャンとプレフィックス
これらの組み込み関数は、各レーンに操作を適用し、計算の各部分的な結果を対応するレーンに残します。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
WavePrefixCountBits | 現在のレーンより小さいインデックスを持つすべてのアクティブレーンで true に設定されたすべての指定されたブール変数の合計を返します。 | * | * |
WavePrefixSum | アクティブ レーン内のすべての値の合計を、この値より小さいインデックスで返します。 | * | * |
WavePrefixProduct | 指定されたウェーブの前にあるレーン内のすべての値の積を返します。 | * | * |
クワッド全体のシャッフル操作
これらの組み込み関数は、ここで定義されているピクセル シェーダー クワッドを含むことがわかっているウェーブ全体の値に対してスワップ操作を実行します。 クワッド内のピクセルのインデックスは、スキャンラインまたは読み取り順で定義されます。クワッド内の座標は次のとおりです。
+---------> X
|[0] [1]
|[2] [3]
v
Y
これらのルーチンは、計算シェーダーまたはピクセル シェーダーのいずれかで機能します。 コンピューティング シェーダーでは、SIMD ウェーブ内で均等に分割された 4 つのグループとして定義されたクワッドで動作します。 ピクセル シェーダーでは、WaveQuadLanes によってキャプチャされたウェーブで使用する必要があります。それ以外の場合、結果は未定義です。
組み込み | 説明 | ピクセル シェーダー の | コンピューティング シェーダー の |
---|---|---|---|
QuadReadLaneAt | quadLaneID [0..3] で識別される現在のクワッドのレーンから読み取られた指定されたソース値を返します。この値は、クワッド全体で均一である必要があります。 | * | |
QuadReadAcrossDiagonalの | このクワッド内の斜め反対側のレーンから読み取られた、指定されたローカル値を返します。 | * | |
QuadReadAcrossX | このクワッドの他のレーンから X 方向に読み取られた指定されたソース値を返します。 | * | |
QuadReadAcrossY | このクワッド内の他のレーンから Y 方向に読み取られた指定されたソース値を返します。 | * |
ハードウェア機能
ウェーブ操作機能が特定のハードウェアで使用可能であることを確認するには、ID3D12Device::CheckFeatureSupport呼び出し、D3D12_FEATURE_DATA_D3D12_OPTIONS1 構造の説明と使用に関する説明に記載します。
関連トピック
- HLSL の プログラミング ガイド
- シェーダー モデル 6 組み込み