Novidades da WebGPU (Chrome 125)

François Beaufort
François Beaufort

O número de recursos da WebGPU pode parecer um pouco esparso desta vez, mas alguns grandes avanços estão a caminho! Futuras versões incluirão recursos como melhorias na velocidade de compilação de sombreador e alterações no modelo assíncrono de implementação usando WGPUFuture.

Subgrupos (recurso em desenvolvimento)

O recurso de subgrupos ativa o paralelismo no nível de SIMD, permitindo que as linhas de execução de um grupo se comuniquem e realizem operações matemáticas coletivas (por exemplo, calcular a soma de 16 números). Isso oferece uma forma altamente eficiente de compartilhamento de dados entre linhas de execução.

As operações de subgrupo são compatíveis com as APIs modernas de GPU, mas os detalhes de nomenclatura e implementação variam. A equipe do Chrome identificou os pontos em comum e agora está trabalhando para padronizar esse recurso. Confira a proposta e comente se tiver dúvidas.

Existe uma implementação mínima e não padronizada de subgrupos por trás dos "Recursos experimentais da plataforma Web" em chrome://flags/#enable-experimental-web-platform-features para que os desenvolvedores possam testar e compartilhar feedback, já que os benefícios reais ainda não foram comprovados no contexto da WebGPU.

Quando o recurso "chromium-experimental-subgroups" estiver disponível em um GPUAdapter, solicite um GPUDevice com esse recurso para receber suporte a subgrupos experimentais na WGSL e verificar os limites de minSubgroupSize e maxSubgroupSize.

Também é necessário ativar explicitamente essa extensão no código da WGSL com enable chromium_experimental_subgroups. Quando esse recurso estiver ativado, você terá acesso às seguintes adições:

  • subgroup_invocation_id: um valor integrado para o índice da linha de execução no subgrupo.
  • subgroup_size: um valor integrado para acesso ao tamanho do subgrupo.
  • subgroupBallot(value): Retorna um conjunto de campos de bits em que o bit correspondente a subgroup_invocation_id é 1, se value for verdadeiro para a invocação ativa. Caso contrário, é 0.
  • subgroupBroadcast(value, id): transmite o value da invocação com subgroup_invocation_id correspondendo a id para todas as invocações dentro do subgrupo. Observação: id precisa ser uma constante de tempo de compilação.

O snippet de código a seguir fornece uma base para mexer e descobrir o potencial dos subgrupos.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-subgroups")) {
  throw new Error("Experimental subgroups support is not available");
}
// Explicitly request experimental subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable chromium_experimental_subgroups;

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

Renderizar uma fatia da textura 3D

Agora você pode renderizar diretamente em fatias de texturas 3D nas passagens de renderização, expandindo os recursos para além da renderização de textura 2D comum, com o novo membro depthSlice em um GPURenderPassColorAttachment. Essa adição permite, por exemplo, criar cenas e efeitos baseados em vóxel renderizando diretamente em volumes de textura 3D. Consulte o problema dawn:1020.

Atualizações do amanhecer

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