Novità di WebGPU (Chrome® 125)

François Beaufort
François Beaufort

Il numero di funzionalità WebGPU potrebbe sembrare un po' ridotto questa volta, ma alcuni importanti progressi sono dietro l'angolo. Le versioni future includeranno funzionalità come miglioramenti alla velocità di compilazione degli shader e modifiche al modello asincrono dell'implementazione utilizzando WGPUFuture.

Gruppi secondari (funzionalità in fase di sviluppo)

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

Le operazioni sui sottogruppi sono supportate dalle API GPU moderne, ma i dettagli di denominazione e implementazione variano. Il team di Chrome ha identificato le analogie e ora si sta adoperando per standardizzare questa funzionalità. Consulta la proposta e commenta se hai domande.

Esiste un'implementazione minima e non standardizzata dei sottogruppi dietro il flag "Funzionalità sperimentali della piattaforma web" in chrome://flags/#enable-experimental-web-platform-features, in modo che gli sviluppatori possano provarlo e condividere feedback, poiché i vantaggi reali non sono stati ancora dimostrati nel contesto di WebGPU.

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

Devi anche attivare esplicitamente questa estensione nel codice WGSL con enable chromium_experimental_subgroups. Se l'opzione è attivata, hai accesso alle seguenti aggiunte:

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

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("chromium-experimental-subgroups")) {
  throw new Error("Experimental subgroups support is not available");
}
// Explicitly request experimental subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-subgroups"],
});

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

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

Esegui il rendering in un'incisione della texture 3D

Ora puoi eseguire il rendering direttamente in una o più sezioni di texture 3D all'interno dei passaggi di rendering, espandendo le funzionalità oltre il rendering delle texture 2D comuni, con il nuovo membro depthSlice in un GPURenderPassColorAttachment. Questa aggiunta ti consente, ad esempio, di creare scene ed effetti basati su voxel eseguendo il rendering direttamente in volumi di texture 3D. Vedi issue dawn:1020.

Aggiornamenti di Dawn

Consulta l'elenco completo dei commit.

Novità di WebGPU

Un elenco di tutto ciò che è stato trattato nella serie Novità di WebGPU.

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