Novità di WebGPU (Chrome® 123)

François Beaufort
François Beaufort

Supporto delle funzioni integrate DP4a in WGSL

DP4a (Dot Product of 4 Elements and Accumulate) si riferisce a un insieme di istruzioni GPU comunemente utilizzate nell'inferenza di deep learning per la quantizzazione. Esegue in modo efficiente prodotti punti con numeri interi a 8 bit per accelerare il calcolo di questi modelli quantizzati int8. Può risparmiare (fino al 75%) la memoria e la larghezza di banda di rete e migliorare le prestazioni di qualsiasi modello di machine learning nell'inferenza rispetto alla versione f32. Di conseguenza, viene molto utilizzata all'interno di molti framework di IA popolari.

Quando l'estensione della lingua WGSL "packed_4x8_integer_dot_product" è presente in navigator.gpu.wgslLanguageFeatures, ora puoi usare scalari interi a 32 bit che impacchettano vettori a 4 componenti di numeri interi a 8 bit come input per le istruzioni del prodotto scalare nel codice dello smoother WGSL con le funzioni integrate dot4U8Packed e dot4I8Packed. Puoi anche utilizzare le istruzioni di imballaggio e decompressione con vettori a quattro componenti compressi di numeri interi a 8 bit con funzioni integrate di pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 e unpack4xU8 WGSL integrate.

Ti consigliamo di utilizzare un'istruzione richiede-indica per segnalare il potenziale di non portabilità con requires packed_4x8_integer_dot_product; nella parte superiore del codice dello strumento di Shader WGSL. Vedi l'esempio seguente e tinta del problema:1497.

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires packed_4x8_integer_dot_product;

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

Un ringraziamento speciale al team di Web Graphics di Intel a Shanghai per aver completato queste specifiche e implementando queste specifiche!

Parametri puntatore senza limitazioni in WGSL

L'estensione di lingua WGSL "unrestricted_pointer_parameters" allenta le limitazioni su quali puntatori possono essere trasferiti alle funzioni WGSL:

  • Puntatori dei parametri degli spazi di indirizzi storage, uniform e workgroup alle funzioni dichiarate dall'utente.

  • Passare puntatori ai membri della struttura e agli elementi dell'array alle funzioni dichiarate dall'utente.

Per saperne di più, consulta Pointers As Function Parameters | Tour di WGSL.

È possibile rilevare questa funzionalità utilizzando navigator.gpu.wgslLanguageFeatures. Si consiglia di utilizzare sempre un'istruzione richiede-istruzione per segnalare il potenziale di non portabilità con requires unrestricted_pointer_parameters; nella parte superiore del codice dello strumento di Shader WGSL. Vedi nell'esempio che segue, le modifiche alle specifiche di WGSL e la tintura del problema:2053.

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires unrestricted_pointer_parameters;

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

Sintassi della sintassi per il deriferimento dei compositi in WGSL

Quando l'estensione per la lingua WGSL "pointer_composite_access" è presente in navigator.gpu.wgslLanguageFeatures, il codice Shader WGSL ora supporta l'accesso ai componenti di tipi di dati complessi con la stessa sintassi con il punto (.), a prescindere dal fatto che tu stia lavorando direttamente con i dati o con un puntatore. Ecco come funziona:

  • Se foo è un puntatore: foo.bar è un modo più comodo per scrivere (*foo).bar. L'asterisco (*) è normalmente necessario per trasformare il puntatore in un "riferimento" che può essere dereferenziato, ma ora puntatori e riferimenti sono molto più simili e quasi intercambiabili.

  • Se foo non è un puntatore: il punto (.) funziona esattamente come fai di solito per accedere direttamente ai membri.

Allo stesso modo, se pa è un puntatore che memorizza l'indirizzo iniziale di un array, l'uso di pa[i] ti consente di accedere direttamente alla posizione di memoria in cui è archiviato l'elemento 'i di quell'array.

Ti consigliamo di utilizzare un'istruzione richiede-indica per segnalare il potenziale di non portabilità con requires pointer_composite_access; nella parte superiore del codice dello strumento di Shader WGSL. Vedi l'esempio seguente e tinta del problema:2113.

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires pointer_composite_access;

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

Stato di sola lettura separato per aspetti stencil e di profondità

In precedenza, gli allegati di stencil di profondità di sola lettura nei passaggi di rendering richiedevano che entrambi gli aspetti (profondità e stencil) fossero di sola lettura. Questa limitazione è stata rimossa. Ora puoi utilizzare l'aspetto della profondità in sola lettura, ad esempio per il tracciamento delle ombre dei contatti, mentre il buffer dello stencil viene scritto per identificare i pixel per un'ulteriore elaborazione. Vedi issue dawn:2146.

Aggiornamenti da Dawn

Il callback di errore non acquisito impostato con wgpuDeviceSetUncapturedErrorCallback() viene ora chiamato immediatamente quando si verifica l'errore. È ciò che gli sviluppatori si aspettano e vogliono sempre per il debug. Vedi change dawn:173620.

Il metodo wgpuSurfaceGetPreferredFormat() dell'API webgpu.h è stato implementato. Vedi issue dawn:1362.

Vengono trattati solo alcuni dei punti salienti. 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