Novità di WebGPU (Chrome 128)

François Beaufort
François Beaufort

Sperimentare con i sottogruppi

La funzionalità dei sottogruppi consente il parallelismo a livello SIMD, consentendo ai thread all'interno di un gruppo di comunicare ed eseguire operazioni matematiche collettive (ad esempio, calcolare la somma di 16 numeri). Ciò fornisce una forma di condivisione dei dati tra thread altamente efficiente.

Una implementazione minima della proposta dei sottogruppi è disponibile per i test locali dietro il flag "Unsafe WebGPU Support" all'indirizzo chrome://flags/#enable-unsafe-webgpu.

Puoi anche provare i sottogruppi sul tuo sito con utenti reali registrandoti alla prova dell'origine. Leggi Inizia a utilizzare le prove dell'origine per istruzioni su come preparare il tuo sito all'utilizzo delle prove dell'origine. La prova dell'origine verrà eseguita da Chrome 128 a 131 (termina il 19 febbraio 2025). Consulta Intent to Experiment.

Quando la funzionalità "subgroups" è disponibile in un GPUAdapter, richiedi un GPUDevice con questa funzionalità per ottenere il supporto dei sottogruppi in WGSL e controlla i limiti minSubgroupSize e maxSubgroupSize.

Devi anche abilitare esplicitamente questa estensione nel codice WGSL con enable subgroups;. Una volta abilitata, avrai accesso alle seguenti aggiunte:

  • subgroup_invocation_id: un valore integrato per l'indice del thread all'interno del sottogruppo.
  • subgroup_size: un valore integrato per l'accesso alle dimensioni del sottogruppo.
  • subgroupBallot(value): restituisce un insieme di campi di bit in cui il bit corrispondente a subgroup_invocation_id è 1 se value è true per la chiamata attiva e 0 in caso contrario.
  • subgroupBroadcast(value, id): trasmette il value dalla chiamata con subgroup_invocation_id corrispondente a id a tutte le chiamate all'interno del sottogruppo. Nota: id deve essere una costante in fase di compilazione.

In futuro verranno aggiunte altre funzioni integrate come subgroupAdd, subgroupAll, subgroupElect, subgroupShuffle. Consulta il problema 354738715.

Per consentire f16 nelle operazioni dei sottogruppi, richiedi un GPUDevice con le funzionalità "subgroups", "subgroups-f16" e "shader-f16", quindi abilitalo nel codice WGSL con enable f16, subgroups, subgroups_f16;.

Il seguente snippet di codice fornisce una base per sperimentare e scoprire il potenziale dei sottogruppi.

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...

Deprecare l'impostazione della distorsione della profondità per linee e punti

Una modifica delle specifiche di WebGPU fa sì che l'impostazione di depthBias, depthBiasSlopeScale e depthBiasClamp su un valore diverso da zero quando la topologia per una pipeline di rendering è di tipo linea o punto generi un errore di convalida. Per dare agli sviluppatori il tempo sufficiente per aggiornare il codice, nella console degli strumenti DevTools viene visualizzato un avviso relativo alla convalida imminente, forzando al contempo i valori a 0 in queste circostanze. Consulta il problema 352567424.

Nascondere l'avviso degli strumenti DevTools relativo agli errori non acquisiti se preventDefault

Nella console degli strumenti DevTools, gli avvisi per gli eventi uncapturederror non vengono più visualizzati se è stato registrato un listener di eventi per uncapturederror e il metodo Event preventDefault() è stato chiamato all'interno del callback del listener di eventi. Questo comportamento corrisponde alla gestione degli eventi in JavaScript. Consulta l'esempio seguente e il problema 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 interpola prima il campionamento e poi

L'attributo interpolate di WGSL consente di gestire l'interpolazione dei dati di input/output definiti dall'utente. Ora, i nuovi parametri di campionamento dell'interpolazione first (valore predefinito) e either offrono un controllo aggiuntivo: first utilizza il valore del primo vertice della primitiva, mentre either consente il primo o l'ultimo vertice. Consulta il problema 340278447.

Aggiornamenti di Dawn

L'implementazione di WGPUFuture di Dawn per la gestione delle operazioni asincrone è ora completa. I concetti chiave includono wgpuInstanceProcessEvents per l'elaborazione opportunistica degli eventi e WGPUCallbackMode per la definizione delle posizioni di callback. WGPUFuture indica eventi una tantum con una durata infinita, mentre wgpuInstanceWaitAny attende il completamento di qualsiasi futuro o un timeout. Consulta il problema 42240932.

Il valore CompositeAlphaMode::Auto non viene più segnalato da Surface::GetCapabilities(). È ancora valido ed equivalente a Surface::GetCapabilities().alphaMode[0]. Consulta il problema 292.

Il backend OpenGL ora supporta Surface con un blit di inversione verticale per ogni chiamata Present(). Consulta il problema 344814083.

Il metodo Adapter::GetProperties() è deprecato. Utilizza invece Adapter::GetInfo().

Jaswant, un contributore esterno, ha riscritto tutti i file CMake, rendendoli più facili da aggiornare e consentendo le precompilazioni. Consulta la guida rapida per l'utilizzo di Dawn nei progetti CMake.

Questi sono solo alcuni dei punti salienti. Consulta l'elenco esaustivo dei commit.

Novità di WebGPU

Un elenco di tutti gli argomenti trattati nella serie Novità di WebGPU.

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