Neuerungen bei WebGPU (Chrome 123)

François Beaufort
François Beaufort

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- und workgroup-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, ist foo.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

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113