Neuerungen bei WebGPU (Chrome 125)

François Beaufort
François Beaufort

Die Anzahl der WebGPU-Funktionen mag diesmal etwas spärlich erscheinen, aber einige große Fortschritte stehen in der Nähe! Zukünftige Releases enthalten Funktionen wie Verbesserungen der Shader-Kompilierungsgeschwindigkeit und Änderungen am asynchronen Modell der Implementierung mit WGPUFuture.

Untergruppen (Funktion in Entwicklung)

Die Funktion für Untergruppen ermöglicht Parallelität auf SIMD-Ebene, sodass Threads innerhalb einer Gruppe miteinander kommunizieren und kollektive mathematische Operationen durchführen können, z. B. die Summe von 16 Zahlen. Dies bietet eine hocheffiziente Form der Thread-übergreifenden Datenfreigabe.

Untergruppenvorgänge werden von modernen GPU-APIs unterstützt. Namens- und Implementierungsdetails variieren jedoch. Das Chrome-Team hat Gemeinsamkeiten identifiziert und arbeitet nun an einer Standardisierung dieser Funktion. Sehen Sie sich das Angebot an und kommentieren Sie, wenn Sie Fragen haben.

Die "Experimental Web Platform Features" enthält eine minimale und nicht standardisierte Implementierung von Untergruppen. bei chrome://flags/#enable-experimental-web-platform-features melden, damit Entwickler es ausprobieren und Feedback geben können, da im Kontext von WebGPU noch keine realen Vorteile nachgewiesen wurden.

Wenn die Funktion „"chromium-experimental-subgroups"“ in einer GPUAdapter verfügbar ist, fordern Sie mit dieser Funktion eine GPUDevice an, um Unterstützung für experimentelle Untergruppen in WGSL zu erhalten und die Limits für minSubgroupSize und maxSubgroupSize zu prüfen.

Du musst diese Erweiterung auch explizit in deinem WGSL-Code mit enable chromium_experimental_subgroups aktivieren. Wenn diese Option aktiviert ist, erhalten 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 Größe der Untergruppe.
  • subgroupBallot(value): gibt eine Reihe von Bitfeldern zurück, bei denen das Bit, das subgroup_invocation_id entspricht, 1 ist, wenn value für diesen aktiven Aufruf wahr ist, andernfalls 0.
  • subgroupBroadcast(value, id): Sendet den value des Aufrufs mit subgroup_invocation_id, der id entspricht, an alle Aufrufe innerhalb der Untergruppe. Hinweis: id muss eine Compile-Zeitkonstante sein.

Das folgende Code-Snippet dient als Grundlage zum Ausprobieren und Entdecken des Potenzials von Untergruppen.

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

Als 3D-Textursegment rendern

Mit dem neuen depthSlice-Mitglied in einem GPURenderPassColorAttachment kannst du jetzt direkt in Segmenten von 3D-Texturen innerhalb von Rendering-Passagen rendern. Die Funktionen sind dabei über das gängige 2D-Textur-Rendering hinaus möglich. Mit dieser Ergänzung können Sie beispielsweise Voxel-basierte Szenen und Effekte erstellen, indem Sie sie direkt in 3D-Texturvolumen rendern. Siehe issue dawn:1020.

Updates zur Morgendämmerung

Vollständige Liste der Commits

Das ist neu bei WebGPU

Eine Liste aller behandelten Themen der Reihe What's New in WebGPU.

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