WebGPU 新功能's (Chrome 約 120)

François Beaufort
François Beaufort

支援 WGSL 中的 16 位元浮點值

在 WGSL 中,f16 類型是 IEEE-754 二進位 16 位元 (半精確度) 格式的 16 位元浮點值集合。換句話說,它使用 16 位元來表示浮點數,而不是傳統單精度浮點 (f32) 使用 32 位元。這種較小的空間可以大幅改善效能,特別是在處理大量資料時。

相較之下,在 Apple M1 Pro 裝置上,在 WebLLM 即時通訊示範中採用 f16Llama2 7B 模型,比 f32 實作速度快上許多,預填速度加快 28%,解碼速度則提升 41%,如以下螢幕截圖所示。

使用 f32 和 f16 Llama2 7B 模型的 WebLLM 聊天示範畫面截圖。
使用 f32 (左側) 和 f16 (右側) Llama2 7B 模型的網站大型語言模型即時通訊示範。

並非所有 GPU 都支援 16 位元浮點值。當 GPUAdapter 提供 "shader-f16" 功能時,您可以使用這項功能要求 GPUDevice,並建立利用半精度浮點類型 f16 的 WGSL 著色器模組。只有在您使用 enable f16; 啟用 f16 WGSL 擴充功能時,才能在 WGSL 著色器模組中使用此類型。否則,createShaderModule() 會產生驗證錯誤。請參閱以下的基本範例和問題 dawn:1510

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
  throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
  requiredFeatures: ["shader-f16"],
});

const code = `
  enable f16;

  @compute @workgroup_size(1)
  fn main() {
    const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...

您可以使用 alias 在 WGSL 著色器模組程式碼中支援 f16f32 類型,具體取決於 "shader-f16" 功能支援情形,如以下程式碼片段所示。

const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");

const device = await adapter.requestDevice({
  requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});

const header = hasShaderF16
  ? `enable f16;
     alias min16float = f16;`
  : `alias min16float = f32;`;

const code = `
  ${header}

  @compute @workgroup_size(1)
  fn main() {
    const c = vec3<min16float>(1.0, 2.0, 3.0);
  }
`;

挑戰極限

根據預設,在所有色彩附件中,儲存一個轉譯管道輸出資料樣本 (像素或子像素) 所需的位元組數上限為 32 位元組。您現在可以使用 maxColorAttachmentBytesPerSample 限制,最多要求 64 個。請參閱以下範例和issue dawn:2036

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

if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
  requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});

所有平台上用於跨階段通訊的 maxInterStageShaderVariablesmaxInterStageShaderComponents 限制都已提高。詳情請參閱問題 dawn:1448

在每個著色器階段中,管道版面配置中的繫結群組版面配置項目數量上限為 8 個。現在可以使用 maxStorageBuffersPerShaderStage 限制,最多要求 10 個。請參閱問題 dawn:2159

我們已新增 maxBindGroupsPlusVertexBuffers 限制。它包含同時使用的繫結群組和頂點緩衝區插槽數量上限,並計算最高索引以下的所有空白插槽。預設值為 24。請參閱問題 dawn:1849

深度-遮罩狀態的變更

為改善開發人員體驗,深度遮罩狀態 depthWriteEnableddepthCompare 屬性不再是必填屬性:depthWriteEnabled 只適用於含深度的格式,如果含深度的格式未使用 depthCompare,則不必填入 depthCompare。請參閱問題 2132

轉接器資訊更新

當使用者在 chrome://flags/#enable-webgpu-developer-features 中啟用「WebGPU 開發人員功能」標記時,現在只要呼叫 requestAdapterInfo(),即可使用非標準的 typebackend 轉接器資訊屬性。type 可以是「獨立 GPU」、「整合 GPU」、「CPU」或「不明」。backend 可以是「WebGPU」、「D3D11」、「D3D12」、「metal」、「vulkan」、「openGL」、「openGLES」或「null」。請參閱問題 dawn:2112問題 dawn:2107

https://webgpureport.org 的螢幕截圖,顯示後端和輸入轉接程式資訊。
https://webgpureport.org 上顯示的轉接器資訊後端和類型。

requestAdapterInfo() 中的選用 unmaskHints 清單參數已遭移除。請參閱問題 dawn:1427

時間戳記查詢量化

時間戳記查詢可讓應用程式以奈秒為精確度,測量 GPU 指令的執行時間。然而,WebGPU 規格基於「時間攻擊」的考量,使得時間戳記查詢變為選用。Chrome 團隊認為,將時間戳記查詢量化可將解析度降低至 100 微秒,在精確度和安全性之間取得良好的平衡。請參閱問題 dawn:1800

在 Chrome 中,使用者可以透過啟用 chrome://flags/#enable-webgpu-developer-features 中的「WebGPU 開發人員功能」旗標,停用時間戳記量化功能。請注意,單獨使用這個標記無法啟用 "timestamp-query" 功能。這項實作仍在實驗階段,因此需要位於 chrome://flags/#enable-unsafe-webgpu 的「Unsafe WebGPU Support」標記。

在 Dawn 中,新增了名為「timestamp_quantization」的裝置切換鈕,並預設為啟用。以下程式碼片段說明如何在要求裝置時,允許實驗性「時間戳記查詢」功能不進行時間戳記量化。

wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};

const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;

const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = &timestampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;

wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};

// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);

春季大掃除功能

實驗功能「timestamp-query-inside-passes」已重新命名為「chromium-experimental-timestamp-query-inside-passes」,以便向開發人員清楚說明這項功能為實驗功能,且目前僅適用於以 Chromium 為基礎的瀏覽器。請參閱問題 dawn:1193

實驗性的「pipeline-statistics-query」功能僅部分實作,目前仍處於開發階段,因此現已移除。請參閱 chromium 問題:1177506

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

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