Novedades de WebGPU (Chrome 125)

François Beaufort
François Beaufort

Es posible que la cantidad de funciones de WebGPU parezca un poco escasa esta vez, pero algunos avances importantes están a la vuelta de la esquina. Las versiones futuras incluirán funciones como mejoras en la velocidad de compilación de sombreadores 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 a nivel de 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 APIs de GPU modernas admiten operaciones de subgrupos, pero los detalles de implementación y los nombres 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.

Hay una implementación mínima y no estandarizada de subgrupos detrás de la marca "Experimental Web Platform Features" en chrome://flags/#enable-experimental-web-platform-features para que los desarrolladores puedan probarla y compartir comentarios, ya que los beneficios en el mundo real aún no se han demostrado 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 experimental con subgrupos 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 está habilitada, obtienes acceso a las siguientes incorporaciones:

  • subgroup_invocation_id: Es un valor integrado para el índice del subproceso dentro del subgrupo.
  • subgroup_size: Es un valor integrado para el acceso al tamaño del subgrupo.
  • subgroupBallot(value): Devuelve 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): Emite el value de la invocación con subgroup_invocation_id que coincide 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().
  }`,
});

Renderiza en un segmento de la textura 3D

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

Actualizaciones de Dawn

Consulta la lista exhaustiva de confirmaciones.

Novedades de WebGPU

Una lista de todo lo que se abordó en la serie Novedades de 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