Co nowego w WebGPU (Chrome 123)

François Beaufort
François Beaufort

Obsługa wbudowanych funkcji DP4a w języku WGSL

DP4a (iloczyn skalarny 4 elementów i akumuluj) odnosi się do zestawu instrukcji GPU często używanych 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 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 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 i workgroup 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; u góry 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 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113