WebGPU の新機能(Chrome 123)

François Beaufort
François Beaufort

WGSL での DP4a 組み込み関数のサポート

DP4a(4 要素の乗算と累積)は、量子化のためにディープラーニング推論で一般的に使用される一連の GPU 命令を指します。8 ビット整数の内積を効率的に実行し、このような int8 量子化モデルの計算を高速化します。これにより、メモリとネットワーク帯域幅を最大 75% 節約でき、推論時の ML モデルのパフォーマンスを f32 バージョンと比較して向上させることができます。その結果、現在では多くの一般的な AI フレームワークで広く使用されています。

"packed_4x8_integer_dot_product" WGSL 言語拡張機能navigator.gpu.wgslLanguageFeatures に存在する場合、dot4U8Packeddot4I8Packed 組み込み関数を使用して、WGSL シェーダー コード内のドット積命令への入力として、8 ビット整数の 4 成分ベクトルをパックした 32 ビット整数スカラーを使用できるようになりました。8 ビット整数の 4 成分ベクトルの圧縮と圧縮解除の命令を使用して、pack4xI8pack4xU8pack4xI8Clamppack4xU8Clampunpack4xI8unpack4xU8 WGSL 組み込み関数を実行することもできます。

WGSL シェーダー コードの上部に requires packed_4x8_integer_dot_product; を使用して、requires ディレクティブを使用して、移植できない可能性を通知することをおすすめします。次の例と issue tint:1497 をご覧ください。

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

この仕様と実装を完了に導いた上海の Intel のウェブ グラフィック チームに特別な感謝を申し上げます。

WGSL での制限付きポインタ パラメータ

"unrestricted_pointer_parameters" WGSL 言語拡張機能により、WGSL 関数に渡すことができるポインタの制限が緩和されます。

  • ユーザー宣言関数への storageuniformworkgroup アドレス空間のパラメータ ポインタ。

  • 構造体メンバーと配列要素へのポインタをユーザー宣言関数に渡す。

詳しくは、関数パラメータとしてのポインタ | WGSL の概要をご覧ください。

この機能は、navigator.gpu.wgslLanguageFeatures を使用して特徴検出できます。WGSL シェーダー コードの上部に requires unrestricted_pointer_parameters; を使用して、requires ディレクティブで移植できない可能性を常に示すことおすすめします。次の例、WGSL 仕様の変更問題 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);
  }`
});

WGSL で複合型のデリファレンスを取るための構文糖衣

navigator.gpu.wgslLanguageFeatures"pointer_composite_access" WGSL 言語拡張機能が存在する場合、WGSL シェーダー コードは、データを直接操作する場合でも、そのポインタを操作する場合でも、同じドット(.)構文を使用して複雑なデータ型のコンポーネントへのアクセスをサポートします。仕組みは次のとおりです。

  • foo がポインタの場合: (*foo).bar を記述するより、foo.bar を使用する方が便利です。通常、ポインタをデリファレンス可能な「参照」に変換するにはアスタリスク(*)が必要でしたが、現在ではポインタと参照の両方が非常に類似しており、ほぼ互換性があります。

  • foo がポインタでない場合: ドット(.)演算子は、メンバーに直接アクセスする場合と同じように機能します。

同様に、pa が配列の開始アドレスを格納するポインタである場合、pa[i] を使用すると、その配列の 'i 番目の要素が格納されているメモリ位置に直接アクセスできます。

WGSL シェーダー コードの上部に requires pointer_composite_access; を使用して、requires ディレクティブを使用して、移植できない可能性を通知することをおすすめします。次の例と issue tint:2113 をご覧ください。

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

ステンシルと深度アスペクトの読み取り専用状態を分離

以前は、レンダリング パスの読み取り専用デプス ステンシル アタッチメントでは、両方の側面(デプスとステンシル)を読み取り専用にする必要がありました。この制限は解除されています。これで、接触シャドウ トレーシングなど、深度アスペクトを読み取り専用で使用できるようになりました。一方、ステンシル バッファは、さらなる処理用のピクセルを識別するために書き込まれます。問題 dawn:2146 をご覧ください。

Dawn の更新

wgpuDeviceSetUncapturedErrorCallback() で設定されたキャプチャされていないエラー コールバックが、エラーが発生したときにすぐに呼び出されるようになります。これは、デベロッパーがデバッグに対して常に期待し、望んでいるものです。変更 dawn:173620 をご覧ください。

webgpu.h APIwgpuSurfaceGetPreferredFormat() メソッドが実装されました。問題 dawn:1362 をご覧ください。

以下に、主なハイライトをいくつかご紹介します。コミットの一覧(すべて網羅)をご覧ください。

WebGPU の新機能

WebGPU の新機能シリーズで取り上げられたすべての内容のリスト。

Chrome 131

Chrome 130

Chrome 129

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