Novità di WebGPU (Chrome 128)

François Beaufort
François Beaufort

Sperimentare con i sottogruppi

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.

Un'implementazione minima della proposta di sottogruppi è disponibile per i test locali dietro il flag "Supporto WebGPU non sicuro" all'indirizzo chrome://flags/#enable-unsafe-webgpu.

Puoi anche provare i sottogruppi sul tuo sito con utenti reali registrandoti alla prova dell'origine. Leggi l'articolo Iniziare a utilizzare le prove delle origini per istruzioni su come preparare il tuo sito per l'utilizzo delle prove delle origini. La prova dell'origine verrà eseguita da Chrome 128 a 131 (terminerà il 19 febbraio 2025). Consulta Intenzione di eseguire esperimenti.

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

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

  • subgroup_invocation_id: un valore predefinito 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 subgroupBallot(value) è 1 se value è true per l'invocazione attiva e 0 in caso contrario.subgroup_invocation_id
  • 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.

In futuro verranno aggiunte altre funzioni integrate come subgroupAdd, subgroupAll, subgroupElect, subgroupShuffle. Vedi issue 354738715.

Per consentire f16 nelle operazioni dei sottogruppi, richiedi un GPUDevice con le funzionalità "subgroups", "subgroups-f16" e "shader-f16", quindi attivalo 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...

Ritiro del supporto dell'impostazione della bias di profondità per linee e punti

Una modifica alle specifiche WebGPU rende un errore di convalida l'impostazione di depthBias, depthBiasSlopeScale e depthBiasClamp su un valore diverso da zero quando la topologia di una pipeline di rendering è di tipo linea o punto. Per dare agli sviluppatori tempo sufficiente per aggiornare il codice, nella console DevTools viene visualizzato un avviso relativo a questa convalida imminente, oltre a forzare i valori su 0 in queste circostanze. Vedi il problema 352567424.

Nascondere l'avviso di DevTools relativo a un errore non rilevato se preventDefault

Nella console di 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 esegue prima l'interpolazione del campionamento e poi:

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

Aggiornamenti di Dawn

L'implementazione di WGPUFuture di Dawn per gestire le operazioni asincrone è stata completata. I concetti chiave includono wgpuInstanceProcessEvents per l'elaborazione opportunistica degli eventi e WGPUCallbackMode per definire le posizioni dei callback. WGPUFuture indica eventi una tantum con una durata infinita e wgpuInstanceWaitAny attende il completamento di qualsiasi futuro o un timeout. Vedi issue 42240932.

Il valore CompositeAlphaMode::Auto ora non viene segnalato da Surface::GetCapabilities(). È ancora valido ed equivalente a Surface::GetCapabilities().alphaMode[0]. Vedi issue 292.

Il backend OpenGL ora supporta Surface con un blit con inversione Y per ogni chiamata Present(). Vedi issue 344814083.

Il metodo Adapter::GetProperties() è deprecato in favore dell'utilizzo di Adapter::GetInfo().

Jaswant, un collaboratore esterno, ha riscritto tutti i file CMake, semplificandone l'aggiornamento e consentendo le pre-build. Consulta la guida rapida per l'utilizzo di Dawn nei progetti CMake.

Sono riportati solo alcuni dei punti salienti. 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