WebGPU 的新功能 (Chrome 123)

François Beaufort
François Beaufort

WGSL 中的 DP4a 內建函式支援

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

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

建議您使用 requiresdirective,在 WGSL 著色器程式碼頂端使用 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 中無限制的指標參數

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

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

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

請參閱指標做為函式參數 |WGSL 導覽即可瞭解詳情。

可使用 navigator.gpu.wgslLanguageFeatures 由特徵偵測。建議您在 WGSL 著色器程式碼頂端,一律使用 requiresdirective,以 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 元素的記憶體位置。

建議您使用 requiresdirective,在 WGSL 著色器程式碼頂端使用 requires pointer_composite_access;,指出無法遷移的可能性。請參考以下範例和問題 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.
  }`
});

將模板和深度層面的唯讀狀態分開

以前,算繪中的唯讀深度模板附件 (深度和模板) 都必須處於唯讀狀態。這項限制已解除。現在,您可以使用深度切入 (唯讀),進行接觸陰影追蹤 (例如,模板緩衝區會寫入模塊),以便後續處理。請參閱問題 dawn:2146

日出最新消息

系統現在會在發生錯誤時立即呼叫使用 wgpuDeviceSetUncapturedErrorCallback() 設定的未擷取錯誤回呼。這屬於開發人員持續的預期和偵錯要求。請參閱變更 dawn:173620

已導入 webgpu.h API 中的 wgpuSurfaceGetPreferredFormat() 方法。請參閱問題 dawn:1362

這只涵蓋部分重點功能。請參閱完整的修訂版本清單

WebGPU 新功能

WebGPU 最新消息系列中所有包含的清單。

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