Unterstützung integrierter Funktionen von DP4a in WGSL
DP4a (Dot Product of 4 Elements and Accumulate) bezieht sich auf eine Reihe von GPU-Anweisungen, die häufig in Deep-Learning-Inferenzen zur Quantisierung verwendet werden. Es führt effizient 8-Bit-Ganzzahl-Punktprodukte aus, um die Berechnung solcher int8-quantisierten Modelle zu beschleunigen. Damit lassen sich Arbeitsspeicher und Netzwerkbandbreite (bis zu 75%) einsparen und die Leistung aller Modelle für maschinelles Lernen bei der Inferenz im Vergleich zu deren f32-Version verbessern. Daher wird es in vielen beliebten KI-Frameworks häufig verwendet.
Wenn die WGSL-Spracherweiterung "packed_4x8_integer_dot_product"
in navigator.gpu.wgslLanguageFeatures
vorhanden ist, können Sie jetzt 32-Bit-Ganzzahlskalare verwenden, die 4-Komponenten-Vektoren von 8-Bit-Ganzzahlen als Eingaben für die Punktproduktanweisungen in Ihrem WGSL-Shader-Code mit den integrierten Funktionen dot4U8Packed
und dot4I8Packed
enthalten. Sie können auch Anweisungen zum Verpacken und Entpacken mit gepackten 4-Komponenten-Vektoren von 8-Bit-Ganzzahlen mit pack4xI8
, pack4xU8
, pack4xI8Clamp
, pack4xU8Clamp
, unpack4xI8
und unpack4xU8
der integrierten WGSL-Funktionen verwenden.
Es empfiehlt sich, eine requires-Anweisung zu verwenden, um das Potenzial für Nichtportabilität mit requires packed_4x8_integer_dot_product;
am Anfang des WGSL-Shader-Codes zu signalisieren. Sehen Sie sich das folgende Beispiel und issue tint:1497 an.
if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
throw new Error(`DP4a built-in functions are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires packed_4x8_integer_dot_product;
fn main() {
const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
}`,
});
Besonderen Dank an das Web Graphics-Team von Intel in Shanghai für die Umsetzung dieser Spezifikation und Implementierung!
Uneingeschränkte Zeigerparameter in WGSL
Die WGSL-Spracherweiterung "unrestricted_pointer_parameters"
lockert die Einschränkungen, welche Zeiger an WGSL-Funktionen übergeben werden können:
Parameterzeiger von
storage
-,uniform
- undworkgroup
-Adressräumen auf vom Nutzer deklarierte Funktionen.Übergeben von Zeigern auf Struktur-Mitglieder und Array-Elemente an vom Nutzer deklarierte Funktionen.
Weitere Informationen finden Sie unter Pointers As Function Parameters | Tour of WGSL.
Dieses Feature kann mithilfe von navigator.gpu.wgslLanguageFeatures
erkannt werden. Es wird empfohlen, immer eine requires-Anweisung zu verwenden, um das Potenzial für Nichtportabilität mit requires unrestricted_pointer_parameters;
am Anfang des WGSL-Shader-Codes zu signalisieren. Im folgenden Beispiel siehst du die Änderungen an den WGSL-Spezifikationen und issue tint:2053.
if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
throw new Error(`Unrestricted pointer parameters are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires unrestricted_pointer_parameters;
@group(0) @binding(0) var<storage, read_write> S : i32;
fn func(pointer : ptr<storage, i32, read_write>) {
*pointer = 42;
}
@compute @workgroup_size(1)
fn main() {
func(&S);
}`
});
Syntax für das Dereferenzieren von zusammengesetzten Stoffen in WGSL
Wenn die WGSL-Spracherweiterung "pointer_composite_access"
in navigator.gpu.wgslLanguageFeatures
vorhanden ist, unterstützt Ihr WGSL-Shader-Code jetzt mit derselben Punktsyntax (.
) den Zugriff auf Komponenten komplexer Datentypen, unabhängig davon, ob Sie direkt mit den Daten oder mit einem Zeiger darauf arbeiten. So funktionierts:
Wenn
foo
ein Zeiger ist, istfoo.bar
die bequemere Möglichkeit,(*foo).bar
zu schreiben. Das Sternchen (*
) wäre normalerweise erforderlich, um den Zeiger in eine „Bezug“ zu verwandeln, die dereferenziert werden kann. Jetzt sind sowohl Zeiger als auch Bezüge viel ähnlicher und nahezu austauschbar.Wenn
foo
kein Zeiger ist: Der Punkt-Operator (.
) funktioniert genau wie beim direkten Zugriff auf Mitglieder.
Ist pa
ein Zeiger, der die Startadresse eines Arrays speichert, erhalten Sie mit pa[i]
direkten Zugriff auf den Speicherort, an dem das 'i
-te Element dieses Arrays gespeichert ist.
Es empfiehlt sich, eine requires-Anweisung zu verwenden, um das Potenzial für Nichtportabilität mit requires pointer_composite_access;
am Anfang des WGSL-Shader-Codes zu signalisieren. Sehen Sie sich das folgende Beispiel und issue tint:2113 an.
if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
throw new Error(`Pointer composite access is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires pointer_composite_access;
fn main() {
var a = vec3f();
let p : ptr<function, vec3f> = &a;
let r1 = (*p).x; // always valid.
let r2 = p.x; // requires pointer composite access.
}`
});
Separater schreibgeschützter Status für Schablonen- und Tiefenaspekte
Bisher mussten beide Aspekte (Tiefe und Schablone) für schreibgeschützte Tiefenschablonenanhänge in Rendering-Durchgängen schreibgeschützt sein. Diese Einschränkung wurde aufgehoben. Jetzt können Sie den Tiefenaspekt schreibgeschützt verwenden, z. B. für die Kontaktschattenverfolgung, während der Schablonenpuffer geschrieben wird, um Pixel für die weitere Verarbeitung zu identifizieren. Weitere Informationen finden Sie unter Problem dawn:2146.
Updates zum Morgengrauen
Der mit wgpuDeviceSetUncapturedErrorCallback()
festgelegte Callback für nicht erfasste Fehler wird jetzt sofort aufgerufen, wenn der Fehler auftritt. Das ist, was Entwickler bei der Fehlerbehebung immer wieder erwarten und wünschen. Weitere Informationen finden Sie unter change dawn:173620.
Die Methode wgpuSurfaceGetPreferredFormat()
der webgpu.h API wurde implementiert. Weitere Informationen finden Sie unter issue dawn:1362.
Dies sind nur einige der wichtigsten Punkte. Hier finden Sie eine vollständige Liste der Commits.
Neu bei WebGPU
Hier finden Sie eine Liste aller Inhalte, die in der Reihe What's New in WebGPU behandelt wurden.
Chrome 125
Chrome 124
- Schreibgeschützte und nicht schreibgeschützte Speichertexturen
- Unterstützung für Service Worker und Shared Worker
- Neue Attribute für Adapterinformationen
- Diverse Fehlerkorrekturen
- Updates zum Morgengrauen
Chrome 123
- Unterstützung von integrierten Funktionen in DP4a in WGSL
- Uneingeschränkte Zeigerparameter in WGSL
- Syntax für die Dereferenzierung von zusammengesetzten Elementen in WGSL
- Separater schreibgeschützter Status für Schablonen- und Tiefenaspekte
- Updates zum Morgengrauen
Chrome 122
- Reichweite mit Kompatibilitätsmodus erhöhen (Funktion in Entwicklung)
- Limit für „maxVertexAttributes“ erhöhen
- Updates zum Morgengrauen
Chrome 121
- Unterstützung von WebGPU unter Android
- Für die Shader-Kompilierung unter Windows DXC statt FXC verwenden
- Zeitstempelabfragen in Rechen- und Renderingdurchläufen
- Standardeinstiegspunkte für Shader-Module
- display-p3 als GPUExternalTexture-Farbraum unterstützen
- Informationen zum Arbeitsspeicher-Heaps
- Updates zum Morgengrauen
Chrome 120
- Unterstützung von 16-Bit-Gleitkommawerten in WGSL
- Gehe an die Grenzen
- Änderungen am Status der Tiefenschablone
- Aktualisierungen der Adapterinformationen
- Quantisierung von Zeitstempelabfragen
- Frühjahrsputz-Funktionen
Chrome 119
- Filterbare 32-Bit-Float-Texturen
- Vertex-Format „unorm10-10-10-2“
- rgb10a2uint Texturformat
- Updates zum Morgengrauen
Chrome 118
- Unterstützung von HTMLImageElement und ImageData in
copyExternalImageToTexture()
- Experimentelle Unterstützung für nicht schreibgeschützte und schreibgeschützte Speichertexturen
- Updates zum Morgengrauen
Chrome 117
- Nicht festgelegter Vertex-Zwischenspeicher
- Bindungsgruppe aufheben
- Fehler aufgrund asynchroner Pipelineerstellung bei Verlust des Geräts stummschalten
- Updates zur Erstellung von SPIR-V-Shader-Modulen
- Entwicklererfahrung verbessern
- Pipelines mit automatisch generiertem Layout im Cache speichern
- Updates zum Morgengrauen
Chrome 116
- WebCodecs-Integration
- Verlorenes Gerät vom GPUAdapter
requestDevice()
zurückgegeben - Für eine flüssige Videowiedergabe bei
importExternalTexture()
-Aufrufen sorgen - Spezifikationskonformität
- Entwicklererfahrung verbessern
- Updates zum Morgengrauen
Chrome 115
- Unterstützte WGSL-Spracherweiterungen
- Experimentelle Unterstützung für Direct3D 11
- Diskrete GPU standardmäßig mit Netzstrom betreiben
- Entwicklererfahrung verbessern
- Updates zum Morgengrauen
Chrome 114
- JavaScript optimieren
- getCurrentTexture() auf nicht konfiguriertem Canvas wirft InvalidStateError
- Updates zu WGSL
- Updates zum Morgengrauen