Novidades da WebGPU (Chrome 123)

François Beaufort
François Beaufort

Compatibilidade com funções integradas do DP4a em WGSL

DP4a (produto escalar de quatro elementos e acumulação) se refere a um conjunto de instruções de GPU comumente usadas 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 em 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. Por isso, ele é muito usado em vários frameworks de IA conhecidos.

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

Recomendamos usar uma diretiva requires para sinalizar o potencial de não portabilidade com requires packed_4x8_integer_dot_product; na parte de cima do código do shader 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 à equipe de gráficos da Web da Intel em Xangai por impulsionar a conclusão dessa especificação e implementação.

Parâmetros de ponteiro irrestritos em WGSL

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

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

  • Passar 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 do WGSL para saber mais sobre isso.

Esse recurso pode ser detectado usando navigator.gpu.wgslLanguageFeatures. Recomendamos sempre usar uma diretiva requires para sinalizar o potencial de não portabilidade com requires unrestricted_pointer_parameters; na parte de cima do código do shader WGSL. Confira o exemplo a seguir, as mudanças na especificação 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 em WGSL

Quando a extensão de linguagem "pointer_composite_access" WGSL está presente em navigator.gpu.wgslLanguageFeatures, seu código de shader 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 será uma maneira mais conveniente de escrever (*foo).bar. Normalmente, o asterisco (*) 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] dará acesso direto ao local da memória em que o elemento 'i da matriz está armazenado.

Recomendamos usar uma diretiva requires para sinalizar o potencial de não portabilidade com requires pointer_composite_access; na parte de cima do código do shader 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 estêncil e profundidade

Antes, os anexos de profundidade-estêncil somente leitura em transmissões 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 somente leitura, por exemplo, para rastreamento de sombra de contato, enquanto o buffer de estêncil é gravado para identificar pixels para processamento posterior. Consulte o problema dawn:2146.

Atualizações do amanhecer

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 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 commits.

Novidades no WebGPU

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

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