Wat is er nieuw in WebGPU (Chrome 128)

François Beaufort
François Beaufort

Experimenteren met subgroepen

De subgroepenfunctie maakt parallellisme op SIMD-niveau mogelijk, waardoor threads binnen een groep kunnen communiceren en collectieve wiskundige bewerkingen kunnen uitvoeren (bijvoorbeeld het berekenen van de som van 16 getallen). Dit biedt een zeer efficiënte vorm van gegevensuitwisseling tussen threads.

Een minimale implementatie van het subgroepenvoorstel is beschikbaar voor lokale tests achter de vlag "Unsafe WebGPU Support" op chrome://flags/#enable-unsafe-webgpu .

Je kunt subgroepen op je site ook uitproberen met echte gebruikers door je aan te melden voor de proefperiode van Origin . Lees Aan de slag met proefperiodes van Origin voor instructies over hoe je je site kunt voorbereiden op het gebruik van proefperiodes van Origin. De proefperiode van Origin loopt van Chrome 128 tot en met 131 (eindigt op 19 februari 2025). Zie 'Intentie om te experimenteren' .

Wanneer de functie "subgroups" beschikbaar is in een GPUAdapter , vraag dan een GPUDevice met deze functie aan om ondersteuning voor subgroepen in WGSL te krijgen en controleer de limieten minSubgroupSize en maxSubgroupSize .

U moet deze extensie ook expliciet inschakelen in uw WGSL-code met enable subgroups; . Wanneer deze optie is ingeschakeld, krijgt u toegang tot de volgende toevoegingen:

  • subgroup_invocation_id : een ingebouwde waarde voor de index van de thread binnen de subgroep.
  • subgroup_size : een ingebouwde waarde voor toegang tot subgroepgrootte.
  • subgroupBallot(value) : Retourneert een set bitvelden waarbij de bit die overeenkomt met subgroup_invocation_id 1 is als value true is voor die actieve aanroep en 0 anders.
  • subgroupBroadcast(value, id) : Zendt de value van de aanroep met subgroup_invocation_id , overeenkomend id uit naar alle aanroepen binnen de subgroep. Let op: id moet een compile-time constante zijn.

Meer ingebouwde functies zoals subgroupAdd , subgroupAll , subgroupElect en subgroupShuffle zullen in de toekomst worden toegevoegd. Zie issue 354738715 .

Om f16 in subgroepbewerkingen toe te staan, vraagt ​​u een GPUDevice aan met de functies "subgroups" , "subgroups-f16" en "shader-f16" . Schakel deze vervolgens in uw WGSL-code in met enable f16, subgroups, subgroups_f16; .

Het volgende codefragment biedt een basis waarmee u kunt experimenteren en de mogelijkheden van subgroepen kunt ontdekken.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

Diepteafwijking voor lijnen en punten afschaffen

Door een wijziging in de WebGPU-specificatie is het een validatiefout om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde anders dan nul wanneer de topologie voor een renderpijplijn een lijn- of punttype is. Om ontwikkelaars voldoende tijd te geven om hun code bij te werken, wordt in de DevTools Console een waarschuwing weergegeven over deze aanstaande validatie, terwijl de waarden in deze omstandigheden ook op 0 worden geforceerd. Zie probleem 352567424 .

Verberg niet-vastgelegde fout DevTools-waarschuwing als preventDefault

In de DevTools Console worden waarschuwingen voor uncapturederror -gebeurtenissen niet meer weergegeven als er een event listener voor uncapturederror is geregistreerd en de Event preventDefault() methode is aangeroepen binnen de callback van de event listener. Dit gedrag komt overeen met de gebeurtenisafhandeling in JavaScript. Zie het volgende voorbeeld en probleem 40263619 .

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL interpoleert eerst de bemonstering en ofwel

Met het WGSL- interpolate kunt u door de gebruiker gedefinieerde I/O-data-interpolatie beheren. Nieuwe interpolatiebemonsteringsparameters ( first , standaard) geven u either extra controle: first gebruikt de waarde van het eerste hoekpunt van de primitieve, terwijl either de waarde van het eerste of het laatste hoekpunt wordt toegestaan. Zie probleem 340278447 .

Dawn-updates

De implementatie van Dawn's WGPUFuture voor het verwerken van asynchrone bewerkingen is nu voltooid. Belangrijke concepten zijn onder andere wgpuInstanceProcessEvents voor opportunistische gebeurtenisverwerking en WGPUCallbackMode voor het definiëren van callbacklocaties. WGPUFuture staat voor eenmalige gebeurtenissen met een oneindige levensduur, en wgpuInstanceWaitAny wacht op de voltooiing van een future of een time-out. Zie issue 42240932 .

De waarde CompositeAlphaMode::Auto wordt nu niet gerapporteerd door Surface::GetCapabilities() . Deze is nog steeds geldig en gelijk aan Surface::GetCapabilities().alphaMode[0] . Zie probleem 292 .

De OpenGL-backend ondersteunt nu Surface met een y-flip blit voor elke Present() aanroep. Zie probleem 344814083 .

De Adapter::GetProperties() -methode is verouderd en maakt plaats voor Adapter::GetInfo() .

Jaswant, een externe medewerker, heeft alle CMake-bestanden herschreven, waardoor ze gemakkelijker te updaten zijn en pre-builds mogelijk zijn. Bekijk de snelstartgids voor het gebruik van Dawn in CMake-projecten.

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 140

Chroom 139

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