Wat is er nieuw in WebGPU (Chrome 123)

François Beaufort
François Beaufort

Ondersteuning voor ingebouwde DP4a-functies in WGSL

DP4a (Dot Product of 4 Elements and Accumulate) verwijst naar een set GPU-instructies die veel gebruikt worden in deep learning-inferentie voor kwantificering. Het voert efficiënt 8-bits integer dot-producten uit om de berekening van dergelijke int8-gekwantiseerde modellen te versnellen. Het kan (tot 75%) geheugen- en netwerkbandbreedte besparen en de prestaties van alle machine learning-modellen bij inferentie verbeteren in vergelijking met hun f32-versie. Hierdoor wordt het nu veelvuldig gebruikt binnen veel populaire AI-frameworks.

Wanneer de WGSL -taalextensie "packed_4x8_integer_dot_product" aanwezig is in navigator.gpu.wgslLanguageFeatures , kunt u nu 32-bits integer-scalairen gebruiken om 4-componentvectoren van 8-bits integers te verpakken als invoer voor de dot-productinstructies in uw WGSL-shadercode met de ingebouwde functies dot4U8Packed en dot4I8Packed . U kunt ook inpak- en uitpakinstructies gebruiken met verpakte 4-componentvectoren van 8-bits integers met de ingebouwde WGSL-functies pack4xI8 , pack4xU8 , pack4xI8Clamp , pack4xU8Clamp , unpack4xI8 en unpack4xU8 .

Het is aan te raden om een ​​requires-richtlijn te gebruiken om de mogelijkheid van niet-portabiliteit aan te geven met requires packed_4x8_integer_dot_product; bovenaan uw WGSL-shadercode. Zie het volgende voorbeeld en geef tint:1497 op .

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
  }`,
});

Speciale dank aan het Intel Web Graphics-team in Shanghai voor het voltooien van deze specificatie en implementatie!

Onbeperkte pointerparameters in WGSL

De WGSL -taaluitbreiding "unrestricted_pointer_parameters" versoepelt de beperkingen op welke pointers kunnen worden doorgegeven aan WGSL-functies:

  • Parameteraanwijzers van storage , uniform en workgroup naar door de gebruiker gedeclareerde functies.

  • Het doorgeven van pointers naar structuurleden en array-elementen aan door de gebruiker gedeclareerde functies.

Bekijk Pointers As Function Parameters | Tour of WGSL om er meer over te weten te komen.

Deze feature kan worden gedetecteerd met behulp van navigator.gpu.wgslLanguageFeatures . Het is aan te raden om altijd een requires-directive te gebruiken om de mogelijkheid van niet-portabiliteit aan te geven met requires unrestricted_pointer_parameters; bovenaan uw WGSL-shadercode. Zie het volgende voorbeeld, de WGSL-specificatiewijzigingen en het probleem 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);
  }`
});

Syntaxissuiker voor het derefereren van composieten in WGSL

Wanneer de WGSL -taalextensie "pointer_composite_access" aanwezig is in navigator.gpu.wgslLanguageFeatures , ondersteunt uw WGSL-shadercode nu toegang tot componenten van complexe gegevenstypen met dezelfde puntsyntaxis ( . ), ongeacht of u direct met de gegevens werkt of met een pointer ernaar. Zo werkt het:

  • Als foo een pointer is: foo.bar is een handigere manier om (*foo).bar te schrijven. Normaal gesproken zou de asterisk ( * ) nodig zijn om de pointer om te zetten in een "referentie" die kan worden gederefereerd, maar nu lijken zowel pointers als referenties veel meer op elkaar en zijn ze bijna uitwisselbaar.

  • Als foo geen aanwijzer is: De puntoperator ( . ) werkt precies zoals u gewend bent voor directe toegang tot leden.

Op dezelfde manier, als pa een aanwijzer is die het startadres van een array opslaat, dan geeft het gebruik van pa[i] u directe toegang tot de geheugenlocatie waar het 'i -de element van die array is opgeslagen.

Het is aan te raden om een ​​requires-richtlijn te gebruiken om de mogelijkheid van niet-portabiliteit aan te geven met requires pointer_composite_access; bovenaan uw WGSL-shadercode. Zie het volgende voorbeeld en geef tint:2113 op .

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.
  }`
});

Afzonderlijke alleen-lezenstatus voor stencil- en diepteaspecten

Voorheen vereisten alleen-lezen diepte-stencil-bijlagen in renderpassen dat beide aspecten (diepte en stencil) alleen-lezen waren. Deze beperking is opgeheven. Nu kunt u het diepteaspect alleen-lezen gebruiken, bijvoorbeeld voor het traceren van contactschaduwen, terwijl de stencilbuffer wordt weggeschreven om pixels te identificeren voor verdere verwerking. Zie issue dawn:2146 .

Dawn-updates

De callback voor niet-vastgelegde fouten die is ingesteld met wgpuDeviceSetUncapturedErrorCallback() wordt nu direct aangeroepen wanneer de fout optreedt. Dit is wat ontwikkelaars consequent verwachten en willen voor foutopsporing. Zie wijziging dawn:173620 .

De wgpuSurfaceGetPreferredFormat() -methode van de webgpu.h API is geïmplementeerd. Zie issue dawn:1362 .

Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU

Een lijst met alles wat in de serie Wat is er nieuw in WebGPU is behandeld.

Chroom 138

Chroom 137

Chroom 136

Chroom 135

Chroom 134

Chroom 133

Chroom 132

Chroom 131

Chroom 130

Chroom 129

Chroom 128

Chroom 127

Chroom 126

Chroom 125

Chroom 124

Chroom 123

Chroom 122

Chroom 121

Chroom 120

Chroom 119

Chroom 118

Chroom 117

Chroom 116

Chroom 115

Chroom 114

Chroom 113