Obsługa wbudowanych funkcji DP4a w WGSL
DP4a (dot product of 4 elements and accumulate) to zestaw instrukcji GPU często używany w inferencji głębokiego uczenia się do kwantowania. Efektywnie wykonuje 8-bitowe iloczyny dot, aby przyspieszyć obliczenia takich modeli z kwantyzacją int8. Może ona zaoszczędzić (do 75%) pamięci i przepustowości sieci oraz poprawić skuteczność wszelkich modeli systemów uczących się w przypadku wnioskowania w porównaniu z wersją f32. W rezultacie jest ona obecnie szeroko stosowana w ramach wielu popularnych frameworków AI.
Gdy "packed_4x8_integer_dot_product"
rozszerzenie języka WGSL jest obecne w navigator.gpu.wgslLanguageFeatures
, możesz używać 32-bitowych skalarnych liczb całkowitych, które pakują 4-elementowe wektory liczb całkowitych 8-bitowych jako wejścia do instrukcji iloczynu skalarnego w Twoim kodzie shadera WGSL za pomocą wbudowanych funkcji dot4U8Packed
i dot4I8Packed
. Możesz też używać instrukcji pakowania i rozpakowywania za pomocą zapakowanych wektorów 4-elementowych o wartościach całkowitych 8-bitowych za pomocą wbudowanych funkcji WGSL pack4xI8
, pack4xU8
, pack4xI8Clamp
, pack4xU8Clamp
, unpack4xI8
i unpack4xU8
.
Zalecamy użycie dyrektywy wymagań, aby zasygnalizować potencjalną niekompatybilność z requires packed_4x8_integer_dot_product;
na początku kodu shadera WGSL. Zobacz poniższy przykład i problem o identyfikatorze:1497.
if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
throw new Error(`DP4a built-in functions are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires packed_4x8_integer_dot_product;
fn main() {
const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
}`,
});
Szczególne podziękowania dla zespołu ds. grafiki internetowej firmy Intel w Szanghaju za opracowanie i wdrożenie tej specyfikacji.
Parametry bez ograniczeń w WGSL
"unrestricted_pointer_parameters"
Rozszerzenie języka WGSL łagodzi ograniczenia dotyczące tego, które wskaźniki można przekazywać do funkcji WGSL:
Wskazniki parametrów
storage
,uniform
iworkgroup
odnoszą się do przestrzeni adresów funkcji zadeklarowanych przez użytkownika.przekazywanie wskaźników do elementów struktury i elementów tablicy do funkcji zadeklarowanych przez użytkownika;
Aby dowiedzieć się więcej, zapoznaj się z artykułem Wskaźniki jako parametry funkcji | Omówienie WGSL.
Ta funkcja może być wykrywana za pomocą funkcji navigator.gpu.wgslLanguageFeatures
. Zalecamy, aby na początku kodu shadera WGSL zawsze używać dyrektywy wymagań, aby zasygnalizować potencjalną niekompatybilność z requires unrestricted_pointer_parameters;
. Zapoznaj się z tym przykładem, zmianami w specyfikacji WGSL i problemem o identyfikatorze problemu:2053.
if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
throw new Error(`Unrestricted pointer parameters are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires unrestricted_pointer_parameters;
@group(0) @binding(0) var<storage, read_write> S : i32;
fn func(pointer : ptr<storage, i32, read_write>) {
*pointer = 42;
}
@compute @workgroup_size(1)
fn main() {
func(&S);
}`
});
Składnia cukrowa do odwoływania się do elementów złożonych w WGSL
Gdy "pointer_composite_access"
rozszerzenie języka WGSL jest obecne w navigator.gpu.wgslLanguageFeatures
, kod shadera WGSL obsługuje teraz dostęp do komponentów złożonych typów danych za pomocą tej samej składni kropki (.
), niezależnie od tego, czy pracujesz bezpośrednio z danymi, czy z wskaźnikiem do nich. Jak to działa:
Jeśli
foo
to wskaźnik:foo.bar
to wygodniejszy sposób zapisu(*foo).bar
. Zwykle gwiazdka (*
) jest potrzebna do przekształcenia wskaźnika w „odwoływanie”, które można odwoływać, ale teraz wskaźniki i odwołania są znacznie bardziej podobne i prawie wymienne.Jeśli
foo
nie jest wskaźnikiem: operator kropki (.
) działa tak samo jak w przypadku bezpośredniego dostępu do elementów.
Podobnie, jeśli pa
to wskaźnik, który przechowuje adres początkowy tablicy, użycie pa[i]
daje bezpośredni dostęp do lokalizacji pamięci, w której przechowywany jest 'i
-ty element tej tablicy.
Zalecamy użycie dyrektywy wymagań, aby zasygnalizować potencjalną niekompatybilność z requires pointer_composite_access;
na początku kodu shadera WGSL. Zobacz poniższy przykład i problem o numerze 2113.
if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
throw new Error(`Pointer composite access is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires pointer_composite_access;
fn main() {
var a = vec3f();
let p : ptr<function, vec3f> = &a;
let r1 = (*p).x; // always valid.
let r2 = p.x; // requires pointer composite access.
}`
});
oddzielny stan tylko do odczytu dla rzutowania i głębi,
Wcześniej załączniki głębi i matrycy cieni tylko do odczytu w przejętych renderowania wymagały, aby oba aspekty (głębia i matryca cieni) były tylko do odczytu. To ograniczenie zostało zniesione. Teraz możesz używać aspektu głębi w trybie tylko do odczytu, na przykład do śledzenia cienia obiektu, podczas gdy bufor szablonu jest zapisywany, aby identyfikować piksele na potrzeby dalszego przetwarzania. Zobacz issue dawn:2146.
Aktualizacje świtu
Funkcja zwracania wywołania w przypadku nieprzechwyconego błędu skonfigurowana za pomocą funkcji wgpuDeviceSetUncapturedErrorCallback()
jest teraz wywoływana natychmiast po wystąpieniu błędu. Deweloperzy oczekują i chcą tego podczas debugowania. Zobacz change dawn:173620.
Zaimplementowano metodę wgpuSurfaceGetPreferredFormat()
z interfejsu webgpu.h API. Zobacz issue dawn:1362.
Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.
Co nowego w WebGPU
Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.
Chrome 131
- Odcinki odległości w WGSL
- GPUCanvasContext getConfiguration()
- Punkty i linie nie mogą mieć ustawienia głębi
- Funkcje wbudowane w skanowanie z uwzględnieniem wszystkich grup
- Dodanie eksperymentalnej obsługi pośrednich metod wielokrokowego rysowania
- Opcja kompilacji modułu shadera: ścisła matematyka
- Usuwanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 130
- Mieszanie dwóch źródeł
- Skrócenie czasu kompilacji shaderów na Metalu
- Wycofanie metody requestAdapterInfo() klasy GPUAdapter
- Aktualizacje dotyczące Dawn
Chrome 129
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie obsługi ustawiania głębi dla linii i punktów
- Ukrywanie ostrzeżenia DevTools o nieuwzględnionym błędzie, jeśli wywołano preventDefault
- WGSL interpoluje próbkowanie najpierw i potem
- Aktualizacje dotyczące Dawn
Chrome 127
- Doświadczalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o GPUAdapter
- Ulepszenia interoperacyjności WebAssembly
- Poprawione błędy kodowania poleceń
- Aktualizacje dotyczące Dawn
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania bufora dla backendu Vulkana
- Ulepszenia dotyczące czasu kompilacji shaderów
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje dotyczące Dawn
Chrome 125
- Podgrupy (funkcja w trakcie tworzenia)
- Renderowanie na potrzeby wycinka tekstury 3D
- Aktualizacje dotyczące Dawn
Chrome 124
- Tekstury tylko do odczytu i do odczytu i zapisu
- Obsługa pracowników i współużytkowników
- Nowe atrybuty informacji o adapterze
- Poprawki błędów
- Aktualizacje dotyczące Dawn
Chrome 123
- Obsługa wbudowanych funkcji DP4a w WGSL
- Parametry wskaźnika bez ograniczeń w WGSL
- Składnia cukrowa do odwoływania się do elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu dla stempli i aspektów głębi
- Aktualizacje dotyczące Dawn
Chrome 122
- Zwiększenie zasięgu dzięki trybowi zgodności (funkcja w trakcie tworzenia)
- Zwiększenie limitu maxVertexAttributes
- Aktualizacje dotyczące Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilowania shaderów w systemie Windows
- Zapytania o sygnatury czasowe w przelotach obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów shaderów
- Obsługa przestrzeni barw display-p3 jako przestrzeni barw GPUExternalTexture
- Informacje o kupach pamięci
- Aktualizacje dotyczące Dawn
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczanie limitów
- Zmiany stanu głębi cieniowania
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje wiosenne porządki
Chrome 119
- Filtrowane tekstury 32-bitowe
- Format wierzchołka unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje dotyczące Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Dodatkowa obsługa tekstury pamięci tylko do odczytu i z możliwością zapisu
- Aktualizacje dotyczące Dawn
Chrome 117
- Nieustawienie bufora wierzchołka
- Cofnij grupę wiązania
- Błędy w przypadku tworzenia asynchronicznego potoku, gdy urządzenie jest utracone
- Aktualizacje dotyczące tworzenia modułów shaderów SPIR-V
- Ułatwienie pracy programistom
- Skuteczne wykorzystanie pamięci podręcznej dzięki automatycznie generowanemu układowi
- Aktualizacje dotyczące Dawn
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice()
- Utrzymanie płynnego odtwarzania filmu, jeśli wywołana zostanie funkcja
importExternalTexture()
- Zgodność ze specyfikacją
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 115
- Obsługiwane rozszerzenia językowe WGSL
- Wstępna obsługa Direct3D 11
- Uzyskaj oddzielny procesor graficzny domyślnie na zasilaniu z sieci
- Ułatwienie pracy programistom
- Aktualizacje dotyczące Dawn
Chrome 114
- Optymalizacja kodu JavaScript
- getCurrentTexture() na nieskonfigurowanym płótnie powoduje błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn