Nouveautés de WebGPU (Chrome 125)

François Beaufort
François Beaufort

Le nombre de fonctionnalités WebGPU peut sembler un peu limité cette fois-ci, mais des avancées majeures sont à venir. Les prochaines versions incluront des fonctionnalités telles que l'amélioration de la vitesse de compilation des nuanceurs et des modifications du modèle asynchrone de l'implémentation à l'aide de WGPUFuture.

Sous-groupes (fonctionnalité en cours de développement)

La fonctionnalité de sous-groupes permet un parallélisme au niveau SIMD, ce qui permet aux threads d'un groupe de communiquer et d'effectuer des opérations mathématiques collectives (par exemple, calculer la somme de 16 nombres). Cela offre une forme très efficace de partage de données entre les threads.

Les opérations de sous-groupes sont compatibles avec les API GPU modernes, mais les détails de nommage et d'implémentation varient. L'équipe Chrome a identifié les points communs et travaille actuellement à la normalisation de cette fonctionnalité. Consultez la proposition et laissez un commentaire si vous avez des questions.

Il existe une implémentation minimale et non normalisée des sous-groupes derrière l'indicateur "Experimental Web Platform Features" (Fonctionnalités expérimentales de la plate-forme Web) à l'adresse chrome://flags/#enable-experimental-web-platform-features. Les développeurs peuvent ainsi l'essayer et partager leurs commentaires, car les avantages concrets n'ont pas encore été prouvés dans le contexte de WebGPU.

Lorsque la fonctionnalité "chromium-experimental-subgroups" est disponible dans un GPUAdapter, demandez un GPUDevice avec cette fonctionnalité pour bénéficier de la prise en charge expérimentale des sous-groupes dans WGSL et vérifiez ses limites minSubgroupSize et maxSubgroupSize.

Vous devez également activer explicitement cette extension dans votre code WGSL avec enable chromium_experimental_subgroups. Une fois activée, vous avez accès aux éléments suivants :

  • subgroup_invocation_id : valeur intégrée pour l'index du thread dans le sous-groupe.
  • subgroup_size : valeur intégrée pour l'accès à la taille du sous-groupe.
  • subgroupBallot(value): Renvoie un ensemble de champs de bits où le bit correspondant à subgroup_invocation_id est 1 si value est vrai pour cette invocation active, et 0 sinon.
  • subgroupBroadcast(value, id) : diffuse la value de l'invocation avec subgroup_invocation_id correspondant à id à toutes les invocations du sous-groupe. Remarque : id doit être une constante de temps de compilation.

L'extrait de code suivant fournit une base pour expérimenter et découvrir le potentiel des sous-groupes.

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().
  }`,
});

Effectuer un rendu sur une tranche de texture 3D

Vous pouvez désormais effectuer un rendu directement sur une ou plusieurs tranches de textures 3D dans les passes de rendu, ce qui étend ses capacités au-delà du rendu de texture 2D courant, avec le nouveau depthSlice membre dans un GPURenderPassColorAttachment. Cette fonctionnalité vous permet, par exemple, de créer des scènes et des effets basés sur des voxels en effectuant un rendu directement dans des volumes de texture 3D. Consultez le problème dawn:1020.

Informations Dawn

Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tous les éléments abordés dans la série Nouveautés de WebGPU.

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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