Wat is er nieuw in WebGPU (Chrome 123)

François Beaufort
François Beaufort

DP4a ingebouwde functies ondersteunen in WGSL

DP4a (Dot Product of 4 Elements and Accumulate) verwijst naar een reeks GPU-instructies die vaak worden gebruikt bij deep learning-inferentie voor kwantisering. Het voert efficiënt 8-bit 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 het inferenties verbeteren in vergelijking met hun f32-versie. Als gevolg hiervan wordt het nu intensief 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 gehele scalaire waarden gebruiken die 4-component vectoren van 8-bit gehele getallen verpakken als invoer voor de puntproductinstructies in uw WGSL-shadercode met de dot4U8Packed en dot4I8Packed ingebouwde functies. U kunt ook in- en uitpakinstructies gebruiken met ingepakte 4-componentenvectoren van 8-bit gehele getallen met pack4xI8 , pack4xU8 , pack4xI8Clamp , pack4xU8Clamp , unpack4xI8 en unpack4xU8 WGSL ingebouwde functies.

Het wordt aanbevolen om een ​​require-directive 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 Intel's Web Graphics-team in Shanghai voor het tot een goed einde brengen van deze specificatie en implementatie!

Onbeperkte pointerparameters in WGSL

De WGSL -taalextensie "unrestricted_pointer_parameters" versoepelt de beperkingen waarop pointers kunnen worden doorgegeven aan WGSL-functies:

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

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

Bekijk Pointers als functieparameters | Rondleiding door WGSL om er meer over te leren.

Deze functie kan worden gedetecteerd met behulp van navigator.gpu.wgslLanguageFeatures . Het wordt aanbevolen om altijd een require-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-specificatie verandert en geeft tint:2053 op .

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 behulp van dezelfde puntsyntaxis ( . ), ongeacht of u rechtstreeks met de gegevens werkt of met een wijs ernaar. Hier is hoe het werkt:

  • Als foo een pointer is: foo.bar is een handiger manier om (*foo).bar te schrijven. Het sterretje ( * ) zou normaal gesproken nodig zijn om van de aanwijzer een "referentie" te maken waarvan de verwijzingen kunnen worden verwijderd, maar nu lijken zowel aanwijzers als verwijzingen veel meer op elkaar en zijn ze bijna uitwisselbaar.

  • Als foo geen pointer is: De punt-operator ( . ) werkt precies zoals u gewend bent voor directe toegang tot leden.

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

Het wordt aanbevolen om een ​​require-directive 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-lezen-status voor stencil- en diepteaspecten

Voorheen vereisten alleen-lezen diepte-stencilbijlagen in renderpassages 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 geschreven om pixels te identificeren voor verdere verwerking. Zie uitgave Dawn:2146 .

Dawn-updates

De niet-opgevangen fout-callback die is ingesteld met wgpuDeviceSetUncapturedErrorCallback() wordt nu onmiddellijk aangeroepen wanneer de fout optreedt. Dit is wat ontwikkelaars consequent verwachten en willen bij het debuggen. Zie wijziging dageraad:173620 .

De methode wgpuSurfaceGetPreferredFormat() van de webgpu.h API is geïmplementeerd. Zie uitgave Dawn:1362 .

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

Wat is er nieuw in WebGPU

Een lijst met alles wat aan bod komt in de What's New in WebGPU -serie.

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