Novedades de WebGPU (Chrome 125)

François Beaufort
François Beaufort

Es posible que la cantidad de funciones de WebGPU parezca un poco dispersa esta vez, pero se acercan algunos avances importantes. Las versiones futuras incluirán funciones como mejoras en la velocidad de compilación del sombreador y cambios en el modelo asíncrono de la implementación con WGPUFuture.

Subgrupos (función en desarrollo)

La función de subgrupos habilita el paralelismo de nivel SIMD, lo que permite que los subprocesos dentro de un grupo se comuniquen y realicen operaciones matemáticas colectivas (por ejemplo, calcular la suma de 16 números). Esto proporciona una forma muy eficiente de compartir datos entre subprocesos.

Las operaciones de subgrupos son compatibles con las APIs de GPU modernas, pero los detalles de nomenclatura e implementación varían. El equipo de Chrome identificó los puntos en común y ahora está trabajando para estandarizar esta función. Consulta la propuesta y el comentario si tienes preguntas.

Existe una implementación mínima y no estandarizada de subgrupos detrás de las "Funciones experimentales de la plataforma web" marca en chrome://flags/#enable-experimental-web-platform-features para que los desarrolladores puedan probarlo y compartir comentarios, ya que aún no se han demostrado los beneficios reales en el contexto de WebGPU.

Cuando la función "chromium-experimental-subgroups" esté disponible en un GPUAdapter, solicita un GPUDevice con esta función para obtener compatibilidad con subgrupos experimentales en WGSL y verificar sus límites de minSubgroupSize y maxSubgroupSize.

También debes habilitar explícitamente esta extensión en tu código WGSL con enable chromium_experimental_subgroups. Cuando se habilita, obtienes acceso a las siguientes incorporaciones:

  • subgroup_invocation_id: Es un valor integrado para el índice del subproceso dentro del subgrupo.
  • subgroup_size: Un valor integrado para el acceso al tamaño del subgrupo.
  • subgroupBallot(value): Muestra un conjunto de campos de bits en el que el bit correspondiente a subgroup_invocation_id es 1 si value es verdadero para esa invocación activa y 0 en caso contrario.
  • subgroupBroadcast(value, id): Transmite el value desde la invocación con subgroup_invocation_id que coincida con id a todas las invocaciones dentro del subgrupo. Nota: id debe ser una constante de tiempo de compilación.

El siguiente fragmento de código proporciona una base para experimentar y descubrir el potencial de los 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 en una porción de textura 3D

Ahora puedes renderizar directamente porciones de texturas 3D dentro de los pases de renderización, lo que amplía sus capacidades más allá de la renderización común de texturas 2D, con el nuevo miembro depthSlice en un GPURenderPassColorAttachment. Esta adición te permite, por ejemplo, crear escenas y efectos basados en vóxeles renderizando directamente volúmenes de texturas 3D. Consulta problema dawn:1020.

Actualizaciones del amanecer

Consulta la lista exhaustiva de confirmaciones.

Novedades de WebGPU

Una lista de todo lo que se ha abordado en la serie Novedades de WebGPU.

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