HLSL 著色器模型 6.0
描述新增至 HLSL 著色器模型 6.0 的波浪運算內建函式。
著色器模型 6.0
針對先前的著色器模型,HLSL 程式設計只會公開單一執行執行緒。 從模型 6.0 開始,提供了新的波浪層級作業,以明確利用目前 GPU 的平行處理原則 -許多執行緒可以同時在相同核心上執行鎖定步驟。 例如,當同步處理範圍在 SIMD 處理器的寬度內,或是已知彼此相對不可部分完成的一組執行緒時,模型 6.0 內建函式可消除屏障建構。
可能的使用案例包括:資料流程壓縮、縮減、區塊轉置、bitonic 排序或 Fast Fourier Transforms (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
某些作業 (例如位運算子) 只支援整數類型。
詞彙
字詞 | 定義 |
---|---|
車道 | 執行的單一線程。 6.0 版之前的著色器模型只會在語言層級公開其中一個模型,讓擴充完全保持平行 SIMD 處理至實作為止。 |
Wave | 一組 (執行緒) 在處理器中同時執行的通道。 不需要明確的屏障,才能保證它們以平行方式執行。 類似的概念包括「warp」 和 「wavefront」。 |
非使用中通道 | 未執行的通道,例如因為控制流程,或工作不足而無法填滿波的大小下限。 |
Active Lane | 正在執行的通道。 在圖元著色器中,它可能包含任何協助程式圖元通道。 |
四 | 一組 4 個連續的通道,對應到以 2x2 平方排列的圖元。 它們用來藉由差異 x 或 y 來估計漸層。 波可能由多個四邊形組成。 使用中四邊形中的所有圖元都會執行 (,而且可能是「作用中通道」) ,但不會產生可見結果的圖元則稱為「協助程式通道」。 |
協助程式通道 | 只針對圖元著色器四邊形中的漸層用途執行的通道。 這類通道的輸出將會捨棄,因此不會轉譯至目的地介面。 |
網底語言內建
此著色器模型的所有作業都已加入一系列內建函式中。
Wave 查詢
用於查詢單波的內建函式。
內建 | 說明 | 像素著色器 | 計算著色器 |
---|---|---|---|
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 結構的描述和使用方式。