WebGPU 的新功能 (Chrome 123)

François Beaufort
François Beaufort

WGSL 支援 DP4a 內建函式

DP4a (4 個元素的點積和累加) 是指一組 GPU 指令,通常用於深度學習推論的量化作業。可有效執行 8 位元整數點積,加速這類 int8 量化模型的運算。與 f32 版本相比,這項技術最多可節省 75% 的記憶體和網路頻寬,並提升任何機器學習模型的推論效能。因此,現在許多熱門的 AI 架構都大量使用這項技術。

如果 navigator.gpu.wgslLanguageFeatures 中有 "packed_4x8_integer_dot_product" WGSL 語言擴充功能,您現在可以使用 32 位元整數純量,將 8 位元整數的 4 元向量封裝為輸入內容,並透過 dot4U8Packeddot4I8Packed 內建函式,在 WGSL 著色器程式碼中執行點積指令。您也可以搭配使用封裝和解封裝指令,以及封裝的 4 元件向量 (8 位元整數),並搭配 pack4xI8pack4xU8pack4xI8Clamppack4xU8Clampunpack4xI8unpack4xU8 WGSL 內建函式。

建議在 WGSL 著色器程式碼頂端使用 requires 指令,標示 requires packed_4x8_integer_dot_product; 可能無法移植。請參閱以下範例和問題色調: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 中不受限制的指標參數

"unrestricted_pointer_parameters" WGSL 語言擴充功能會放寬限制,允許將指標傳遞至 WGSL 函式:

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

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

如要進一步瞭解指標,請參閱「Pointers As Function Parameters | Tour of WGSL」。

您可以使用 navigator.gpu.wgslLanguageFeatures 偵測這項功能。建議您一律使用 requires-directive,在 WGSL 著色器程式碼頂端以 requires unrestricted_pointer_parameters; 標示可能無法移植。請參閱以下範例、WGSL 規格變更問題色調: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 指令,標示 requires pointer_composite_access; 可能無法移植。請參閱以下範例和問題色調: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.
  }`
});

樣板和深度層面的唯讀狀態

先前,算繪通道中的唯讀深度樣板附件需要同時具備這兩項特質 (深度和樣板),才能設為唯讀。這項限制已解除。現在,您可以唯讀使用深度方面,例如追蹤接觸陰影,同時寫入模板緩衝區,以識別像素進行後續處理。請參閱問題 dawn:2146

黎明更新

現在發生錯誤時,系統會立即呼叫使用 wgpuDeviceSetUncapturedErrorCallback() 設定的未擷取錯誤回呼。這正是開發人員在偵錯時一貫的期望和需求。請參閱變更 dawn:173620

已實作 webgpu.h APIwgpuSurfaceGetPreferredFormat() 方法。請參閱問題 dawn:1362

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

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