Neuerungen bei WebGPU (Chrome 125)

François Beaufort
François Beaufort

Die Anzahl der WebGPU-Funktionen ist dieses Mal vielleicht etwas gering, aber einige wichtige Neuerungen stehen kurz bevor. Zukünftige Releases werden Funktionen wie eine schnellere Shader-Kompilierung und Änderungen am asynchronen Modell der Implementierung mit WGPUFuture enthalten.

Untergruppen (Funktion in Entwicklung)

Die Funktion für Untergruppen ermöglicht Parallelität auf SIMD-Ebene. So können Threads innerhalb einer Gruppe kommunizieren und kollektive mathematische Operationen ausführen, z. B. die Summe von 16 Zahlen berechnen. Dies ermöglicht eine sehr effiziente Form der threadübergreifenden Datenfreigabe.

Untergruppenoperationen werden von modernen GPU-APIs unterstützt, aber die Benennung und Implementierungsdetails variieren. Das Chrome-Team hat die Gemeinsamkeiten ermittelt und arbeitet nun daran, diese Funktion zu standardisieren. Weitere Informationen finden Sie im Vorschlag und im Kommentar.

Hinter dem Flag „Experimental Web Platform Features“ unter chrome://flags/#enable-experimental-web-platform-features befindet sich eine minimale und nicht standardisierte Implementierung von Untergruppen, damit Entwickler sie ausprobieren und Feedback geben können. Die Vorteile in der Praxis sind im Zusammenhang mit WebGPU noch nicht nachgewiesen.

Wenn die "chromium-experimental-subgroups"-Funktion in einem GPUAdapter verfügbar ist, fordern Sie ein GPUDevice mit dieser Funktion an, um experimentelle Untergruppen in WGSL zu unterstützen und die Grenzwerte für minSubgroupSize und maxSubgroupSize zu prüfen.

Sie müssen diese Erweiterung auch explizit in Ihrem WGSL-Code mit enable chromium_experimental_subgroups aktivieren. Wenn die Option aktiviert ist, haben Sie Zugriff auf die folgenden Ergänzungen:

  • subgroup_invocation_id: Ein integrierter Wert für den Index des Threads innerhalb der Untergruppe.
  • subgroup_size: Ein integrierter Wert für den Zugriff auf die Untergruppengröße.
  • subgroupBallot(value): Gibt eine Reihe von Bitfeldern zurück, wobei das Bit, das subgroup_invocation_id entspricht, 1 ist, wenn value für diesen aktiven Aufruf „true“ ist, und andernfalls 0.
  • subgroupBroadcast(value, id): Sendet die value aus dem Aufruf mit subgroup_invocation_id, die mit id übereinstimmt, an alle Aufrufe in der Untergruppe. Hinweis: id muss eine Compile-Zeitkonstante sein.

Das folgende Code-Snippet bietet eine Grundlage, um mit Untergruppen zu experimentieren und ihr Potenzial zu entdecken.

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

In Slice einer 3D-Textur rendern

Sie können jetzt direkt in Slice(s) von 3D-Texturen in Render-Passes rendern. Dadurch werden die Funktionen über das herkömmliche Rendern von 2D-Texturen hinaus erweitert. Dazu wird das neue depthSlice-Element in einem GPURenderPassColorAttachment verwendet. Damit lassen sich beispielsweise Szenen und Effekte auf Voxelbasis erstellen, indem direkt in 3D-Texturvolumen gerendert wird. Siehe Problem dawn:1020.

Dawn-Updates

Vollständige Liste der Commits

Neues zu WebGPU

Eine Liste mit allen Themen, die in der Reihe Neu in WebGPU behandelt wurden.

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