WebGPU の新機能(Chrome 123)

François Beaufort
François Beaufort

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

DP4a(4 つの要素のドット積と累積)は、量子化のディープ ラーニング推論で一般的に使用される 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-directive を使用して、requires packed_4x8_integer_dot_product; での移植性の可能性を通知することをおすすめします。次の例と 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-directive を使用して、requires pointer_composite_access; での移植性の可能性を通知することをおすすめします。次の例と 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() で設定されたキャプチャされないエラーのコールバックが、エラー発生時にすぐに呼び出されるようになりました。これは、デベロッパーがデバッグで一貫して期待し、望んでいることです。変更開始:173620 を参照してください。

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

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

WebGPU の新機能

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

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