WebGPU の新機能(Chrome 123)

François Beaufort
François Beaufort

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

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

"packed_4x8_integer_dot_product" WGSL 言語拡張navigator.gpu.wgslLanguageFeatures に存在する場合、dot4U8Packed および dot4I8Packed 組み込み関数により、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 を使用して検出できます。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 で複合要素を逆参照するための糖衣構文

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

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

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

夜明けの最新情報

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

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

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

WebGPU の新機能

WebGPU の新機能」シリーズに記載されている全内容のリスト。

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