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 veelvuldig worden gebruikt in deep learning-inferentie voor kwantisering. Het voert efficiënt 8-bits integer dotproducten uit om de berekening van dergelijke int8-gekwantiseerde modellen te versnellen. Het kan (tot 75%) geheugen en netwerkbandbreedte besparen en de prestaties van machine learning-modellen in inferentie verbeteren in vergelijking met hun f32-versie. Daardoor wordt het nu veelvuldig gebruikt in diverse populaire AI-frameworks.

Wanneer de WGSL -taalextensie "packed_4x8_integer_dot_product" aanwezig is in navigator.gpu.wgslLanguageFeatures , kunt u nu 32-bits integer scalaire waarden, die 4-componenten vectoren van 8-bits integers bevatten, gebruiken als invoer voor de dotproductinstructies in uw WGSL-shadercode met de ingebouwde functies dot4U8Packed en dot4I8Packed . U kunt ook inpak- en uitpakinstructies gebruiken met ingepakte 4-componenten vectoren van 8-bits integers met de ingebouwde WGSL-functies pack4xI8 , pack4xU8 , pack4xI8Clamp , pack4xU8Clamp , unpack4xI8 en unpack4xU8 .

Het is aan te raden een `requires`-richtlijn te gebruiken om de mogelijke niet-draagbaarheid aan te geven met requires packed_4x8_integer_dot_product; bovenaan uw WGSL-shadercode. Zie het volgende voorbeeld en voer het commando `tint:1497` uit .

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 Web Graphics-team van Intel in Shanghai voor hun inzet bij de realisatie van deze specificatie en implementatie!

Onbeperkte pointerparameters in WGSL

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

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

  • Pointers naar structuurleden en array-elementen doorgeven aan door de gebruiker gedeclareerde functies.

Bekijk Pointers als functieparameters | Rondleiding door WGSL voor meer informatie.

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

Syntactische suiker voor het dereferentiëren van samengestelde typen 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 puntnotatie ( . ), 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. De asterisk ( * ) zou normaal gesproken nodig zijn om de pointer om te zetten in een "referentie" die kan worden gedereferentieerd, maar nu zijn pointers en referenties veel meer op elkaar gelijkend en bijna uitwisselbaar.

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

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

Het is aan te raden een `requires`-richtlijn te gebruiken om de mogelijke niet-portabiliteit aan te geven met requires pointer_composite_access; bovenaan uw WGSL-shadercode. Zie het volgende voorbeeld en voer het probleem `tint:2113` uit .

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

Aparte alleen-lezen-status voor stencil- en diepteaspecten

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

Dawn-updates

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

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

Dit is slechts een greep uit de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU?

Een lijst van alles wat in de serie ' Wat is nieuw in WebGPU' aan bod is gekomen.

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