What's WebGPU 的新功能 (Chrometain128)

François Beaufort
François Beaufort

實驗組別

子群組功能可啟用 SIMD 層級的平行運算,讓群組內的執行緒進行通訊,並執行集體數學運算 (例如計算 16 個數字的總和)。這可提供高效率的跨執行緒資料共用形式。

您可以在 chrome://flags/#enable-unsafe-webgpu 的「Unsafe WebGPU Support」旗標後方,進行本機測試,瞭解 subgroups 提案的最低實作方式。

您也可以註冊原始碼試用,在網站上與真實使用者測試子群組。如需準備網站以使用來源試用計畫的說明,請參閱「開始使用來源試用計畫」。來源試用期將從 Chrome 128 版開始,到 Chrome 131 版結束 (2025 年 2 月 19 日)。請參閱「實驗意圖」。

"subgroups" 功能在 GPUAdapter 中可用時,請要求使用這項功能的 GPUDevice,在 WGSL 中取得子群組支援,並檢查其 minSubgroupSizemaxSubgroupSize 限制。

您也需要在 WGSL 程式碼中,使用 enable subgroups; 明確啟用這項擴充功能。啟用後,你就能使用下列加購內容:

  • subgroup_invocation_id:子群組中執行緒索引的內建值。
  • subgroup_size:子群組大小存取的內建值。
  • subgroupBallot(value):傳回一組位元欄位,如果 value 對於該有效呼叫為 true,則對應至 subgroup_invocation_id 的位元為 1,否則為 0。
  • subgroupBroadcast(value, id):將具有相符 idsubgroup_invocation_id 叫用項目中的 value 廣播至子群組中的所有叫用項目。注意: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 屬性可讓您管理使用者定義的 IO 資料插補。現在,新的插補取樣參數 first (預設) 和 either 可提供額外控制選項:first 會使用原始項目的第一個頂點值,而 either 則允許使用第一個或最後一個頂點。請參閱問題 340278447

黎明更新

Dawn 的 WGPUFuture 實作程序已完成,可處理非同步作業。重要概念包括用於機會事件處理的 wgpuInstanceProcessEvents,以及用於定義回呼位置的 WGPUCallbackMode。WGPUFuture 代表生命週期無限的一次性事件,而 wgpuInstanceWaitAny 會等待任何未來或逾時完成。請參閱問題 42240932

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

OpenGL 後端現在支援 Surface,每次呼叫 Present() 時都會進行 y 軸翻轉 blit。請參閱問題 344814083

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

外部貢獻者 Jaswant 已重新編寫所有 CMake 檔案,讓更新作業更輕鬆,並支援預先建構。如要在 CMake 專案中使用 Dawn,請參閱快速入門指南

這僅涵蓋部分重點。請參閱完整的提交清單

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