Novidades da WebGPU (Chrome 123)

François Beaufort
François Beaufort

Suporte a funções integradas do DP4a na WGSL

DP4a (Produto Dot de 4 Elementos e Acumular) refere-se a um conjunto de instruções de GPU usadas com frequência na inferência de aprendizado profundo para quantização. Ela executa com eficiência produtos ponto inteiros de 8 bits para acelerar o cálculo desses modelos quantizados int8. Ele pode economizar (até 75%) da memória e largura de banda da rede e melhorar o desempenho de qualquer modelo de machine learning em inferências em comparação com a versão f32. Por isso, ela é muito usada em muitos frameworks de IA conhecidos.

Quando a extensão de linguagem "packed_4x8_integer_dot_product" da WGSL está presente no navigator.gpu.wgslLanguageFeatures, agora é possível usar escalares inteiros de 32 bits que empacotam vetores de quatro componentes de números inteiros de 8 bits como entradas para as instruções do produto escalar no código de sombreador da WGSL com as funções integradas dot4U8Packed e dot4I8Packed. Também é possível usar instruções de empacotamento e descompactação com vetores de quatro componentes compactados de números inteiros de 8 bits com funções integradas pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 e unpack4xU8 WGSL.

É recomendável usar uma diretiva obrigatória para sinalizar o potencial de não portabilidade com requires packed_4x8_integer_dot_product; na parte de cima do código de sombreador da WGSL. Consulte o exemplo a seguir e 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
  }`,
});

Um agradecimento especial à equipe Web Graphics da Intel em Xangai por conduzir esta especificação e implementação até a conclusão!

Parâmetros de ponteiro irrestrito na WGSL

A extensão de idioma "unrestricted_pointer_parameters" da WGSL reduz as restrições sobre quais ponteiros podem ser transmitidos para funções da WGSL:

  • Ponteiros de parâmetro de storage, uniform e workgroup endereçam espaços para funções declaradas pelo usuário.

  • Passar ponteiros para estruturar membros e elementos de matriz para funções declaradas pelo usuário

Confira Ponteiros como parâmetros de função | Tour da WGSL para saber mais.

Esse recurso pode ser detectado usando navigator.gpu.wgslLanguageFeatures. É recomendável sempre usar uma diretiva obrigatória para sinalizar o potencial de não portabilidade com requires unrestricted_pointer_parameters; na parte de cima do código de sombreador da WGSL. Confira o exemplo a seguir em mudanças nas especificações da WGSL e tom do 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);
  }`
});

Simplificação para desreferenciar compostos na WGSL

Quando a extensão de linguagem "pointer_composite_access" da WGSL está presente no navigator.gpu.wgslLanguageFeatures, o código do sombreador da WGSL agora oferece suporte ao acesso a componentes de tipos de dados complexos usando a mesma sintaxe de ponto (.), seja trabalhando diretamente com os dados ou com um ponteiro para eles. Veja como funciona:

  • Se foo for um ponteiro: foo.bar é uma maneira mais conveniente de escrever (*foo).bar. O asterisco (*) normalmente seria necessário para transformar o ponteiro em uma "referência" que pode ser desreferenciada, mas agora os ponteiros e as referências são muito mais semelhantes e quase intercambiáveis.

  • Se foo não for um ponteiro: o operador de ponto (.) vai funcionar exatamente como você faria para acessar diretamente os membros.

Da mesma forma, se pa for um ponteiro que armazena o endereço inicial de uma matriz, o uso de pa[i] oferecerá acesso direto ao local da memória em que o 'io elemento dessa matriz está armazenado.

É recomendável usar uma diretiva obrigatória para sinalizar o potencial de não portabilidade com requires pointer_composite_access; na parte de cima do código de sombreador da WGSL. Consulte o exemplo a seguir e 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.
  }`
});

Separar o estado somente leitura para aspectos de estêncil e profundidade

Antes, os anexos de estêncil de profundidade somente leitura em passagens de renderização exigiam que os dois aspectos (profundidade e estêncil) fossem somente leitura. Essa limitação foi removida. Agora, é possível usar o aspecto de profundidade no modo somente leitura para o rastreamento de sombra de contatos, por exemplo, enquanto o buffer de estêncil é gravado para identificar pixels para processamento adicional. Consulte problema dawn:2146.

Atualizações ao amanhecer

O callback de erro não capturado definido com wgpuDeviceSetUncapturedErrorCallback() agora é chamado imediatamente quando o erro ocorre É isso que os desenvolvedores esperam e querem com frequência para depuração. Consulte alterar amanhecer:173620.

O método wgpuSurfaceGetPreferredFormat() da API webgpu.h foi implementado. Consulte problema dawn:1362.

Esses são apenas alguns dos principais destaques. Confira a lista completa de confirmações (link em inglês).

Novidades da WebGPU

Uma lista de tudo o que foi abordado na série O que há de novo na WebGPU.

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Google Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Google Chrome 113