HLSL シェーダー モデル 6.0

HLSL シェーダー モデル 6.0 に追加されたウェーブ演算組み込み関数について説明します。

シェーダー モデル 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 現在のウェーブのすべてのアクティブ レーンにおけるブール式の評価結果を表すビットマスクを含む uint4 を返します。 * *

ウェーブ配信

これらの組み込み関数を使用すると、現在のウェーブ内のすべてのアクティブなレーンが、指定されたレーンから値を受信し、効果的にブロードキャストできます。 無効なレーンからの戻り値は未定義です。

固有 説明 ピクセル シェーダー コンピュート シェーダー
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

シェーダー モデル 6.0 では、これらのルーチンはピクセル シェーダーと計算シェーダーで使用できます。 ピクセル シェーダーでは、WaveQuadLanes によってキャプチャされたウェーブで使用する必要があります。それ以外の場合、結果は未定義です。 シェーダー モデル 6.0 から 6.5 をターゲットとするコンピューティング シェーダーでは、スレッドからクワッドへのマッピングは実装に依存します。 シェーダー モデル 6.6 では、シェーダーのスレッド グループ ディメンションの観点からクワッド レイアウトを定義し、増幅シェーダーとメッシュ シェーダーでこれらのルーチンのサポートを追加します。

固有 説明 ピクセル シェーダー コンピュート シェーダー 増幅シェーダー メッシュ シェーダー
QuadReadLaneAt quadLaneID [0..3] で識別される現在のクワッドのレーンから読み取られた指定されたソース値を返します。この値は、クワッド全体で均一である必要があります。 * * SM 6.6が必要 SM 6.6 が必要
QuadReadAcrossDiagonal このクワッド内の斜め反対側のレーンから読み取られた、指定されたローカル値を返します。 * * SM 6.6 が必要 SM 6.6 が必要です
QuadReadAcrossX このクワッドの他のレーンから X 方向に読み取られた指定されたソース値を返します。 * * SM 6.6 が必要 SM 6.6 が必要
QuadReadAcrossY このクワッド内の他のレーンから Y 方向に読み取られた指定されたソース値を返します。 * * SM 6.6 が必要 SM 6.6 が必要です

ハードウェア機能

ウェーブ操作機能が特定のハードウェアで使用可能かどうかを確認するには、ID3D12Device::CheckFeatureSupport を呼び出し、D3D12_FEATURE_DATA_D3D12_OPTIONS1 構造体の説明と使用方法に留意してください。