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 hay algunos avances importantes 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 nombres y de implementación varían. El equipo de Chrome identificó los aspectos en común y ahora está trabajando para estandarizar esta función. Consulta la propuesta y comenta si tienes alguna pregunta.

Existe una implementación mínima y no estandarizada de subgrupos detrás de la marca “Funciones experimentales de la plataforma web” en chrome://flags/#enable-experimental-web-platform-features para que los desarrolladores puedan probarla y compartir comentarios, ya que los beneficios del mundo real aún no se han probado 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 esta extensión de forma explícita en tu código WGSL con enable chromium_experimental_subgroups. Cuando está habilitado, 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 los que el bit correspondiente a subgroup_invocation_id es 1 si value es verdadero para esa invocación activa y 0 de lo contrario.
  • subgroupBroadcast(value, id): Transmite 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 una porción de textura 3D

Ahora puedes renderizar directamente en rebanadas 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 común, 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 textura 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 analizó en la serie Novedades de 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