Novità di WebGPU (Chrome® 123)

François Beaufort
François Beaufort

Supporto delle funzioni integrate DP4a in WGSL

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

Quando in navigator.gpu.wgslLanguageFeatures è presente l'estensione di linguaggio WGSL "packed_4x8_integer_dot_product" in navigator.gpu.wgslLanguageFeatures, ora puoi utilizzare scalari interi a 32 bit che pacchettizzano vettori a 4 componenti di numeri interi a 8 bit come input alle istruzioni del prodotto scalare nel codice Shar WGSL con le funzioni integrate dot4U8Packed e dot4I8Packed. Puoi anche utilizzare le istruzioni di pacchettizzazione 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.

Ti consigliamo di utilizzare un'istruzione con i requisiti per segnalare il potenziale di non portabilità con requires packed_4x8_integer_dot_product; nella parte superiore del codice del tuo Shar WGSL. Vedi l'esempio seguente e il problema issue tint: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 Web Graphics di Intel di Shanghai per aver portato a termine questa specifica e implementazione.

Parametri puntatore senza limitazioni in WGSL

L'estensione di lingua WGSL "unrestricted_pointer_parameters" allenta le limitazioni relative ai puntatori che possono essere trasmessi alle funzioni WGSL:

  • I puntatori dei parametri di storage, uniform e workgroup indirizzano gli spazi alle funzioni dichiarate dall'utente.

  • Trasmettere puntatori alla struttura di membri ed elementi di array alle funzioni dichiarate dall'utente.

Guarda Pointer come parametri delle funzioni | Tour di WGSL per saperne di più.

Questa funzionalità può essere rilevata utilizzando navigator.gpu.wgslLanguageFeatures. Ti consigliamo di utilizzare sempre un'istruzione relativa ai requisiti per segnalare il potenziale di non portabilità con requires unrestricted_pointer_parameters; nella parte superiore del codice del tuo Shar WGSL. Guarda l'esempio riportato di seguito, ovvero le modifiche alle specifiche WGSL e issue tint: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 dello zucchero per il deriferimento dei composti in WGSL

Quando in navigator.gpu.wgslLanguageFeatures è presente l'estensione di linguaggio WGSL "pointer_composite_access" in navigator.gpu.wgslLanguageFeatures, il codice dello streamr WGSL ora supporta l'accesso a componenti di tipi di dati complessi che utilizzano la stessa sintassi del punto (.), indipendentemente 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ù conveniente per scrivere (*foo).bar. Generalmente, l'asterisco (*) serve per trasformare il puntatore in un "riferimento" che possono essere dereferenziati, ma ora sia i puntatori che i riferimenti sono molto più simili e quasi intercambiabili.

  • Se foo non è un puntatore: l'operatore del punto (.) funziona esattamente come sei abituato a fare per accedere direttamente ai membri.

Analogamente, 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 con i requisiti per segnalare il potenziale di non portabilità con requires pointer_composite_access; nella parte superiore del codice del tuo Shar WGSL. Vedi l'esempio seguente e il codice issue tint: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 gli aspetti relativi allo stencil e alla profondità

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

Aggiornamenti all'alba

Il callback dell'errore non acquisito impostato con wgpuDeviceSetUncapturedErrorCallback() viene ora chiamato immediatamente quando si verifica l'errore. Questo è 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.

Descrive 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 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