Co nowego w WebGPU (Chrome 123)

François Beaufort
François Beaufort

Obsługa wbudowanych funkcji DP4a w WGSL

DP4a (dot product of 4 elements and accumulate) to zestaw instrukcji GPU często używany 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 przypadku wnioskowania w porównaniu z wersją f32. W rezultacie jest ona obecnie szeroko stosowana w ramach wielu popularnych frameworków AI.

Gdy "packed_4x8_integer_dot_product" rozszerzenie języka WGSL jest obecne w navigator.gpu.wgslLanguageFeatures, możesz używać 32-bitowych skalarnych liczb całkowitych, które pakują 4-elementowe wektory liczb całkowitych 8-bitowych jako wejścia do instrukcji iloczynu skalarnego w Twoim kodzie shadera WGSL za pomocą wbudowanych funkcji dot4U8Packeddot4I8Packed. Możesz też używać instrukcji pakowania i rozpakowywania za pomocą zapakowanych wektorów 4-elementowych o wartościach całkowitych 8-bitowych za pomocą wbudowanych funkcji WGSL pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8unpack4xU8.

Zalecamy użycie dyrektywy wymagań, aby zasygnalizować potencjalną niekompatybilność z requires packed_4x8_integer_dot_product; na początku kodu shadera WGSL. Zobacz poniższy przykład i problem o identyfikatorze: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 bez ograniczeń 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 wymagań, aby zasygnalizować 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

Gdy "pointer_composite_access" rozszerzenie języka WGSL jest obecne w navigator.gpu.wgslLanguageFeatures, kod shadera WGSL obsługuje teraz dostęp do komponentów złożonych typów danych za pomocą tej samej składni kropki (.), niezależnie od tego, czy pracujesz bezpośrednio z danymi, czy z wskaźnikiem do nich. Jak to działa:

  • Jeśli foo to wskaźnik: foo.bar to wygodniejszy sposób zapisu (*foo).bar. Zwykle gwiazdka (*) jest potrzebna do przekształcenia wskaźnika w „odwoływanie”, które można odwoływać, ale teraz wskaźniki i odwołania są znacznie bardziej podobne i prawie 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 dyrektywy wymagań, aby zasygnalizować potencjalną niekompatybilność z requires pointer_composite_access; na początku kodu shadera WGSL. Zobacz poniższy przykład i problem o numerze 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 dla rzutowania 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 używać aspektu głębi w trybie tylko do odczytu, na przykład do śledzenia cienia obiektu, podczas gdy bufor szablonu jest zapisywany, aby identyfikować piksele na potrzeby dalszego przetwarzania. Zobacz issue dawn:2146.

Aktualizacje świtu

Funkcja zwracania wywołania w przypadku nieprzechwyconego błędu skonfigurowana za pomocą funkcji wgpuDeviceSetUncapturedErrorCallback() jest teraz wywoływana 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