Obsługa funkcji wbudowanych DP4a w WGSL
DP4a (Dot Product of 4 Elements and Accumulate) to zestaw instrukcji GPU powszechnie używanych w wnioskowaniu w uczeniu głębokim na potrzeby kwantyzacji. Wydajnie wykonuje iloczyny skalarne liczb całkowitych 8-bitowych, aby przyspieszyć obliczenia takich modeli skwantyzowanych do int8. Może zaoszczędzić (do 75%) pamięci i przepustowości sieci oraz poprawić wydajność wszystkich modeli uczenia maszynowego w wnioskowaniu w porównaniu z ich wersją f32. Dzięki temu jest obecnie szeroko stosowany w wielu popularnych frameworkach AI.
Gdy rozszerzenie języka WGSL "packed_4x8_integer_dot_product" jest obecne w navigator.gpu.wgslLanguageFeatures, możesz teraz używać skalarów liczb całkowitych 32-bitowych, które pakują 4-składnikowe wektory liczb całkowitych 8-bitowych jako dane wejściowe do instrukcji iloczynu skalarnego w kodzie shadera WGSL za pomocą funkcji wbudowanych dot4U8Packed i dot4I8Packed. Możesz też używać instrukcji pakowania i rozpakowywania z zapakowanymi 4-składnikowymi wektorami liczb całkowitych 8-bitowych za pomocą funkcji wbudowanych WGSL pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 i unpack4xU8.
Zalecamy używanie dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires packed_4x8_integer_dot_product; na początku kodu shadera WGSL. Zobacz ten przykład i problem tint: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
}`,
});
Specjalne podziękowania dla zespołu Web Graphics firmy Intel w Szanghaju za doprowadzenie do końca tej specyfikacji i implementacji.
Nieograniczone parametry wskaźników w WGSL
Rozszerzenie "unrestricted_pointer_parameters" języka WGSL language extension łagodzi ograniczenia dotyczące tego, które wskaźniki można przekazywać do funkcji WGSL:
Wskaźniki parametrów przestrzeni adresowych
storage,uniformiworkgroupdo funkcji zadeklarowanych przez użytkownika.Przekazywanie wskaźników do elementów struktury i elementów tablicy do funkcji zadeklarowanych przez użytkownika.
Więcej informacji znajdziesz w artykule Pointers As Function Parameters | Tour of WGSL.
Tę funkcję można wykryć za pomocą navigator.gpu.wgslLanguageFeatures. Zalecamy, aby zawsze używać dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires unrestricted_pointer_parameters; na początku kodu shadera WGSL. Zobacz ten przykład, zmiany w specyfikacji WGSL i problem tint: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);
}`
});
Uproszczona składnia dereferencji kompozytów w WGSL
Gdy rozszerzenie "pointer_composite_access" 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 z kropką (.), niezależnie od tego, czy pracujesz bezpośrednio z danymi, czy ze wskaźnikiem do nich. Jak to działa:
Jeśli
foojest wskaźnikiem,foo.barto wygodniejszy sposób na zapisanie(*foo).bar. Gwiazdka (*) byłaby normalnie potrzebna do przekształcenia wskaźnika w „odniesienie”, które można dereferencjonować, ale teraz wskaźniki i odniesienia są do siebie znacznie bardziej podobne i prawie wymienne.Jeśli
foonie jest wskaźnikiem, operator kropki (.) działa dokładnie tak, jak w przypadku bezpośredniego dostępu do elementów.
Podobnie, jeśli pa jest wskaźnikiem, który przechowuje adres początkowy tablicy, użycie pa[i] zapewnia bezpośredni dostęp do lokalizacji pamięci, w której jest przechowywany element 'i tej tablicy.
Zalecamy używanie dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires pointer_composite_access; na początku kodu shadera WGSL. Zobacz ten przykład i problem tint: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 aspektów szablonu i głębi
Wcześniej załączniki głębi i szablonu tylko do odczytu w przepustkach renderowania wymagały, aby oba aspekty (głębia i szablon) były tylko do odczytu. To ograniczenie zostało zniesione. Teraz możesz używać aspektu głębi tylko do odczytu, np. do śledzenia cieni kontaktowych, podczas gdy bufor szablonu jest zapisywany w celu identyfikacji pikseli do dalszego przetwarzania. Zobacz problem dawn:2146.
Aktualizacje Dawn
Funkcja zwrotna błędu nieprzechwyconego ustawiona za pomocą wgpuDeviceSetUncapturedErrorCallback() jest teraz wywoływana natychmiast po wystąpieniu błędu. Tego właśnie deweloperzy oczekują i chcą do debugowania. Zobacz zmianę dawn:173620.
Zaimplementowano metodę wgpuSurfaceGetPreferredFormat() z interfejsu API webgpu.h. Zobacz problem dawn:1362.
To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Co nowego w WebGPU
Lista wszystkich informacji, które zostały omówione w serii Co nowego w WebGPU.
Chrome 147–148
Chrome 146
- Obsługa trybu zgodności WebGPU w OpenGL ES 3.1
- Załączniki tymczasowe
- Rozszerzenie WGSL texture_and_sampler_let
- Aktualizacje Dawn
Chrome 145
- Rozszerzenie WGSL subgroup_uniformity
- Eksperymentalne synchroniczne mapowanie buforów w workerach
- Aktualizacje Dawn
Chrome 144
- Rozszerzenie WGSL subgroup_id
- Rozszerzenie WGSL uniform_buffer_standard_layout
- WebGPU w systemie Linux
- Szybsze writeBuffer i writeTexture
- Aktualizacje Dawn
Chrome 143
- Przełączanie komponentów tekstury
- Usuwanie użycia tekstury pamięci tylko do odczytu bgra8unorm
- Aktualizacje Dawn
Chrome 142
Chrome 141
- Ukończono Tint IR
- Analiza zakresu liczb całkowitych w kompilatorze WGSL
- Aktualizacja SPIR-V 1.4 dla backendu Vulkan
- Aktualizacje Dawn
Chrome 140
- Żądania urządzeń zużywają adapter
- Skrót do używania tekstury, gdy używany jest widok tekstury
- WGSL textureSampleLevel obsługuje tekstury 1D
- Wycofanie użycia tekstury pamięci tylko do odczytu bgra8unorm
- Usuwanie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje Dawn
Chrome 139
- Obsługa tekstur 3D w przypadku formatów skompresowanych BC i ASTC
- Nowa funkcja „core-features-and-limits”
- Testowanie origin trybu zgodności WebGPU
- Aktualizacje Dawn
Chrome 138
- Skrót do używania bufora jako zasobu powiązania
- Zmiany wymagań dotyczących rozmiaru w przypadku buforów mapowanych podczas tworzenia
- Raport architektury dotyczący najnowszych GPU
- Wycofanie atrybutu GPUAdapter isFallbackAdapter
- Aktualizacje Dawn
Chrome 137
- Używanie widoku tekstury do powiązania externalTexture
- Kopiowanie buforów bez określania przesunięć i rozmiaru
- WGSL workgroupUniformLoad używa wskaźnika do atomowego
- Atrybut GPUAdapterInfo powerPreference
- Usuwanie atrybutu GPURequestAdapterOptions compatibilityMode
- Aktualizacje Dawn
Chrome 136
- Atrybut GPUAdapterInfo isFallbackAdapter
- Krótszy czas kompilacji shadera w D3D12
- Zapisywanie i kopiowanie obrazów z canvasu
- Zniesienie ograniczeń trybu zgodności
- Aktualizacje Dawn
Chrome 135
- Zezwalanie na tworzenie układu potoku z układem grupy powiązań null
- Zezwalanie na rozszerzanie viewportów poza granice docelowych renderowania
- Łatwiejszy dostęp do eksperymentalnego trybu zgodności na Androidzie
- Usuwanie limitu maxInterStageShaderComponents
- Aktualizacje Dawn
Chrome 134
- Ulepszanie zadań uczenia maszynowego za pomocą podgrup
- Usuwanie obsługi typów tekstur z filtrem zmiennoprzecinkowym jako mieszanych
- Aktualizacje Dawn
Chrome 133
- Dodatkowe formaty wierzchołków unorm8x4-bgra i 1-składnikowe
- Zezwalanie na żądanie nieznanych limitów z wartością undefined
- Zmiany reguł wyrównywania WGSL
- Zwiększenie wydajności WGSL dzięki discard
- Używanie displaySize VideoFrame w przypadku tekstur zewnętrznych
- Obsługa obrazów z orientacją inną niż domyślna za pomocą copyExternalImageToTexture
- Ulepszanie środowiska deweloperskiego
- Włączanie trybu zgodności za pomocą featureLevel
- Czyszczenie eksperymentalnych funkcji podgrup
- Wycofanie limitu maxInterStageShaderComponents
- Aktualizacje Dawn
Chrome 132
- Użycie widoku tekstury
- Mieszanie tekstur zmiennoprzecinkowych 32-bitowych
- Atrybut GPUDevice adapterInfo
- Konfigurowanie kontekstu canvasu z nieprawidłowym formatem powoduje błąd JavaScriptu
- Ograniczenia dotyczące próbek filtrowania w teksturach
- Rozszerzone eksperymenty z podgrupami
- Ulepszanie środowiska deweloperskiego
- Eksperymentalna obsługa 16-bitowych znormalizowanych formatów tekstur
- Aktualizacje Dawn
Chrome 131
- Odległości przycinania w WGSL
- GPUCanvasContext getConfiguration()
- Prymitywy punktowe i liniowe nie mogą mieć odchylenia głębi
- Funkcje wbudowane skanowania włącznie dla podgrup
- Eksperymentalna obsługa multi-draw indirect
- Opcja kompilacji modułu shadera strict math
- Usuwanie GPUAdapter requestAdapterInfo()
- Aktualizacje Dawn
Chrome 130
- Mieszanie z 2 źródeł
- Krótszy czas kompilacji shadera w Metal
- Wycofanie GPUAdapter requestAdapterInfo()
- Aktualizacje Dawn
Chrome 129
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofanie ustawiania odchylenia głębi dla linii i punktów
- Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli preventDefault
- WGSL interpolate sampling first and either
- Aktualizacje Dawn
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut GPUAdapter info
- Ulepszenia interoperacyjności WebAssembly
- Ulepszone błędy kodera poleceń
- Aktualizacje Dawn
Chrome 126
- Zwiększenie limitu maxTextureArrayLayers
- Optymalizacja przesyłania buforów w backendzie Vulkan
- Krótszy czas kompilacji shadera
- Przesłane bufory poleceń muszą być unikalne
- Aktualizacje Dawn
Chrome 125
Chrome 124
- Tekstury pamięci tylko do odczytu i do odczytu i zapisu
- Obsługa service workerów i shared workerów
- Nowe atrybuty informacji o adapterze
- Poprawki błędów
- Aktualizacje Dawn
Chrome 123
- Obsługa funkcji wbudowanych DP4a w WGSL
- Nieograniczone parametry wskaźników w WGSL
- Uproszczona składnia dereferencji kompozytów w WGSL
- Oddzielny stan tylko do odczytu dla aspektów szablonu i głębi
- Aktualizacje Dawn
Chrome 122
- Poszerzanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększenie limitu maxVertexAttributes
- Aktualizacje Dawn
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilacji shadera w systemie Windows
- Zapytania o sygnaturę czasową w przepustkach obliczeniowych i renderowania
- Domyślne punkty wejścia do modułów shadera
- Obsługa display-p3 jako przestrzeni kolorów GPUExternalTexture
- Informacje o stertach pamięci
- Aktualizacje Dawn
Chrome 120
- Obsługa 16-bitowej reprezentacji zmiennoprzecinkowej w WGSL
- Przekraczanie limitów
- Zmiany stanu głębi i szablonu
- Aktualizacje informacji o adapterze
- Kwantyzacja zapytań o sygnaturę czasową
- Wiosenne porządki
Chrome 119
- Tekstury zmiennoprzecinkowe 32-bitowe z filtrowaniem
- Format wierzchołków unorm10-10-10-2
- Format tekstury rgb10a2uint
- Aktualizacje Dawn
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture() - Eksperymentalna obsługa tekstur pamięci do odczytu i zapisu oraz tylko do odczytu
- Aktualizacje Dawn
Chrome 117
- Usuwanie bufora wierzchołków
- Usuwanie grupy powiązań
- Wyciszanie błędów podczas asynchronicznego tworzenia potoku, gdy urządzenie jest utracone
- Aktualizacje tworzenia modułu shadera SPIR-V
- Ulepszanie środowiska deweloperskiego
- Buforowanie potoków z automatycznie generowanym układem
- Aktualizacje Dawn
Chrome 116
- Integracja WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice() - Płynne odtwarzanie filmu, jeśli wywoływana jest funkcja
importExternalTexture() - Zgodność ze specyfikacją
- Ulepszanie środowiska deweloperskiego
- Aktualizacje Dawn
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa Direct3D 11
- Domyślne używanie dyskretnego GPU po podłączeniu do zasilania
- Ulepszanie środowiska deweloperskiego
- Aktualizacje Dawn
Chrome 114
- Optymalizacja JavaScriptu
- getCurrentTexture() w niekonfigurowanym canvasie zgłasza InvalidStateError
- Aktualizacje WGSL
- Aktualizacje Dawn