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 著色器程式碼中使用點積指令。您也可以搭配 pack4xI8pack4xU8pack4xI8Clamppack4xU8Clampunpack4xI8unpack4xU8 WGSL 內建函式,使用封裝和解除封裝指令,處理封裝的 8 位元整數 4 元件向量。

建議在 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 規格變更問題 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.
  }`
});

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

先前,算繪通道中的唯讀深度樣板附件需要同時具備深度和樣板的唯讀屬性。這項限制已解除。現在,您可以唯讀使用深度層面,例如追蹤接觸陰影,同時寫入模板緩衝區,以識別要進一步處理的像素。請參閱問題 dawn:2146

黎明更新

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

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

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

WebGPU 最新消息

WebGPU 最新消息」系列涵蓋的所有主題清單。

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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