Novidades da WebGPU (Chrome 123)

François Beaufort
François Beaufort

Suporte a funções integradas do DP4a no WGSL

O DP4a (Dot Product of 4 Elements and Accumulate) se refere a um conjunto de instruções de GPU comumente usadas na inferência de aprendizado profundo para quantização. Ele executa de forma eficiente produtos escalares de inteiros de 8 bits para acelerar a computação desses modelos quantizados de int8. Ele pode economizar (até 75%) da memória e da largura de banda da rede e melhorar o desempenho de qualquer modelo de aprendizado de máquina na inferência em comparação com a versão f32. Como resultado, ele é muito usado em muitos frameworks de IA conhecidos.

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

É recomendável usar uma diretiva requires para indicar o potencial de não portabilidade com requires packed_4x8_integer_dot_product; na parte de cima do código do sombreador WGSL. Confira 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
  }`,
});

Agradecemos especialmente à equipe de gráficos da Web da Intel em Xangai por concluir esta especificação e implementação.

Parâmetros de ponteiro irrestrito no WGSL

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

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

  • Transmitir ponteiros para membros de estrutura e elementos de matriz para funções declaradas pelo usuário.

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

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

Sintaxe simplificada para desreferenciar compósitos no WGSL

Quando a extensão de linguagem WGSL "pointer_composite_access" está presente em navigator.gpu.wgslLanguageFeatures, o código do sombreador 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 (.) funciona exatamente como você está acostumado para acessar membros diretamente.

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

É recomendável usar uma diretiva requires para indicar o potencial de não portabilidade com requires pointer_composite_access; na parte de cima do código do sombreador WGSL. Confira 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.
  }`
});

Estado somente leitura separado para aspectos de stencil e profundidade

Antes, os anexos de profundidade e modelo de renderização somente leitura em transmissões de renderização exigiam que ambos os aspectos (profundidade e modelo) fossem somente leitura. Essa limitação foi removida. Agora, é possível usar o aspecto de profundidade em modo somente leitura, para o rastreamento de sombra de contato, por exemplo, enquanto o buffer de stencil é gravado para identificar pixels para processamento posterior. Consulte o problema dawn:2146.

Atualizações do Dawn

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

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

Isso abrange apenas alguns dos principais destaques. Confira a lista completa de confirmações.

Novidades na WebGPU

Uma lista de tudo o que foi abordado na série O que há de novo na 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