WebGPU の新機能(Chrome 123)

François Beaufort
François Beaufort

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

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

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

WGSL シェーダーコードの先頭に requires packed_4x8_integer_dot_product; を使用して、移植性のない可能性を示す requires-directive を使用することをおすすめします。次の例と 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 Web Graphics チームに感謝します。

WGSL の制限なしポインタ パラメータ

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

  • storageuniformworkgroup アドレス空間のパラメータ ポインタをユーザー宣言関数に渡します。

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

詳細については、関数パラメータとしてのポインタ | WGSL のツアーをご覧ください。

この機能は navigator.gpu.wgslLanguageFeatures を使用して機能検出できます。WGSL シェーダー コードの先頭で requires unrestricted_pointer_parameters; を使用して移植性のない可能性を示す requires-directive を常に使用することをおすすめします。次の例、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-directive を使用することをおすすめします。次の例と 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() メソッドが実装されました。issue dawn:1362 を参照してください。

ここでは、主なハイライトの一部のみを取り上げます。コミットの完全なリストをご覧ください。

WebGPU の新機能

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

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

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