Novidades da WebGPU (Chrome 125)

François Beaufort
François Beaufort

O número de recursos da WebGPU pode parecer um pouco escasso 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 shaders e mudanças no modelo assíncrono da implementação usando o 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 fornece uma forma altamente eficiente de compartilhamento de dados entre linhas de execução.

As operações de subgrupo têm suporte de APIs de GPU modernas, mas os detalhes de nomenclatura e implementação variam. A equipe do Chrome identificou as características comuns e está trabalhando para padronizar esse recurso. Confira a proposta e comentários se tiver dúvidas.

Há uma implementação mínima e não padronizada de subgrupos por trás da flag "Experimental Web Platform Features" 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 experimental a subgrupos no WGSL e verificar os limites de minSubgroupSize e maxSubgroupSize.

Você também precisa ativar explicitamente essa extensão no código WGSL com enable chromium_experimental_subgroups. Quando ativada, você tem acesso às seguintes adições:

  • subgroup_invocation_id: um valor integrado para o índice da linha dentro do subgrupo.
  • subgroup_size: um valor integrado para acesso ao tamanho do subgrupo.
  • subgroupBallot(value): Retorna um conjunto de campos de bit 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 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 para fatia de textura 3D

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

Atualizações do Dawn

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