Novità di WebGPU (Chrome® 125)

François Beaufort
François Beaufort

Il numero di funzionalità di WebGPU potrebbe sembrare un po' scarso questa volta, ma alcuni importanti progressi sono dietro l'angolo. Le versioni future includeranno funzionalità quali miglioramenti della velocità di compilazione dello ShaD e modifiche al modello asincrono dell'implementazione mediante WGPUFuture.

Sottogruppi (funzionalità in fase di sviluppo)

La funzionalità dei sottogruppi abilita il parallelismo a livello di 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 estremamente efficiente di condivisione dei dati tra thread.

Le operazioni di sottogruppo sono supportate dalle moderne API GPU, ma i dettagli di denominazione e implementazione variano. Il team di Chrome ha identificato delle caratteristiche comuni e sta lavorando per standardizzare questa funzionalità. Consulta la proposta e il commento se hai domande.

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

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

Devi anche attivare esplicitamente questa estensione nel codice WGSL con enable chromium_experimental_subgroups. Quando l'opzione è attiva, puoi accedere 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 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 la chiamata attiva e 0 negli altri casi.
  • subgroupBroadcast(value, id): trasmette il value della chiamata con subgroup_invocation_id corrispondente id a tutte le chiamate all'interno del sottogruppo. Nota: id deve essere una costante di tempo di compilazione.

Il seguente snippet di codice fornisce una base su cui 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 su una fetta di texture 3D

Ora puoi eseguire il rendering direttamente su sezioni di texture 3D all'interno di pass di rendering, espandendo le sue funzionalità oltre il comune rendering di texture 2D, con il nuovo membro depthSlice in un GPURenderPassColorAttachment. Questa aggiunta consente, ad esempio, di creare scene ed effetti basati sul voxel, eseguendo il rendering direttamente nei volumi di texture 3D. Vedi issue dawn:1020.

Aggiornamenti da Dawn

Consulta l'elenco completo dei commit.

Novità di WebGPU

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

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Guida introduttiva di Chrome

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Versione 115 di Chrome

Chrome 114

Chrome 113