What's WebGPU 的新功能 (Chrometain128)

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 限制。

您也必須使用 enable subgroups; 在 WGSL 程式碼中明確啟用此擴充功能。啟用後,您就能使用下列新增功能:

  • subgroup_invocation_id:子群組中執行緒索引的內建值。
  • subgroup_size:子群組大小存取權的內建值。
  • subgroupBallot(value):傳回一組位元欄位,其中與 subgroup_invocation_id 相對應的位元為 1 (如果 value 為該有效叫用作業的值為 true),否則為 0。
  • subgroupBroadcast(value, id):將呼叫中的 value 廣播至子群組中的所有呼叫,其中 subgroup_invocation_id 會與 id 相符。注意:id 必須是編譯時間常數。

我們日後會新增更多內建函式,例如 subgroupAddsubgroupAllsubgroupElectsubgroupShuffle。請參閱問題 354738715

如要在子群組作業中允許 f16,請使用 "subgroups""subgroups-f16""shader-f16" 功能要求 GPUDevice,然後在 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 設為非零值會導致驗證錯誤。為讓開發人員有充足的時間更新程式碼,開發人員工具主控台會顯示有關這項即將進行驗證的警告,並在這種情況下強制將值設為 0。請參閱問題 352567424

如果在 preventDefault 時隱藏未擷取的錯誤,開發人員工具警告

如果已註冊 uncapturederror 的事件監聽器,且在事件監聽器回呼中呼叫了事件 preventDefault() 方法,則開發人員工具控制台不會再顯示 uncapturederror 事件的警告。這項行為與 JavaScript 中的事件處理方式相符。請參考以下範例和問題 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 屬性管理使用者定義的 I/O 資料插補。現在,新的內插取樣參數 first (預設) 和 either 可讓您進一步控制:first 使用基元第一個頂點的值,而 either 則允許第一個或最後一個頂點。請參閱問題 340278447

黎明更新

實作 Dawn 的 WGPUFuture 以處理非同步作業,目前已完成。其中的關鍵概念包括用於處理即時事件的 wgpuInstanceProcessEvents,以及用於定義回呼位置的 WGPUCallbackMode。WGPUFuture 代表生命週期無限的一次性事件,wgpuInstanceWaitAny 會等待任何 Future 或逾時。請參閱問題 42240932

Surface::GetCapabilities() 現在不會回報 CompositeAlphaMode::Auto 值。它仍有效,且等同於 Surface::GetCapabilities().alphaMode[0]。請參閱 問題 292

OpenGL 後端現在支援 Surface,並為每個 Present() 呼叫提供 y-flip blit。請參閱問題 344814083

Adapter::GetProperties() 方法已淘汰,改用 Adapter::GetInfo()

外部貢獻者 Jaswant 已重寫所有 CMake 檔案,讓檔案更容易更新,並允許預先建構。請參閱快速入門指南,瞭解如何在 CMake 專案中使用 Dawn。

這份文件僅涵蓋部分重點。請查看完整的修訂版本清單

WebGPU 新功能

WebGPU 最新消息系列中所有包含的清單。

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