Obsługa wbudowanych funkcji DP4a w WGSL
DP4a (iloczyn skalarny 4 elementów i akumulacja) to zbiór instrukcji GPU, które są często używane 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 inferencji w porównaniu z ich wersją f32. W rezultacie jest ona obecnie szeroko stosowana w ramach wielu popularnych frameworków AI.
Gdy navigator.gpu.wgslLanguageFeatures
dysponuje rozszerzeniem języka WGSL "packed_4x8_integer_dot_product"
, możesz teraz używać 32-bitowych liczb całkowitych pakujących 4-składnikowe wektory 8-bitowych liczb całkowitych jako dane wejściowe do instrukcji iloczynu skalarnego w kodzie cieniowania WGSL z wbudowanymi funkcjami dot4U8Packed
i dot4I8Packed
. Możesz również skorzystać z instrukcji pakowania i rozpakowywania z 4-składnikowymi wektorami 8-bitowych liczb całkowitych z wbudowanymi funkcjami 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 ten przykład i informację o problemie: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 nieograniczonego wskaźnika 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 requires, która sygnalizuje 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
Jeśli navigator.gpu.wgslLanguageFeatures
zawiera rozszerzenie języka WGSL "pointer_composite_access"
, kod cieniowania WGSL umożliwia teraz dostęp do komponentów złożonych typów danych z użyciem tej samej składni kropki (.
), niezależnie od tego, czy pracujesz bezpośrednio z danymi, czy, korzystając ze wskaźnika. Jak to działa:
Jeśli
foo
to wskaźnik:foo.bar
to wygodniejszy sposób zapisu(*foo).bar
. Gwiazdka (*
) jest zwykle potrzebna, aby zmienić wskaźnik w „odwołanie”, do którego można się odnieść. Jednak teraz zarówno wskaźniki, jak i odwołania są znacznie bardziej podobne i niemal 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 polecenia requires-direct, aby zasygnalizować potencjał braku możliwości przenoszenia za pomocą kodu requires pointer_composite_access;
u góry kodu aplikacji do cieniowania WGSL. Zobacz poniższy przykład i problem o identyfikatorze 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 w przypadku elementów związanych z szablonem 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 korzystać z wymiaru głębi w trybie tylko do odczytu, np. do śledzenia cieni kontaktu, a bufor szablonu służy do identyfikowania pikseli do dalszego przetwarzania. Zobacz issue dawn:2146.
Aktualizacje świtu
Nieprzechwycony błąd wywołania zwrotnego ustawiony za pomocą funkcji wgpuDeviceSetUncapturedErrorCallback()
jest teraz wywoływany 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średniego rysowania wielokrotnego
- Opcja kompilacji modułu Shadera (ścisła funkcja matematyczna)
- Usuwanie metody requestAdapterInfo() klasy GPUAdapter
- Informacje o świcie
Chrome 130
- Mieszanie dwóch źródeł
- Skrócony czas kompilowania shadera w 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 funkcję 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 współpracy 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 wycinek tekstury 3D
- Aktualizacje dotyczące Dawn
Chrome 124
- Tekstury pamięci masowej przeznaczone tylko do odczytu oraz do odczytu i zapisu
- Obsługa pracowników usług i pracowników wspólnych
- 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
- Informacje o świcie
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przekraczanie limitów
- Zmiany stanu szablonu z głębokością
- Aktualizacje informacji o karcie
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje sprzątania wiosenną
Chrome 119
- Filtrowane tekstury 32-bitowe zmiennoprzecinkowe
- Format wierzchołka unorm10-10-10-2
- Format tekstury rgb10a2uint
- Informacje o świcie
Chrome 118
- Obsługa HTMLImageElement i ImageData w
copyExternalImageToTexture()
- Eksperymentalna obsługa tekstury pamięci masowej tylko do odczytu i do odczytu i zapisu
- Aktualizacje dotyczące Dawn
Chrome 117
- Bufor wierzchołka nieustawiony
- 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
- Polepszanie wrażeń programistów
- Przetwarzanie za pomocą przepływów z automatycznie wygenerowanym układem
- Informacje o świcie
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 JavaScriptu
- getCurrentTexture() na nieskonfigurowanym płótnie powoduje błąd InvalidStateError
- Aktualizacje WGSL
- Aktualizacje dotyczące Dawn