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 dotyczących GPU często używanych do wnioskowania w ramach deep learningu na potrzeby kwantyzacji. Efektywnie wykonuje iloczyny punktowe 8-bitowych liczb całkowitych, które przyspieszają obliczanie takich modeli poddanych kwantyzacji int8. Może zaoszczędzić (nawet 75%) pamięci i przepustowości sieci oraz poprawić wydajność wszelkich modeli systemów uczących się w porównaniu z ich wersją F32. W związku z tym jest obecnie intensywnie wykorzystywana w wielu popularnych systemach AI.

Gdy w języku navigator.gpu.wgslLanguageFeatures obecne jest rozszerzenie języka "packed_4x8_integer_dot_product" WGSL, możesz teraz używać 32-bitowych skalarów liczb całkowitych układających 4-komponenowe wektory liczb całkowitych jako danych wejściowych do instrukcji dotyczących produktów skalarnych w kodzie cieniowania WGSL za pomocą wbudowanych funkcji dot4U8Packed i dot4I8Packed. Możesz też użyć instrukcji pakowania i rozpakowywania za pomocą zapakowanych 4-komponentowych wektorów liczb całkowitych z wbudowanymi funkcjami pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 i unpack4xU8 WGSL.

Zalecamy użycie dyrektywy wymagającej, aby zasygnalizować możliwość braku możliwości przenoszenia za pomocą requires packed_4x8_integer_dot_product; u góry kodu cieniowania WGSL. Patrz poniższy przykład i odcień problemu: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 Intela Web Graphics w Szanghaju za przygotowanie specyfikacji i implementacji.

Nieograniczone parametry wskaźnika w WGSL

Rozszerzenie języka "unrestricted_pointer_parameters" WGSL złagodzi ograniczenia dotyczące przekazywania wskaźników 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.

Aby dowiedzieć się więcej, zapoznaj się z artykułem Pointers as Function Parameters | Tour of WGSL (Wskaźniki jako parametry funkcji | Prezentacja WGSL).

Tę funkcję można wykryć za pomocą navigator.gpu.wgslLanguageFeatures. Zalecamy, aby zawsze używać dyrektywy wymagającej, aby zasygnalizować możliwość braku możliwości przenoszenia za pomocą requires unrestricted_pointer_parameters; u góry kodu cienia WGSL. Poniżej znajdziesz przykład ze zmianami specyfikacji WGSL i odcieniem 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ładniowy do usuwania linków do kompozytów w WGSL

Gdy w navigator.gpu.wgslLanguageFeatures występuje rozszerzenie języka "pointer_composite_access" WGSL, Twój kod cieniowania WGSL obsługuje teraz dostęp do komponentów złożonych typów danych, które używają tej samej składni kropki (.) niezależnie od tego, czy pracujesz bezpośrednio z danymi, czy za pomocą wskaźnika do nich. Działa to w następujący sposób:

  • Jeśli foo jest wskaźnikiem: foo.bar to wygodniejszy sposób zapisywania (*foo).bar. Gwiazdka (*) zwykle jest potrzebna do przekształcenia wskaźnika w „odwołanie”, do którego można się odwoływać. Teraz zarówno wskaźniki, jak i odwołania są znacznie bardziej podobne i prawie wymienne.

  • Jeśli foo nie jest wskaźnikiem: operator kropki (.) działa dokładnie w taki sam sposób jak przy bezpośrednim dostępie do użytkowników.

I podobnie, jeśli pa jest wskaźnikiem, który przechowuje adres początkowy tablicy, użycie pa[i] daje bezpośredni dostęp do lokalizacji pamięci, w której znajduje się element 'i tej tablicy.

Zalecamy użycie dyrektywy wymagającej, aby zasygnalizować możliwość braku możliwości przenoszenia za pomocą requires pointer_composite_access; u góry kodu cieniowania WGSL. Zobacz ten przykład i odcień 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 dla aspektów szablonu i głębi

Wcześniej załączone szablony głębokości tylko do odczytu w przebiegach renderowania wymagały, aby oba aspekty (głębokość i szablon) były tylko do odczytu. To ograniczenie zostało zniesione. Teraz możesz korzystać z aspektu głębi w trybie tylko do odczytu, na przykład do śledzenia cieni, a bufor szablonów został zapisany w celu identyfikowania pikseli do dalszego przetwarzania. Zobacz świt problemu:2146.

Powiadomienia o świcie

Wywołanie zwrotne dotyczące nieprzechwyconego błędu z ustawieniem wgpuDeviceSetUncapturedErrorCallback() jest teraz wywoływane natychmiast po wystąpieniu błędu. Tego oczekują deweloperzy i chcą takie rozwiązanie w przypadku debugowania. Zobacz świt:173620.

Wdrożono metodę wgpuSurfaceGetPreferredFormat() z interfejsu API webgpu.h. Zobacz świt problemu:1362.

To tylko niektóre z najważniejszych kwestii. Zobacz pełną listę zatwierdzeń.

Co nowego w WebGPU

Lista wszystkich zagadnień omówionych w serii Co nowego w WebGPU.

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