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 reeks GPU-instructies die veelgebruikt worden bij deeplearning-inferentie voor kwantisering. De chip voert efficiënt 8-bits gehele inwendige producten uit om de berekening van dergelijke int8-gekwantiseerde modellen te versnellen. Het kan tot 75% van het geheugen en de netwerkbandbreedte besparen en de prestaties van machine learning-modellen bij gevolgtrekkingen verbeteren in vergelijking met de f32-versie. Daarom wordt het nu veel gebruikt in veel populaire AI-frameworks.

Als de "packed_4x8_integer_dot_product" WGSL taalextensie aanwezig is in navigator.gpu.wgslLanguageFeatures, kun je nu 32-bits gehele getallen gebruiken die 4-componentenvectoren van 8-bits gehele getallen verpakken als invoer voor de instructies voor het inwendig product in je WGSL-shadercode met de ingebouwde functies dot4U8Packed en dot4I8Packed. Je kunt ook in- en uitpakinstructies gebruiken met ingepakte 4-componentenvectoren van 8-bits gehele getallen met de ingebouwde WGSL-functies pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 en unpack4xU8.

We raden je aan een requires-richtlijn te gebruiken om de kans op niet-overdraagbaarheid aan te geven met requires packed_4x8_integer_dot_product; bovenaan je WGSL-shadercode. Zie het volgende voorbeeld en issue 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
  }`,
});

Speciale dank aan het Web Graphics-team van Intel in Shanghai voor de afronding van deze specificatie en implementatie.

Onbeperkte aanwijzerparameters in WGSL

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

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

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

Ga naar Pointers As Function Parameters | Tour of WGSL voor meer informatie.

Je kunt deze functie detecteren met navigator.gpu.wgslLanguageFeatures. We raden je aan altijd een requires-richtlijn te gebruiken om de kans op niet-overdraagbaarheid aan te geven met requires unrestricted_pointer_parameters; bovenaan je WGSL-shadercode. Raadpleeg 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 dereferencing van composieten in WGSL

Als de "pointer_composite_access"WGSL-taalextensie aanwezig is in navigator.gpu.wgslLanguageFeatures, ondersteunt je WGSL-shadercode nu toegang tot componenten van complexe gegevenstypen met dezelfde puntnotatie (.), of je nu rechtstreeks met de gegevens werkt of met een pointer ernaar. Dit werkt als volgt:

  • Als foo een aanwijzer is: foo.bar is een handigere manier om (*foo).bar te schrijven. Normaal gesproken is het sterretje (*) nodig om van de pointer een verwijzing te maken die kan worden gedereferentieerd, maar nu zijn pointers en verwijzingen veel vergelijkbaarder en bijna uitwisselbaar.

  • Als foo geen aanwijzer is: De puntoperator (.) werkt precies zoals je gewend bent om rechtstreeks toegang te krijgen tot leden.

Als pa een pointer is die het startadres van een array opslaat, krijg je met pa[i] rechtstreeks toegang tot de geheugenlocatie waar het 'i-de element van die array is opgeslagen.

We raden je aan een requires-richtlijn te gebruiken om de kans op niet-overdraagbaarheid aan te geven met requires pointer_composite_access; bovenaan je WGSL-shadercode. Bekijk het volgende voorbeeld en 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.
  }`
});

Afzonderlijke alleen-lezen status voor stencils en diepteaspecten

Eerder moesten beide aspecten (diepte en stencil) alleen-lezen zijn voor alleen-lezen diepte-stencilbijlagen in weergave-passes. Deze beperking is opgeheven. Je kunt het diepteaspect nu alleen-lezen gebruiken, bijvoorbeeld om contactschaduwen te traceren, terwijl het stencilbuffer wordt geschreven om pixels te identificeren voor verdere verwerking. Ga naar probleem dawn:2146.

Updates voor Dawn

De callback voor niet-vastgelegde fouten die is ingesteld met wgpuDeviceSetUncapturedErrorCallback(), wordt nu onmiddellijk aangeroepen als de fout optreedt. Dit is wat ontwikkelaars consequent verwachten en willen voor foutopsporing. Ga naar change dawn:173620.

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

Dit zijn maar enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.

Wat is er nieuw in WebGPU?

Een lijst met alles wat is behandeld in de serie Nieuw in WebGPU.

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

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