Novedades de WebGPU (Chrome 125)

François Beaufort
François Beaufort

La cantidad de funciones de WebGPU puede parecer un poco dispersa 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 usando WGPUFuture.

Subgrupos (función en desarrollo)

La función de subgrupos habilita el paralelismo en el nivel SIMD, lo que permite que los subprocesos 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 implementación y nombres varían. El equipo de Chrome identificó los puntos en común y 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 “Funciones de la plataforma web experimental” en chrome://flags/#enable-experimental-web-platform-features para que los desarrolladores puedan probarla y compartir comentarios, ya que aún no se han probado los beneficios del mundo real 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. Si habilitas esta opción, obtendrás acceso a los siguientes elementos:

  • 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 de los subgrupos.
  • 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 en el caso 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 jugar 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 en porciones de texturas 3D dentro de pases de renderización, lo que expande 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 en volúmenes de texturas 3D. Consulta issue dawn:1020.

Actualizaciones del amanecer

Consulta la lista detallada de confirmaciones.

Novedades de WebGPU

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

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