Model cieniowania HLSL 6.0
Opisuje funkcje wewnętrzne operacji falowej dodane do modelu cieniowania HLSL 6.0.
- model cieniowania 6.0
- Terminologia
- Funkcje wewnętrzne języka cieniowania
- możliwości sprzętu
- Tematy pokrewne
Model cieniowania 6.0
W przypadku wcześniejszych modeli cieniowania programowanie HLSL uwidacznia tylko jeden wątek wykonywania. Dostępne są nowe operacje na poziomie fal, począwszy od modelu 6.0, aby jawnie wykorzystać równoległość bieżących procesorów GPU — wiele wątków może być wykonywanych w ramach blokady na tym samym rdzeniu jednocześnie. Na przykład model 6.0 funkcje wewnętrzne umożliwiają eliminację konstrukcji barierowych, gdy zakres synchronizacji mieści się w szerokości procesora SIMD lub jakiś inny zestaw wątków, które są znane jako niepodzielne względem siebie.
Potencjalne przypadki użycia obejmują: kompaktowanie strumienia, redukcje, transponowanie bloków, sortowanie bitowe lub przekształcenia Fast Fourier (FFT), kwantowanie, deduplikowanie strumienia i podobne scenariusze.
Większość funkcji wewnętrznych występuje w cieniowaniach pikseli i cieniowaniach obliczeniowych, chociaż istnieją pewne wyjątki (zanotowane dla każdej funkcji). Funkcje zostały dodane do wymagań dotyczących poziomu funkcji DirectX 12.0 w obszarze Poziom 12 interfejsu API.
Typ <> parametru i wartość zwracana dla tych funkcji oznacza typ wyrażenia, obsługiwane typy to te z poniższej listy, które są również obecne w docelowym modelu cieniowania dla aplikacji:
- połowa, połowa2, połowa3, połowa4
- 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
Niektóre operacje (takie jak operatory bitowe) obsługują tylko typy całkowite.
Terminologia
terminów | definicji |
---|---|
Alejka | Pojedynczy wątek wykonywania. Modele cieniowania przed wersją 6.0 uwidaczniają tylko jeden z nich na poziomie języka, pozostawiając rozszerzenie do równoległego przetwarzania SIMD w całości do implementacji. |
Fala | Zestaw pasów ruchu (wątków) wykonywanych jednocześnie w procesorze. Nie są wymagane żadne jawne bariery w celu zagwarantowania, że są wykonywane równolegle. Podobne pojęcia obejmują "warp" i "wavefront". |
Nieaktywny pas ruchu | Pas ruchu, który nie jest wykonywany, na przykład ze względu na przepływ sterowania lub niewystarczającą pracę, aby wypełnić minimalny rozmiar fali. |
Aktywny pas ruchu | Pas ruchu, dla którego jest wykonywane wykonywanie. W cieniowaniach pikseli może zawierać wszelkie pasy pikseli pomocnika. |
Quad | Zestaw 4 sąsiednich pasów odpowiadających pikselom rozmieszczonym w powierzchni 2x2 kwadratu. Są one używane do szacowania gradientów przez różnice w x lub y. Fala może składać się z wielu czworokątów. Wszystkie piksele w aktywnym czworokącie są wykonywane (i mogą być "Aktywne pasy ruchu"), ale te, które nie generują widocznych wyników, są określane jako "Pomocnik pasy ruchu". |
Pas pomocy | Pas pasa, który jest wykonywany wyłącznie w celu gradientów w czworokątach cieniowania pikseli. Dane wyjściowe takiego pasa zostaną odrzucone, a więc nie będą renderowane na powierzchni docelowej. |
Funkcje wewnętrzne języka cieniowania
Wszystkie operacje tego modelu cieniowania zostały dodane w wielu funkcjach wewnętrznych.
Kwerenda falowa
Funkcje wewnętrzne służące do wykonywania zapytań o jedną falę.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
WaveGetLaneCount | Zwraca liczbę pasów ruchu w bieżącej fali. | * | * |
WaveGetLaneIndex | Zwraca indeks bieżącego pasa ruchu w bieżącej fali. | * | * |
WaveIsFirstLane | Zwraca wartość true tylko dla aktywnego pasa ruchu w bieżącej fali z najmniejszym indeksem | * | * |
Głosowanie falowe
Ten zestaw funkcji wewnętrznych porównuje wartości między wątkami aktualnie aktywnymi z bieżącej fali.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
WaveActiveAnyTrue | Zwraca wartość true, jeśli wyrażenie ma wartość true w dowolnym aktywnym pasie ruchu w bieżącej fali. | * | * |
WaveActiveAllTrue | Zwraca wartość true, jeśli wyrażenie ma wartość true we wszystkich aktywnych pasach ruchu w bieżącej fali. | * | * |
WaveActiveBallot | Zwraca 64-bitową niepodpisaną maskę bitów całkowitą oceny wyrażenia logicznego dla wszystkich aktywnych pasów ruchu w określonej fali. | * | * |
Emisja falowa
Te funkcje wewnętrzne umożliwiają wszystkie aktywne pasy ruchu w bieżącej fali, aby odbierać wartość z określonego pasa ruchu, skutecznie rozgłaszać go. Wartość zwracana z nieprawidłowego pasa ruchu jest niezdefiniowana.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
WaveReadLaneAt | Zwraca wartość wyrażenia dla danego indeksu pasa ruchu w określonej fali. | * | * |
WaveReadLaneFirst | Zwraca wartość wyrażenia dla aktywnego pasa bieżącej fali z najmniejszym indeksem. | * | * |
Redukcja fali
Te funkcje wewnętrzne obliczają określoną operację we wszystkich aktywnych pasach ruchu w fali i emitować wynik końcowy do wszystkich aktywnych pasów ruchu. W związku z tym ostateczne dane wyjściowe są gwarantowane równomiernie na całej fali.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
WaveActiveAllEqual | Zwraca wartość true, jeśli wyrażenie jest takie samo dla każdego aktywnego pasa ruchu w bieżącej fali (a tym samym jednolite w poprzek). | * | * |
WaveActiveBitAnd | Zwraca bitową wartość AND wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveBitOr | Zwraca bitowy or wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveBitXor | Zwraca bitowy wyłączny OR wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveCountBits | Zlicza zmienne logiczne, które mają wartość true we wszystkich aktywnych pasach ruchu w bieżącej fali, i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveMax | Oblicza maksymalną wartość wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveMin | Oblicza minimalną wartość wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveProduct | Mnoży wartości wyrażenia razem we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
WaveActiveSum | Sumuje wartość wyrażenia dla wszystkich aktywnych pasów ruchu w bieżącej fali i replikuje ją do wszystkich pasów w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. | * | * |
Skanowanie falowe i prefiks
Te funkcje wewnętrzne stosują operację do każdego pasa ruchu i pozostawiają każdy częściowy wynik obliczeń w odpowiednim pasie ruchu.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
WavePrefixCountBits | Zwraca sumę wszystkich określonych zmiennych logicznych ustawionych na wartość true we wszystkich aktywnych pasach ruchu z indeksami mniejszymi niż bieżący pas ruchu. | * | * |
WavePrefixSum | Zwraca sumę wszystkich wartości w aktywnych pasach ruchu z mniejszymi indeksami niż ten. | * | * |
WavePrefixProduct | Zwraca iloczyn wszystkich wartości w pasach ruchu przed tą jedną z określonej fali. | * | * |
Czterowymiarowe operacje shuffle
Te funkcje wewnętrzne wykonują operacje zamiany na wartościach na fali znanej, że zawierają czworokąta cieniowania pikseli zgodnie z definicją w tym miejscu. Indeksy pikseli w czworokącie są definiowane w kolejności skanowania lub odczytu — gdzie współrzędne w czworokącie to:
+---------> X
| [0] [1]
| [2] [3]
v
Y
Te procedury działają w cieniowaniach obliczeniowych lub cieniowania pikseli. W cieniowaniach obliczeniowych działają w czworokątach zdefiniowanych jako równomiernie podzielone grupy 4 w ramach fali SIMD. W cieniowaniach pikseli powinny być używane na falach przechwytywanych przez WaveQuadLanes, w przeciwnym razie wyniki są niezdefiniowane.
wewnętrzna | opis | cieniowania pikseli | cieniowania zasobów obliczeniowych |
---|---|---|---|
QuadReadLaneAt | Zwraca określoną wartość źródłową odczytaną z pasa bieżącego czworokąta zidentyfikowanego przez quadLaneID [0..3], który musi być jednolity na czworokącie. | * | |
QuadReadAcrossDiagonal | Zwraca określoną wartość lokalną odczytaną z ukośnego pasa ruchu w tym czworokącie. | * | |
QuadReadAcrossX | Zwraca określoną wartość źródłową odczytaną z drugiego pasa ruchu w tym czworokącie w kierunku X. | * | |
QuadReadAcrossY | Zwraca określoną wartość źródłową odczytaną z innego pasa ruchu w tym czworokącie w kierunku Y. | * |
Możliwości sprzętowe
Aby sprawdzić, czy funkcje operacji falowych są dostępne na dowolnym konkretnym sprzęcie, wywołaj metodę ID3D12Device::CheckFeatureSupport, zwracając uwagi na opis i użycie struktury D3D12_FEATURE_DATA_D3D12_OPTIONS1.
Tematy pokrewne
- Przewodnik programowania dla HLSL
- funkcje wewnętrzne Shader Model 6