WebGPU 新功能's (Chrome 約 120)

François Beaufort
François Beaufort

支援 WGSL 中的 16 位元浮點值

在 WGSL 中,f16 類型是 IEEE-754 二進位 16 位元 (半精確度) 格式的 16 位元浮點值集合。也就是說,它使用 16 位元代表浮點數,而非傳統單精度浮點數的 32 位元 (f32)。較小的大小可大幅提升效能,尤其是在處理大量資料時。

比較之下,在 Apple M1 Pro 裝置上,WebLLM 聊天室示範中使用的 Llama2 7B 模型f16 導入作業,比 f32 導入作業快上許多,預填速度提升 28%,解碼速度則提升 41%,如以下螢幕截圖所示。

使用 f32 和 f16 Llama2 7B 模型的 WebLLM 聊天示範畫面截圖。
使用 f32 (左) 和 f16 (右) Llama2 7B 模型的 WebLLM 聊天示範。

並非所有 GPU 都支援 16 位元浮點值。當 "shader-f16" 功能在 GPUAdapter 中提供時,您現在可以使用此功能要求 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。請參閱 issue dawn: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 為基礎的瀏覽器。請參閱 issue 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