Obsługa wbudowanych funkcji DP4a w języku WGSL
DP4a (iloczyn skalarny 4 elementów i akumuluj) odnosi się do zestawu instrukcji GPU, które są często używane do wnioskowania opartego na deep learningu na potrzeby kwantyzacji. Efektywnie wykonuje 8-bitowe produkty z kropką w postaci 8-bitowych liczb całkowitych, aby przyspieszyć obliczenia w takich modelach. Może zaoszczędzić (nawet o 75%) pamięci i przepustowości sieci oraz poprawić wydajność dowolnych modeli uczenia maszynowego do wnioskowania w porównaniu z ich wersją f32. W rezultacie jest on obecnie intensywnie wykorzystywany w wielu popularnych platformach opartych na 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 też 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 polecenia requires-direct, aby zasygnalizować potencjał braku możliwości przenoszenia za pomocą kodu requires packed_4x8_integer_dot_product;
na górze kodu Shakera 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
}`,
});
Specjalne podziękowania dla zespołu Intellum Web Graphics w Szanghaju za dopracowanie specyfikacji i wdrożenia.
Nieograniczone parametry wskaźnika w WGSL
Rozszerzenie języka WGSL "unrestricted_pointer_parameters"
łagodzi ograniczenia dotyczące tego, jakie wskaźniki mogą być przekazywane do funkcji WGSL:
Wskaźniki parametrów przestrzeni adresowych
storage
,uniform
iworkgroup
do funkcji zadeklarowanych przez użytkownika.Przekazywanie wskaźników do elementów struktury i elementów tablicy do funkcji zadeklarowanych przez użytkownika.
Zapoznaj się z artykułem Wskaźniki jako parametry funkcji | Obejrzyj prezentację WGSL, by dowiedzieć się więcej.
Tę funkcję można wykryć za pomocą narzędzia navigator.gpu.wgslLanguageFeatures
. Zalecamy, aby zawsze używać requires-directive (wymagającej), aby zasygnalizować potencjalne problemy z przenośnością za pomocą tagu requires unrestricted_pointer_parameters;
na górze kodu aplikacji do cieniowania WGSL. Zobacz przykład zmian specyfikacji WGSL i numer 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);
}`
});
Cukier składni do dereferencji 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” które można usunąć, 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 dokładnie tak, jak w przypadku bezpośredniego dostępu do użytkowników.
Podobnie jeśli pa
jest wskaźnikiem, który przechowuje adres początkowy tablicy, użycie pa[i]
umożliwia bezpośredni dostęp do lokalizacji pamięci, w której jest zapisany element 'i
tej tablicy.
Zalecamy użycie polecenia requires-direct, aby zasygnalizować potencjał braku możliwości przenoszenia za pomocą kodu requires pointer_composite_access;
na górze kodu Shakera WGSL. Zobacz ten przykład i opis problemu: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 z szablonami głębi (tylko do odczytu) w kartach renderowania wymagały, aby oba aspekty (głębia i szablon) 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 problem: świt:2146.
Aktualizacje o świcie
Nieprzechwycony błąd wywołania zwrotnego ustawiony za pomocą funkcji wgpuDeviceSetUncapturedErrorCallback()
jest teraz wywoływany natychmiast po wystąpieniu błędu. Tego właśnie oczekują deweloperzy od debugowania. Zobacz zmianę daty:173620.
Wdrożono metodę wgpuSurfaceGetPreferredFormat()
z interfejsu API webgpu.h. Zobacz problem świt:1362.
To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.
Co nowego w WebGPU
Lista wszystkiego, co zostało omówione w serii Co nowego w WebGPU.
Chrome 128
- Eksperymentowanie z podgrupami
- Wycofywanie odchylenia ustawień głębi w przypadku linii i punktów
- Ukryj nieprzechwycony błąd w Narzędziach deweloperskich w przypadku funkcji preventDefault
- Testuj najpierw próbkowanie WGSL, a potem jedno i drugie.
- Informacje o świcie
Chrome 127
- Eksperymentalna obsługa OpenGL ES na Androidzie
- Atrybut informacji o karcie GPU
- Ulepszenia współpracy WebAssembly
- Poprawione błędy kodera poleceń
- Informacje o świcie
Chrome 126
- Zwiększanie limitu maxTextureSlateWarstwy
- Optymalizacja przesyłania buforów w backendzie Vulkan
- Skrócony czas kompilacji shadera
- Przesłane bufory poleceń muszą być unikalne
- Informacje o świcie
Chrome 125
Chrome 124
- Tekstury pamięci masowej przeznaczone tylko do odczytu oraz do odczytu i zapisu
- Obsługa pracowników Service Worker i pracowników współużytkowanych
- Nowe atrybuty informacji o adapterze
- Poprawki błędów.
- Informacje o świcie
Chrome 123
- Obsługa wbudowanych funkcji DP4a w języku WGSL
- Nieograniczone parametry wskaźnika w WGSL
- Składnikowy cukier do dereferencji elementów złożonych w WGSL
- Oddzielny stan tylko do odczytu w przypadku elementów związanych z szablonem i głębią
- Informacje o świcie
Chrome 122
- Zwiększanie zasięgu dzięki trybowi zgodności (funkcja w trakcie opracowywania)
- Zwiększanie limitu maxVertexAttributes
- Informacje o świcie
Chrome 121
- Obsługa WebGPU na Androidzie
- Używanie DXC zamiast FXC do kompilowania danych do cieniowania w systemie Windows
- Zapytania dotyczące sygnatury czasowej w kartach obliczeń i renderowania
- Domyślne punkty wejścia do modułów cieniowania
- Obsługuj display-p3 jako przestrzeń kolorów GPUExternalTexture
- Informacje o stertach pamięci
- Informacje o świcie
Chrome 120
- Obsługa 16-bitowych wartości zmiennoprzecinkowych w WGSL
- Przesuwaj granice
- Zmiany stanu szablonu z głębokością
- Aktualizacje informacji o karcie
- Kwantyzacja zapytań dotyczących sygnatury czasowej
- Funkcje sprzątania przed wiosną
Chrome 119
- Filtrowalne 32-bitowe tekstury zmiennoprzecinkowe
- format wierzchołkowy 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 do odczytu i zapisu oraz tylko do odczytu
- Informacje o świcie
Chrome 117
- Nieskonfigurowany bufor wierzchołkowy
- Nieskonfigurowana grupa powiązań
- Wyciszaj błędy tworzenia potoku asynchronicznego w przypadku utraty urządzenia
- Zmiany związane z tworzeniem modułu cieniowania SPIR-V
- Polepszanie obsługi dla programistów
- Potoki pamięci podręcznej z układem generowanym automatycznie
- Informacje o świcie
Chrome 116
- Integracja z WebCodecs
- Utracone urządzenie zwrócone przez GPUAdapter
requestDevice()
- Odtwarzaj płynnie po wywołaniu
importExternalTexture()
- Zgodność ze specyfikacją
- Polepszanie obsługi dla programistów
- Informacje o świcie
Chrome 115
- Obsługiwane rozszerzenia języka WGSL
- Eksperymentalna obsługa interfejsu Direct3D 11
- Domyślnie używaj dyskretnego GPU przy zasilaniu sieciowym
- Polepszanie obsługi dla programistów
- Informacje o świcie
Chrome 114
- Optymalizacja JavaScriptu
- Funkcja getCurrentTexture() w nieskonfigurowanym obszarze roboczym powoduje zgłoszenie nieprawidłowego stanu błędu
- Aktualizacje WGSL
- Informacje o świcie