Nieuw in WebGPU (Chrome 128)

François Beaufort
François Beaufort

Experimenteren met subgroepen

De functie voor subgroepen maakt parallelle verwerking op SIMD-niveau mogelijk, waardoor threads binnen een groep kunnen communiceren en gezamenlijke wiskundige bewerkingen kunnen uitvoeren (bijvoorbeeld de som van 16 getallen berekenen). Dit is een zeer efficiënte vorm van gegevens delen tussen threads.

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

Je kunt ook subgroepen op je site uitproberen met echte gebruikers door je aan te melden voor de origin trial. Lees Aan de slag met oorsprongsproeven voor instructies om je site voor te bereiden op het gebruik van oorsprongsproeven. De origin trial loopt van Chrome 128 tot 131 (eindigt op 19 februari 2025). Ga naar Intentie om te experimenteren.

Als de "subgroups"-functie beschikbaar is in een GPUAdapter, vraag je een GPUDevice met deze functie aan om ondersteuning voor subgroepen in WGSL te krijgen en de minSubgroupSize- en maxSubgroupSize-limieten te controleren.

Je moet deze extensie ook expliciet aanzetten in je WGSL-code met enable subgroups;. Als deze functie aanstaat, 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 de grootte van subgroepen.
  • subgroupBallot(value): Retourneert een set bitvelden waarbij de bit die overeenkomt met subgroup_invocation_id 1 is als value waar is voor die actieve aanroep en anders 0.
  • subgroupBroadcast(value, id): Zendt de value van de aanroep met subgroup_invocation_id die overeenkomt met id uit naar alle aanroepen binnen de subgroep. Opmerking: id moet een constante zijn tijdens het compileren.

In de toekomst worden er meer ingebouwde functies toegevoegd, zoals subgroupAdd, subgroupAll, subgroupElect en subgroupShuffle. Ga naar probleem 354738715.

Als je f16 wilt toestaan in subgroepbewerkingen, vraag je een GPUDevice aan met de functies "subgroups", "subgroups-f16" en "shader-f16". Zet deze daarna aan in je WGSL-code met enable f16, subgroups, subgroups_f16;.

Het volgende codefragment biedt een basis om mee te experimenteren en de mogelijkheden van subgroepen te 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...

Dieptebias instellen voor lijnen en punten wordt beëindigd

Door een wijziging in de WebGPU-specificatie is het een validatiefout om depthBias, depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde die niet nul is als de topologie voor een weergavepijplijn een lijn- of punttype is. We tonen een waarschuwing in de DevTools-console over deze aankomende validatie en dwingen de waarden in deze omstandigheden af naar 0, zodat ontwikkelaars genoeg tijd hebben om hun code te updaten. Ga naar probleem 352567424.

Waarschuwing voor niet-opgevangen fout in DevTools verbergen als preventDefault

In de DevTools-console worden geen waarschuwingen meer getoond voor uncapturederror-gebeurtenissen als er een event-listener voor uncapturederror is geregistreerd en de methode Event preventDefault() is aangeroepen in de callback van de event-listener. Dit gedrag komt overeen met de gebeurtenisafhandeling in JavaScript. Raadpleeg 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 samplet eerst en daarna

Met het WGSL-kenmerk interpolate kunt u door de gebruiker gedefinieerde interpolatie van IO-gegevens beheren. Met de nieuwe interpolatie-samplingparameters first (standaard) en either heeft u meer controle: first gebruikt de waarde van het eerste hoekpunt van de primitieve vorm, terwijl either het eerste of laatste hoekpunt toestaat. Ga naar probleem 340278447.

Updates voor Dawn

De implementatie van WGPUFuture van Dawn om asynchrone bewerkingen af te handelen, is nu afgerond. Belangrijke concepten zijn onder andere wgpuInstanceProcessEvents voor opportunistische gebeurtenisverwerking en WGPUCallbackMode voor het definiëren van callback-locaties. WGPUFuture geeft eenmalige gebeurtenissen met een oneindige levensduur aan en wgpuInstanceWaitAny wacht op de voltooiing van een toekomst of een time-out. Ga naar probleem 42240932.

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

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

De methode Adapter::GetProperties() is beëindigd. Gebruik in plaats daarvan Adapter::GetInfo().

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

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