嘗試使用子群組
子群組功能支援 SIMD 層級的平行處理,讓群組中的執行緒互相溝通並執行集體數學運算 (例如計算 16 個數字的總和)。這可提供一種高效率的跨執行緒資料共用方式。
子群組提案的簡易實作方式可在 chrome://flags/#enable-unsafe-webgpu
的「Unsafe WebGPU Support」標記後方進行本機測試。
如果想試用網站上的子群組,歡迎申請來源試用。如要瞭解如何準備網站以使用原始伺服器試用功能,請參閱「開始使用原始伺服器試用功能」一文。來源試用期間為 Chrome 128 至 131 版 (結束日期為 2025 年 2 月 19 日)。請參閱「意圖進行實驗」一文。
如果 GPUAdapter
提供 "subgroups"
功能,請要求含有這項功能的 GPUDevice
,以便在 WGSL 中取得子群組支援,並查看其 minSubgroupSize
和 maxSubgroupSize
限制。
您也必須使用 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
必須是編譯時間常數。
我們日後會新增更多內建函式,例如 subgroupAdd
、subgroupAll
、subgroupElect
、subgroupShuffle
。請參閱問題 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 規格變更:如果算繪管線的拓樸為線或點類型,將 depthBias
、depthBiasSlopeScale
和 depthBiasClamp
設為非零值會導致驗證錯誤。為讓開發人員有充足的時間更新程式碼,開發人員工具主控台會顯示有關這項即將進行驗證的警告,並在這種情況下強制將值設為 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
- WGSL 中的裁剪距離
- GPUCanvasContext getConfiguration()
- 單點和線基元不得包含深度偏誤
- 子群組適用的內建掃描功能
- 實驗性支援多重繪製間接功能
- 著色器模組編譯選項嚴格數學
- 移除 GPUAdapter requestAdapterInfo()
- Dawn 更新
Chrome 130
Chrome 129
Chrome 128
Chrome 127
Chrome 126
Chrome 125
Chrome 124
Chrome 123
Chrome 122
Chrome 121
- 支援 Android 上的 WebGPU
- 在 Windows 上使用 DXC (而非 FXC) 編譯著色器
- 在運算和算繪階段中執行時間戳記查詢
- 著色器模組的預設進入點
- 支援使用顯示器-p3 做為 GPUExternalTexture 色彩空間
- 記憶體堆積資訊
- Dawn 更新
Chrome 120
Chrome 119
Chrome 118
Chrome 117
Chrome 116
- WebCodecs 整合
- GPUAdapter
requestDevice()
傳回的遺失裝置 - 如果呼叫
importExternalTexture()
,請保持影片播放流暢 - 規格相容性
- 改善開發人員體驗
- Dawn 更新