WebGPU 的新功能 (Chrome 123)

François Beaufort
François Beaufort

WGSL 中的 DP4a 內建函式支援

DP4a (4 元素的點積和累計值) 是指在深度學習推論中常用的 GPU 指示組合,用於量化應用方式。有效率地執行 8 位元整數「點積」,加快這類 int8 量化模型的運算速度。它可以節省 (最高 75%) 的記憶體和網路頻寬,並與 f32 版本相比,改善推論機器學習模型的效能。因此,現今在許多熱門的 AI 架構中已採用這種技術。

如果 navigator.gpu.wgslLanguageFeatures 中有 "packed_4x8_integer_dot_product" WGSL 語言擴充功能,您現在可以使用 32 位元整數純量,將 8 位元整數的 4 元件向量封裝為 WGSL 著色器程式碼中的點產品指示,並使用 dot4U8Packeddot4I8Packed 內建函式。您也可以使用 pack4xI8pack4xU8pack4xI8Clamppack4xU8Clampunpack4xI8unpack4xU8 WGSL 內建函式,使用封裝和拆解的 8 位元整數 4 元件向量。

建議您在 WGSL 著色器程式碼頂端使用 Requires-directive 來指出 requires packed_4x8_integer_dot_product; 不可遷移。請參考下列範例和問題 tint:1497

if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
  throw new Error(`DP4a built-in functions are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires packed_4x8_integer_dot_product;

  fn main() {
    const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
  }`,
});

特別感謝在上海的 Intel Web Graphics 團隊協助達成這個規範並逐步導入!

WGSL 中的未限制指標參數

可將指標傳送至 WGSL 函式的 "unrestricted_pointer_parameters" WGSL 語言擴充功能放寬限制:

  • 指向使用者宣告函式的 storageuniformworkgroup 位址空間參數指標。

  • 將指標傳遞至結構成員和陣列元素至使用者宣告的函式。

詳情請參閱 Pointers As Function Parameters | WGSL 導覽

您可以使用 navigator.gpu.wgslLanguageFeatures 偵測地圖項目。建議您在 WGSL 著色器程式碼的頂端,一律使用 Requires-directive 來指出 requires unrestricted_pointer_parameters; 不可遷移。請參閱以下範例,瞭解 WGSL 規格變更問題 tint:2053

if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
  throw new Error(`Unrestricted pointer parameters are not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires unrestricted_pointer_parameters;

  @group(0) @binding(0) var<storage, read_write> S : i32;

  fn func(pointer : ptr<storage, i32, read_write>) {
    *pointer = 42;
  }

  @compute @workgroup_size(1)
  fn main() {
    func(&S);
  }`
});

將 WGSL 中複合材料反參照的語法糖

如果 navigator.gpu.wgslLanguageFeatures 中有 "pointer_composite_access" WGSL 語言擴充功能,WGSL 著色器程式碼現在支援使用相同點 (.) 語法存取複雜資料類型的元件,無論您是要直接處理資料,還是出於所屬指標。運作方式如下:

  • 如果 foo 是指標:foo.bar 是寫入 (*foo).bar 簡便的方法。通常需要使用星號 (*) 將指標轉換為可以去參照的「參照」,但現在兩者的指標和參照都更加相似,而且幾乎可以互換。

  • 如果 foo 不是指標:點 (.) 運算子的運作方式與您直接存取成員的方式相同。

同樣地,如果 pa 是一個儲存陣列起始地址的指標,使用 pa[i] 時,您可以直接存取儲存該陣列 'i 元素的記憶體位置。

建議您在 WGSL 著色器程式碼頂端使用 Requires-directive 來指出 requires pointer_composite_access; 不可遷移。請參考下列範例和 Issue tint:2113

if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
  throw new Error(`Pointer composite access is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires pointer_composite_access;

  fn main() {
    var a = vec3f();
    let p : ptr<function, vec3f> = &a;
    let r1 = (*p).x; // always valid.
    let r2 = p.x; // requires pointer composite access.
  }`
});

區分模板和深度面向的唯讀狀態

先前,轉譯傳遞中的唯讀深度模板附件必須同時處於唯讀狀態和模板。這項限制已解除。現在,您可以使用唯讀模式 (例如進行患者接觸陰影追蹤) 使用深度長寬比,而螺絲緩衝區會寫入並識別像素,以便進一步處理。請參閱「問題日:2146」。

黎明更新

在錯誤發生時,現在會立即呼叫使用 wgpuDeviceSetUncapturedErrorCallback() 設定的未擷取錯誤回呼。這是開發人員一直希望偵錯的流程。請參閱變更 dawn:173620

已實作 webgpu.h API 中的 wgpuSurfaceGetPreferredFormat() 方法。請參閱問題發生時間:1362

這僅涵蓋部分重點功能。查看完整的修訂版本清單

WebGPU 的新功能

WebGPU 新功能」系列中已說明的所有功能清單。

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