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, 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 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; 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

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