Novità di WebGPU (Chrome® 125)

François Beaufort
François Beaufort

Il numero di funzionalità WebGPU potrebbe sembrare un po' scarso questa volta, ma alcuni importanti progressi sono dietro l'angolo. Le release future includeranno funzionalità come i miglioramenti della velocità di compilazione dello shaker e le modifiche al modello asincrono dell'implementazione utilizzando 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 molto efficiente di condivisione dei dati tra thread.

Le operazioni dei sottogruppi sono supportate dalle API GPU moderne, ma i dettagli di denominazione e implementazione variano. Il team di Chrome ha individuato gli aspetti in comune e sta lavorando per standardizzare questa funzionalità. Per eventuali domande, consulta la proposta e il commento.

Esiste un'implementazione minima e non standardizzata dei sottogruppi alla base delle "Funzionalità sperimentali della piattaforma web" flag all'indirizzo chrome://flags/#enable-experimental-web-platform-features per consentire agli sviluppatori di provarlo e condividere feedback, poiché i vantaggi reali non sono ancora stati dimostrati nel contesto di WebGPU.

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

Devi inoltre abilitare 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 del sottogruppo.
  • subgroupBallot(value): Restituisce un insieme di campi di bit in cui il bit corrispondente a subgroup_invocation_id è 1 se value è vero per quella chiamata attiva e 0 negli altri casi.
  • subgroupBroadcast(value, id): trasmette il valore value dalla chiamata con subgroup_invocation_id corrispondente a id a tutte le chiamate all'interno del sottogruppo. Nota: id deve essere una costante di compilazione.

Il seguente snippet di codice fornisce una base con 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().
  }`,
});

Rendering su una porzione di texture 3D

Ora puoi eseguire il rendering direttamente su sezioni di texture 3D all'interno dei passaggi di rendering, espandendone le funzionalità oltre il comune rendering delle 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 delle texture 3D. Vedi issue dawn:1020.

Aggiornamenti all'alba

Consulta l'elenco completo dei commit.

Novità di WebGPU

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

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