Mit Untergruppen experimentieren
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.
Eine minimale Implementierung des Vorschlags für Untergruppen ist für lokale Tests hinter dem „Unsafe WebGPU Support“ verfügbar Flag bei chrome://flags/#enable-unsafe-webgpu
.
Sie können auf Ihrer Website auch Untergruppen mit echten Nutzern testen, indem Sie sich für den Ursprungstest registrieren. Eine Anleitung dazu, wie Sie Ihre Website für die Verwendung von Ursprungstests vorbereiten, finden Sie unter Erste Schritte mit Ursprungstests. Der Ursprungstest läuft von Chrome 128 bis Chrome 131 (endet am 19. Februar 2025). Siehe Intent to Experiment.
Wenn die Funktion „"subgroups"
“ in einer GPUAdapter
verfügbar ist, fordern Sie mit diesem Feature eine GPUDevice
an, um Unterstützung für 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 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, wobei das Bit, dassubgroup_invocation_id
entspricht, 1 ist, wennvalue
für diesen aktiven Aufruf wahr ist, andernfalls 0.subgroupBroadcast(value, id)
: Sendet denvalue
des Aufrufs mitsubgroup_invocation_id
, derid
entspricht, an alle Aufrufe innerhalb der Untergruppe. Hinweis:id
muss eine Compile-Zeitkonstante sein.
Weitere integrierte Funktionen wie subgroupAdd
, subgroupAll
, subgroupElect
und subgroupShuffle
werden in Zukunft hinzugefügt. Siehe Problem 354738715.
Um f16 in Untergruppenvorgängen zuzulassen, fordern Sie ein GPUDevice
mit den Funktionen "subgroups"
, "subgroups-f16"
und "shader-f16"
an und aktivieren Sie es dann in Ihrem WGSL-Code mit enable f16, subgroups, subgroups_f16;
.
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("subgroups")) {
throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
requiredFeatures: ["subgroups"],
});
const shaderModule = device.createShaderModule({ code: `
enable subgroups;
var<workgroup> wgmem : u32;
@group(0) @binding(0)
var<storage, read> inputs : array<u32>;
@group(0) @binding(1)
var<storage, read_write> output : array<u32>;
@compute @workgroup_size(64)
fn main(@builtin(subgroup_size) subgroupSize : u32,
@builtin(subgroup_invocation_id) id : u32,
@builtin(local_invocation_index) lid : u32) {
// One thread per workgroup writes the value to workgroup memory.
if (lid == 0) {
wgmem = inputs[lid];
}
workgroupBarrier();
var v = 0u;
// One thread per subgroup reads the value from workgroup memory
// and shares that value with every other thread in the subgroup
// to reduce local memory bandwidth.
if (id == 0) {
v = wgmem;
}
v = subgroupBroadcast(v, 0);
output[lid] = v;
}`,
});
// Send the appropriate commands to the GPU...
Einstellung der Tiefenverzerrung für Linien und Punkte verwerfen
Eine Änderung der WebGPU-Spezifikation führt dazu, dass depthBias
, depthBiasSlopeScale
und depthBiasClamp
auf einen Wert ungleich null gesetzt werden, wenn die Topologie für eine Renderingpipeline ein Linien- oder Punkttyp ist. Damit Entwickler genügend Zeit haben, ihren Code zu aktualisieren, wird in der Entwicklertools-Konsole eine Warnung zu dieser anstehenden Validierung angezeigt. Gleichzeitig werden die Werte unter diesen Umständen auf 0 gesetzt. Siehe Problem 352567424.
Nicht erfassten Fehler in Entwicklertools ausblenden, wenn „preventDefault“ festgelegt ist
In der Entwicklertools-Konsole werden Warnungen für uncapturederror
-Ereignisse nicht mehr angezeigt, wenn ein Ereignis-Listener für uncapturederror
registriert und die Ereignismethode preventDefault()
innerhalb des Event-Listener-Callbacks aufgerufen wurde. Dieses Verhalten entspricht der Ereignisverarbeitung in JavaScript. Sehen Sie sich das folgende Beispiel und Problem 40263619 an.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
device.addEventListener("uncapturederror", (event) => {
// Prevents browser warning to show up in the DevTools Console.
event.preventDefault();
// TODO: Handle event.error
});
WGSL-Interpolieren von Stichproben
Mit dem WGSL-Attribut interpolate
können Sie die benutzerdefinierte E/A-Dateninterpolation verwalten. Jetzt haben Sie mit den neuen Parametern für die interpolierte Stichprobenerhebung first
(Standardeinstellung) und either
mehr Kontrolle: first
verwendet den Wert des ersten Scheitelpunkts des Primitivs, während either
entweder den ersten oder den letzten Scheitelpunkt zulässt. Siehe Problem 340278447.
Updates zur Morgendämmerung
Die Implementierung von WGPUFuture von Dawn zur Verarbeitung asynchroner Vorgänge ist jetzt abgeschlossen. Zu den Schlüsselkonzepten gehören wgpuInstanceProcessEvents für die opportunistische Ereignisverarbeitung und WGPUCallbackMode zum Definieren von Callback-Orten. WGPUFuture kennzeichnet einmalige Ereignisse mit unendlicher Lebensdauer und wgpuInstanceWaitAny wartet auf den Abschluss eines zukünftigen Ereignisses oder eine Zeitüberschreitung. Siehe Problem 42240932.
Der Wert CompositeAlphaMode::Auto
wird jetzt nicht von Surface::GetCapabilities()
gemeldet. Sie ist weiterhin gültig und entspricht Surface::GetCapabilities().alphaMode[0]
. Siehe Problem 292.
Das OpenGL-Back-End unterstützt jetzt Surface
mit einem Y-Flip-Blit für jeden Present()
-Aufruf. Siehe Problem 344814083.
Die Methode Adapter::GetProperties()
wird zugunsten der Verwendung von Adapter::GetInfo()
eingestellt.
Jaswant, ein externer Beitragender, hat alle CMake-Dateien neu geschrieben, sodass sie einfacher aktualisiert werden können und Vorab-Builds möglich sind. Kurzanleitung zur Verwendung von Dawn in CMake-Projekten
Hier werden nur einige der wichtigsten Vorteile behandelt. Vollständige Liste der Commits
Das ist neu bei WebGPU
Eine Liste aller behandelten Themen der Reihe What's New in WebGPU.
Chrome 128
- Tests mit Untergruppen
- Einstellung der Tiefenverzerrung für Linien und Punkte verwerfen
- Entwicklertools-Warnung für nicht erfassten Fehler ausblenden, wenn „preventDefault“ festgelegt ist
- WGSL-interpolierte Stichprobenerhebung
- Updates zur Morgendämmerung
Chrome 127
- Experimentelle Unterstützung von OpenGL ES unter Android
- GPUAdapter-Infoattribut
- Verbesserungen der WebAssembly-Interoperabilität
- Verbesserte Fehler des Befehls-Encoders
- Updates zur Morgendämmerung
Chrome 126
- Limit für maxTextureArrayLayers erhöhen
- Optimierung des Zwischenspeicheruploads für das Vulkan-Backend
- Schnellere Kompilierungszeiten
- Gesendete Befehlspuffer müssen eindeutig sein
- Updates zur Morgendämmerung
Chrome 125
Chrome 124
- Schreibgeschützte Speichertexturen
- Unterstützung für Service Worker und Shared Worker
- Neue Attribute für Adapterinformationen
- Diverse Fehlerkorrekturen
- Updates zur Morgendämmerung
Chrome 123
- Unterstützung der integrierten DP4a-Funktionen in WGSL
- Uneingeschränkte Zeigerparameter in WGSL
- „Zucker“-Syntax für die Dereferenzierung von zusammengesetzten Daten in WGSL
- Separater schreibgeschützter Status für Schablonen- und Tiefenaspekte
- Updates zur Morgendämmerung
Chrome 122
- Reichweite mit dem Kompatibilitätsmodus erhöhen (Funktion in Entwicklung)
- maxVertexAttributes-Limit erhöhen
- Updates zur Morgendämmerung
Chrome 121
- Unterstützung von WebGPU unter Android
- DXC anstelle von FXC für die Shader-Kompilierung unter Windows verwenden
- Zeitstempelabfragen in Rechen- und Renderingdurchläufen
- Standardeinstiegspunkte für Shader-Module
- Unterstützung von „display-p3“ als GPUExternalTexture-Farbraum
- Informationen zu Arbeitsspeicher-Heaps
- Updates zur Morgendämmerung
Chrome 120
- Unterstützung von 16-Bit-Gleitkommawerten in WGSL
- Gehe an deine Grenzen
- Änderungen am Status der Tiefenschablonen
- Aktualisierung der Adapterinformationen
- Zeitstempelquantisierung von Abfragen
- Frühjahrsputz
Chrome 119
- Filterbare 32-Bit-Float-Texturen
- unorm10-10-10-2 Vertexformat
- rgb10a2uint-Texturformat
- Updates zur Morgendämmerung
Chrome 118
- Unterstützung von HTMLImageElement und ImageData in
copyExternalImageToTexture()
- Experimentelle Unterstützung für nicht schreibgeschützte und schreibgeschützte Speichertexturen
- Updates zur Morgendämmerung
Chrome 117
- Vertex-Zwischenspeicher aufheben
- Bindungsgruppe aufheben
- Fehler bei der asynchronen Pipelineerstellung stummschalten, wenn Gerät verloren geht
- Aktualisierungen beim Erstellen von SPIR-V-Shadermodulen
- Entwicklererfahrung verbessern
- Caching-Pipelines mit automatisch generiertem Layout
- Updates zur Morgendämmerung
Chrome 116
- WebCodecs-Integration
- Verlorenes Gerät, das von GPUAdapter
requestDevice()
zurückgegeben wurde - Videowiedergabe ruckelfrei, wenn
importExternalTexture()
aufgerufen wird - Konformität mit Spezifikationen
- Entwicklererfahrung verbessern
- Updates zur Morgendämmerung
Chrome 115
- Unterstützte WGSL-Spracherweiterungen
- Experimentelle Unterstützung für Direct3D 11
- Separate GPU standardmäßig im Netzbetrieb nutzen
- Entwicklererfahrung verbessern
- Updates zur Morgendämmerung
Chrome 114
- JavaScript-Code optimieren
- getCurrentTexture() bei nicht konfiguriertem Canvas löst InvalidStateError aus
- Wichtige Informationen von WGSL
- Updates zur Morgendämmerung