Co nowego w WebGPU (Chrome 123)

François Beaufort
François Beaufort

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, uniformworkgroup 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 WGSLproblemem 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

Chrome 130

Chrome 129

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