Novidades da WebGPU (Chrome 123)

François Beaufort
François Beaufort

Suporte a funções integradas do DP4a na WGSL

DP4a (Dot Product of 4 Elements and Accumulate) se refere a um conjunto de instruções de GPU usadas com frequência na inferência de aprendizado profundo para quantização. Ele realiza produtos escalares de números inteiros de 8 bits de maneira eficiente 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 machine learning na inferência em comparação com a versão f32. Como resultado, agora ele é muito usado em muitas estruturas de IA populares.

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

Recomendamos usar uma diretiva requires para sinalizar a possibilidade de não portabilidade com requires packed_4x8_integer_dot_product; na parte de cima do código do sombreador WGSL. Consulte o exemplo a seguir e o problema 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 à equipe de gráficos da Web da Intel em Xangai por impulsionar essa especificação e implementação até a conclusão.

Parâmetros de ponteiro irrestritos na WGSL

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

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

  • Transmissão de 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. Recomendamos sempre usar uma diretiva requires para sinalizar a possibilidade de não portabilidade com requires unrestricted_pointer_parameters; na parte de cima do código do shader WGSL. Consulte o exemplo a seguir, as mudanças na especificação da WGSL e o problema 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);
  }`
});

Açúcar sintático para desreferenciar composições na 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] oferece acesso direto ao local da memória em que o 'i'th elemento dessa matriz está armazenado.

Recomendamos usar uma diretiva requires para sinalizar a possibilidade de não portabilidade com requires pointer_composite_access; na parte de cima do código do sombreador WGSL. Consulte o exemplo a seguir e o problema 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 estêncil e profundidade

Anteriormente, os anexos de estêncil de profundidade somente leitura em passagens de renderização exigiam que ambos os 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, por exemplo, para rastreamento de sombra de contato, enquanto o buffer de estêncil é gravado para identificar pixels para processamento adicional. 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 acontece. É isso que os desenvolvedores esperam e querem para depuração. Consulte a mudança 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 exaustiva de commits.

Novidades na WebGPU

Uma lista de tudo o que foi abordado na série Novidades na WebGPU.

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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