Wat is er nieuw in WebGPU (Chrome 128)

François Beaufort
François Beaufort

Experimenteren met subgroepen

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

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

Je kunt ook subgroepen op je site met echte gebruikers uitproberen door je aan te melden voor de Origin-proef . Lees ' Aan de slag met Origin-proeven' voor instructies over hoe je je site kunt voorbereiden op het gebruik van Origin-proeven. De Origin-proef loopt van Chrome 128 tot en met 131 (tot en met 19 februari 2025). Zie 'Intent to Experiment' .

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

Je moet deze extensie ook expliciet inschakelen in je WGSL-code met enable subgroups; . Wanneer deze is ingeschakeld, krijg je 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 subgroepgrootte.
  • 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 0 anders.
  • subgroupBroadcast(value, id) : Verstuurt de value van de aanroep met subgroup_invocation_id die overeenkomt met id naar alle aanroepen binnen de subgroep. Opmerking: id moet een compile-time constante zijn.

In de toekomst zullen er meer ingebouwde functies worden toegevoegd, zoals subgroupAdd , subgroupAll , subgroupElect en subgroupShuffle . Zie issue 354738715 .

Om f16 toe te staan ​​in subgroepbewerkingen, vraagt ​​u een GPUDevice aan met de features "subgroups" , "subgroups-f16" en "shader-f16" , en schakelt u deze vervolgens in uw WGSL-code in 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...

Het instellen van dieptevoorkeur voor lijnen en punten wordt afgeraden.

Een wijziging in de WebGPU-specificaties zorgt ervoor dat het een validatiefout oplevert om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde die niet nul is, wanneer de topologie van een renderpipeline van het type lijn of punt is. Om ontwikkelaars voldoende tijd te geven hun code bij te werken, wordt er een waarschuwing in de DevTools Console weergegeven over deze aanstaande validatie, terwijl de waarden in deze gevallen ook automatisch op 0 worden gezet. Zie issue 352567424 .

Verberg niet-vastgelegde DevTools-foutwaarschuwing als preventDefault is ingeschakeld.

In de DevTools-console worden waarschuwingen voor uncapturederror -gebeurtenissen niet langer weergegeven als er een gebeurtenislistener voor uncapturederror is geregistreerd en de methode event preventDefault() is aangeroepen binnen de callback van de gebeurtenislistener. 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 of

Met het WGSL-attribuut interpolate kunt u de interpolatie van door de gebruiker gedefinieerde IO-gegevens beheren. De nieuwe parameters voor het bemonsteren van `interpolate`, first (standaard) en either bieden u nu extra controle: first gebruikt de waarde van het eerste hoekpunt van de primitief, terwijl either het eerste of laatste hoekpunt toestaat. Zie issue 340278447 .

Dawn-updates

De implementatie van Dawn's WGPUFuture voor het afhandelen van asynchrone bewerkingen is nu voltooid. Belangrijke concepten zijn onder andere wgpuInstanceProcessEvents voor opportunistische gebeurtenisverwerking en WGPUCallbackMode voor het definiëren van callbacklocaties. WGPUFuture duidt op 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 meer 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 issue 344814083 .

De methode Adapter::GetProperties() is verouderd en wordt vervangen door Adapter::GetInfo() .

Jaswant, een externe bijdrager, 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 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