WebGPU の新機能(Chrome 128)

François Beaufort
François Beaufort

サブグループのテスト

サブグループ機能により、SIMD レベルの並列処理が可能になり、グループ内のスレッドが通信して集団演算(16 個の数値の合計の計算など)を実行できます。これにより、スレッド間のデータ共有を非常に効率的に行うことができます。

サブグループ提案の最小限の実装は、chrome://flags/#enable-unsafe-webgpu の [Unsafe WebGPU Support] フラグの背後でローカル テストに使用できます。

オリジン トライアルに登録すると、実際のユーザーでサイトのサブグループを試すこともできます。オリジン トライアルを使用するようにサイトを準備する手順については、オリジン トライアルを使ってみるをご覧ください。オリジン トライアルは Chrome 128 ~ 131(2025 年 2 月 19 日に終了)で実施されます。テストの目的をご覧ください。

GPUAdapter"subgroups" 機能が利用可能な場合は、この機能を使用して GPUDevice をリクエストし、WGSL でサブグループのサポートを取得して、minSubgroupSizemaxSubgroupSize の上限を確認します。

また、WGSL コードで enable subgroups; を使用して、この拡張機能を明示的に有効にする必要があります。有効にすると、次の追加機能にアクセスできます。

  • subgroup_invocation_id: サブグループ内のスレッドのインデックスの組み込み値。
  • subgroup_size: サブグループ サイズ アクセスの組み込み値。
  • subgroupBallot(value): subgroup_invocation_id に対応するビットが、アクティブな呼び出しで value が true の場合は 1、それ以外の場合は 0 であるビットフィールドのセットを返します。
  • subgroupBroadcast(value, id)subgroup_invocation_idid と一致する呼び出しから、サブグループ内のすべての呼び出しに value をブロードキャストします。注: id はコンパイル時の定数でなければなりません。

subgroupAddsubgroupAllsubgroupElectsubgroupShuffle などの組み込み関数は、今後追加される予定です。issue 354738715 をご覧ください。

サブグループ オペレーションで f16 を許可するには、GPUDevice"subgroups""subgroups-f16""shader-f16" の各機能を使用してリクエストし、WGSL コードで enable f16, subgroups, subgroups_f16; を使用して有効にします。

次のコード スニペットは、サブグループの可能性を試して見つけるためのベースを提供します。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

線と点の深度バイアス設定の非推奨

WebGPU 仕様の変更により、レンダリング パイプラインのトポロジが線または点タイプの場合に、depthBiasdepthBiasSlopeScaledepthBiasClamp をゼロ以外の値に設定すると、検証エラーが発生します。デベロッパーがコードを更新するのに十分な時間を確保するため、この今後の検証に関する警告が DevTools コンソールに表示されます。また、このような状況では値が 0 に強制的に設定されます。issue 352567424 をご覧ください。

preventDefault の場合、キャプチャされていないエラーの DevTools 警告を非表示にする

DevTools コンソールで、uncapturederror のイベント リスナーが登録され、イベント リスナー コールバック内で Event preventDefault() メソッドが呼び出された場合、uncapturederror イベントの警告は表示されなくなります。この動作は、JavaScript のイベント処理と一致しています。次の例と issue 40263619 をご覧ください。

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL の補間サンプリングを最初に行うか、どちらか一方を行う

WGSL の interpolate 属性を使用すると、ユーザー定義の IO データ補間を管理できます。新しい補間サンプリング パラメータ first(デフォルト)と either を使用すると、さらに制御できます。first はプリミティブの最初の頂点の値を使用し、either は最初の頂点または最後の頂点のいずれかを使用できます。issue 340278447 をご覧ください。

Dawn の最新情報

非同期オペレーションを処理する Dawn の WGPUFuture の実装が完了しました。主なコンセプトには、機会的なイベント処理のための wgpuInstanceProcessEvents と、コールバックの場所を定義するための WGPUCallbackMode があります。WGPUFuture は有効期間が無限の 1 回限りのイベントを示し、wgpuInstanceWaitAny は今後の完了またはタイムアウトを待機します。issue 42240932 をご覧ください。

CompositeAlphaMode::Auto 値は Surface::GetCapabilities() によって報告されなくなりました。引き続き有効であり、Surface::GetCapabilities().alphaMode[0] と同等です。issue 292 をご覧ください。

OpenGL バックエンドで、Present() 呼び出しごとに y 反転 blit を使用した Surface がサポートされるようになりました。issue 344814083 をご覧ください。

Adapter::GetProperties() メソッドは非推奨となり、Adapter::GetInfo() の使用が推奨されています。

外部コントリビューターの Jaswant がすべての CMake ファイルを書き直し、更新しやすく、事前ビルドが可能になりました。CMake プロジェクトで Dawn を使用するためのクイックスタート ガイドをご覧ください。

これは主なハイライトの一部にすぎません。コミットの完全なリストをご覧ください。

WebGPU の新機能

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

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