Novidades da WebGPU (Chrome 125)

François Beaufort
François Beaufort

O número de recursos do WebGPU pode parecer um pouco pequeno desta vez, mas alguns avanços importantes estão chegando! As próximas versões vão incluir recursos como melhorias na velocidade de compilação de shader e mudanças no modelo assíncrono da implementação usando WGPUFuture.

Subgrupos (recurso em desenvolvimento)

O recurso de subgrupos permite o paralelismo no nível SIMD, permitindo que as linhas de execução em 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 APIs de GPU modernas, 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 o comentário se tiver dúvidas.

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

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

Você também precisa ativar explicitamente essa extensão no seu código WGSL com enable chromium_experimental_subgroups. Quando ativada, você tem acesso aos seguintes recursos:

  • 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 essa invocação ativa e 0 caso contrário.
  • subgroupBroadcast(value, id): transmite o value da invocação com subgroup_invocation_id correspondente a id para todas as invocações no subgrupo. Observação: id precisa ser uma constante de tempo de compilação.

O snippet de código a seguir oferece uma base para testar 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 para uma fração de textura 3D

Agora é possível renderizar diretamente para fatias de texturas 3D em transmissões de renderização, expandindo os recursos além da renderização comum de texturas 2D, com o novo membro depthSlice em um GPURenderPassColorAttachment. Com essa adição, é possível criar cenas e efeitos baseados em voxels renderizando diretamente em volumes de textura 3D. Consulte issue dawn:1020.

Atualizações do amanhecer

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