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 powszechnie używanych w procesie wnioskowania w uczeniu głębokim na potrzeby kwantyzacji. Wydajnie wykonuje 8-bitowe iloczyny skalarne, aby przyspieszyć obliczenia takich modeli skwantyzowanych do 8 bitów. Może zaoszczędzić (do 75%) pamięci i przepustowości sieci oraz zwiększyć skuteczność dowolnych modeli uczenia maszynowego w zakresie wnioskowania w porównaniu z ich wersją f32. Dlatego jest obecnie szeroko stosowany w wielu popularnych platformach AI.

Gdy w navigator.gpu.wgslLanguageFeatures występuje "packed_4x8_integer_dot_product" rozszerzenie języka WGSL, możesz teraz używać 32-bitowych skalarów całkowitych zawierających 4-elementowe wektory 8-bitowych liczb całkowitych jako danych wejściowych do instrukcji iloczynu skalarnego w kodzie shadera WGSL za pomocą wbudowanych funkcji dot4U8Packeddot4I8Packed. Możesz też używać instrukcji pakowania i rozpakowywania z spakowanymi 4-elementowymi wektorami 8-bitowych liczb całkowitych z funkcjami wbudowanymi WGSL pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8unpack4xU8.

Zalecamy użycie dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą requires packed_4x8_integer_dot_product; na początku kodu shadera WGSL. Zapoznaj się z tym przykładem i problemem z odcieniem: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 Web Graphics firmy Intel w Szanghaju za doprowadzenie do ukończenia tej specyfikacji i jej wdrożenia.

Parametry wskaźnika bez ograniczeń w WGSL

"unrestricted_pointer_parameters" WGSL rozszerzenie języka łagodzi ograniczenia dotyczące wskaźników, które można przekazywać do funkcji WGSL:

  • Wskaźniki parametrów przestrzeni adresowych storage, uniformworkgroup do funkcji zadeklarowanych przez użytkownika.

  • Przekazywanie wskaźników do elementów struktury i elementów tablicy do funkcji zdefiniowanych przez użytkownika.

Więcej informacji znajdziesz w artykule Pointers As Function Parameters | Tour of WGSL (Wskaźniki jako parametry funkcji | Przewodnik po WGSL).

Tę funkcję można wykryć za pomocą navigator.gpu.wgslLanguageFeatures. Zalecamy, aby zawsze używać dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą requires unrestricted_pointer_parameters; na początku kodu shadera WGSL. Zobacz ten przykład, zmiany w specyfikacji WGSLproblem tint: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);
  }`
});

Uproszczona składnia dereferencji typów złożonych w WGSL

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

  • Jeśli foo jest wskaźnikiem: foo.bar to wygodniejszy sposób zapisu (*foo).bar. Gwiazdka (*) jest zwykle potrzebna, aby przekształcić wskaźnik w „odwołanie”, które można wyłuskać, ale teraz wskaźniki i odwołania są do siebie znacznie bardziej podobne i niemal wymienne.

  • Jeśli foo nie jest wskaźnikiem: operator kropki (.) działa tak, jak zwykle, czyli umożliwia bezpośredni dostęp do elementów.

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 jest przechowywany element 'i tej tablicy.

Zalecamy użycie dyrektywy requires, aby zasygnalizować potencjalną nieprzenośność za pomocą requires pointer_composite_access; na początku kodu shadera WGSL. Zobacz ten przykład i issue tint: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łączniki głębi i wzorca tylko do odczytu w przepustkach renderowania wymagały, aby oba aspekty (głębia i wzorzec) były tylko do odczytu. To ograniczenie zostało zniesione. Teraz możesz używać aspektu głębi w trybie tylko do odczytu, np. do śledzenia cieni kontaktowych, podczas gdy bufor szablonu jest zapisywany w celu identyfikacji pikseli do dalszego przetwarzania. Zobacz problem dawn:2146.

Aktualizacje o świcie

Nieobsłużone wywołanie zwrotne błędu ustawione za pomocą wgpuDeviceSetUncapturedErrorCallback() jest teraz wywoływane natychmiast po wystąpieniu błędu. Tego właśnie deweloperzy oczekują i potrzebują do debugowania. Zobacz change dawn:173620.

Zaimplementowano metodę wgpuSurfaceGetPreferredFormat()interfejsu webgpu.h API. Zobacz problem dawn:1362.

Obejmuje to tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.

Nowości w WebGPU

Lista wszystkich tematów omówionych w serii Co nowego w WebGPU.

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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