Co nowego w WebGPU (Chrome 123)

François Beaufort
François Beaufort

Obsługa funkcji wbudowanych DP4a w WGSL

DP4a (Dot Product of 4 Elements and Accumulate) to zestaw instrukcji GPU powszechnie używanych w wnioskowaniu w uczeniu głębokim na potrzeby kwantyzacji. Wydajnie wykonuje iloczyny skalarne liczb całkowitych 8-bitowych, aby przyspieszyć obliczenia takich modeli skwantyzowanych do int8. Może zaoszczędzić (do 75%) pamięci i przepustowości sieci oraz poprawić wydajność wszystkich modeli uczenia maszynowego w wnioskowaniu w porównaniu z ich wersją f32. Dzięki temu jest obecnie szeroko stosowany w wielu popularnych frameworkach AI.

Gdy rozszerzenie języka WGSL "packed_4x8_integer_dot_product" jest obecne w navigator.gpu.wgslLanguageFeatures, możesz teraz używać skalarów liczb całkowitych 32-bitowych, które pakują 4-składnikowe wektory liczb całkowitych 8-bitowych jako dane wejściowe do instrukcji iloczynu skalarnego w kodzie shadera WGSL za pomocą funkcji wbudowanych dot4U8Packed i dot4I8Packed. Możesz też używać instrukcji pakowania i rozpakowywania z zapakowanymi 4-składnikowymi wektorami liczb całkowitych 8-bitowych za pomocą funkcji wbudowanych WGSL pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 i unpack4xU8.

Zalecamy używanie dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires packed_4x8_integer_dot_product; na początku kodu shadera WGSL. Zobacz ten przykład i problem tint: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 końca tej specyfikacji i implementacji.

Nieograniczone parametry wskaźników w WGSL

Rozszerzenie "unrestricted_pointer_parameters" języka WGSL language extension łagodzi ograniczenia dotyczące tego, które wskaźniki można przekazywać 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.

Więcej informacji znajdziesz w artykule Pointers As Function Parameters | Tour of WGSL.

Tę funkcję można wykryć za pomocą navigator.gpu.wgslLanguageFeatures. Zalecamy, aby zawsze używać dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires unrestricted_pointer_parameters; na początku kodu shadera WGSL. Zobacz ten przykład, zmiany w specyfikacji WGSL i problem 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 kompozytów w WGSL

Gdy rozszerzenie "pointer_composite_access" 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 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 na zapisanie (*foo).bar. Gwiazdka (*) byłaby normalnie potrzebna do przekształcenia wskaźnika w „odniesienie”, które można dereferencjonować, ale teraz wskaźniki i odniesienia są do siebie znacznie bardziej podobne i prawie wymienne.

  • Jeśli foo nie jest wskaźnikiem, operator kropki (.) działa dokładnie tak, jak w przypadku bezpośredniego dostępu do elementów.

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

Zalecamy używanie dyrektywy requires, aby zasygnalizować potencjalną niezgodność z innymi platformami, za pomocą requires pointer_composite_access; na początku kodu shadera WGSL. Zobacz ten przykład i problem 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 szablonu tylko do odczytu w przepustkach renderowania wymagały, aby oba aspekty (głębia i szablon) były tylko do odczytu. To ograniczenie zostało zniesione. Teraz możesz używać aspektu głębi 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 Dawn

Funkcja zwrotna błędu nieprzechwyconego ustawiona za pomocą wgpuDeviceSetUncapturedErrorCallback() jest teraz wywoływana natychmiast po wystąpieniu błędu. Tego właśnie deweloperzy oczekują i chcą do debugowania. Zobacz zmianę dawn:173620.

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

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

Co nowego w WebGPU

Lista wszystkich informacji, które zostały omówione w serii Co nowego w WebGPU.

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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