WebGPU の新機能(Chrome 123)

François Beaufort
François Beaufort

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

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

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

requires-directive で、WGSL シェーダー コードの先頭で requires packed_4x8_integer_dot_product; によりポータビリティがない可能性があることを通知することをおすすめします。次の例と問題 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 を使用して特徴を検出できます。常に requires-directive を使用して、WGSL シェーダー コードの先頭で requires unrestricted_pointer_parameters; で非ポータビリティの可能性を示すことをおすすめします。以下の例(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 で複合体を逆参照するためのシンタックス シュガー

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

  • foo がポインタの場合: (*foo).bar を記述するには、foo.bar を使用する方が便利です。アスタリスク(*)は通常、ポインタを逆参照可能な「参照」に変換するために必要ですが、ポインタと参照はどちらもはるかに似通っており、ほぼ交換可能になりました。

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

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

requires-directive で、WGSL シェーダー コードの先頭で requires pointer_composite_access; によりポータビリティがない可能性があることを通知することをおすすめします。次の例と問題 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.
  }`
});

ステンシルと奥行きの側面の読み取り専用状態を分離

これまで、レンダリング パスに読み取り専用の深度ステンシル アタッチメントは、両方のアスペクト(深度とステンシル)を読み取り専用にする必要がありました。この制限は解除されました。たとえば、コンタクト シャドウ トレースなどで、奥行きアスペクトを読み取り専用で使用でき、さらに処理対象のピクセルを識別するためにステンシル バッファが書き込まれます。issue dawn:2146 をご覧ください。

夜明けの更新情報

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

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

ここでは、重要なハイライトの一部についてのみ説明します。commit の完全なリストを確認する。

WebGPU の新機能

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

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