Neuerungen bei WebGPU (Chrome 123)

François Beaufort
François Beaufort

Unterstützung von integrierten DP4a-Funktionen 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 bis zu 75 % Arbeitsspeicher und Netzwerkbandbreite sparen und die Leistung aller Modelle für maschinelles Lernen bei der Inferenz im Vergleich zur F32-Version verbessern. Daher wird es inzwischen in vielen beliebten KI-Frameworks verwendet.

Wenn die WGSL-Spracherweiterung "packed_4x8_integer_dot_product" in navigator.gpu.wgslLanguageFeatures vorhanden ist, kannst du jetzt mit den integrierten Funktionen dot4U8Packed und dot4I8Packed 32-Bit-Ganzzahlskalare verwenden, die 4-Komponenten-Vektoren mit 8-Bit-Ganzzahlen als Eingaben für die Punktproduktanweisungen in deinem WGSL-Shader-Code verpacken. Sie können auch eine Anleitung zum Packen und Entpacken mit gepackten 4-Komponenten-Vektoren von 8-Bit-Ganzzahlen mit den Funktionen pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8 und unpack4xU8 in WGSL verwenden.

Es wird empfohlen, eine requires-Anweisung zu verwenden, um die potenzielle Nicht-Portabilität mit requires packed_4x8_integer_dot_product; am Anfang deines 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
  }`,
});

Ein besonderer Dank geht an das Web Graphics-Team von Intel in Shanghai für die Umsetzung dieser Spezifikation und die Implementierung.

Uneingeschränkte Zeigerparameter in WGSL

Mit der WGSL-Spracherweiterung "unrestricted_pointer_parameters" werden die Einschränkungen für die Übergabe von Verweisen an WGSL-Funktionen gelockert:

  • Parameter-Pointer der Adressbereiche storage, uniform und workgroup für vom Nutzer deklarierte Funktionen.

  • Übergabe von Zeigern an Strukturmitglieder und Array-Elemente an vom Nutzer deklarierte Funktionen.

Weitere Informationen finden Sie unter Zeiger als Funktionsparameter | Tour durch WGSL, um mehr darüber zu erfahren.

Diese Funktion kann mithilfe von navigator.gpu.wgslLanguageFeatures erkannt werden. Es wird empfohlen, immer eine requires-directive zu verwenden, um das Potenzial einer Nicht-Portabilität mit requires unrestricted_pointer_parameters; am Anfang deines WGSL-Shader-Codes zu signalisieren. Im folgenden Beispiel findest du die Änderungen der WGSL-Spezifikationen und issue tint:2053 (Problem 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 Sugar zur Dereferenzierung von Verbundstoffen in WGSL

Wenn die WGSL-Spracherweiterung "pointer_composite_access" in navigator.gpu.wgslLanguageFeatures vorhanden ist, unterstützt Ihr WGSL-Shader-Code jetzt den Zugriff auf Komponenten komplexer Datentypen mit derselben Punktsyntax (.), unabhängig davon, ob Sie direkt mit den Daten oder mit einem Zeiger darauf arbeiten. So funktionierts:

  • Wenn foo ein Zeiger ist, ist foo.bar eine praktischere Möglichkeit, um (*foo).bar zu schreiben. Das Sternchen (*) wird normalerweise benötigt, um den Zeiger in eine „Bezug“ zu verwandeln die dereferenzierbar sind, aber jetzt sind sowohl Zeiger als auch Bezüge viel ähnlicher und fast austauschbar.

  • Wenn foo kein Zeiger ist: Der Punktoperator (.) funktioniert genauso wie der direkte Zugriff auf Mitglieder.

Wenn pa ein Zeiger ist, der die Startadresse eines Arrays speichert, erhalten Sie mit pa[i] direkten Zugriff auf den Speicherort des 'i-Elements dieses Arrays.

Es wird empfohlen, eine requires-Anweisung zu verwenden, um die potenzielle Nicht-Portabilität mit requires pointer_composite_access; am Anfang deines 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

Zuvor mussten für schreibgeschützte Anhänge mit Tiefenschablonen in Rendering-Durchgängen beide Aspekte (Tiefe und Schablone) 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 zur weiteren Verarbeitung zu identifizieren. Siehe issue dawn:2146.

Updates zur Morgendämmerung

Der mit wgpuDeviceSetUncapturedErrorCallback() festgelegte Callback für nicht erfasste Fehler wird jetzt sofort aufgerufen, wenn der Fehler auftritt. Dies ist das, was Entwickler von 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. Siehe issue dawn:1362.

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

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