Tính năng mới trong WebGPU (Chrome'123)

François Beaufort
François Beaufort

Hỗ trợ các hàm tích hợp DP4a trong WGSL

DP4a (Dot Product of 4 Elements and Accumulate) đề cập đến một tập hợp các chỉ dẫn GPU thường được dùng trong suy luận học sâu để định lượng. Nó thực hiện hiệu quả tích vô hướng số nguyên 8 bit để tăng tốc quá trình tính toán các mô hình được định lượng int8 như vậy. Điều này có thể giúp tiết kiệm (tối đa 75%) bộ nhớ và băng thông mạng, đồng thời cải thiện hiệu suất của mọi mô hình học máy trong quá trình suy luận so với phiên bản f32. Do đó, hiện nay, nó được sử dụng rộng rãi trong nhiều khung AI phổ biến.

Khi tiện ích ngôn ngữ "packed_4x8_integer_dot_product" WGSL có trong navigator.gpu.wgslLanguageFeatures, giờ đây, bạn có thể sử dụng các đại lượng vô hướng số nguyên 32 bit đóng gói các vectơ 4 thành phần của số nguyên 8 bit làm đầu vào cho các chỉ dẫn tích của hai vectơ trong mã chương trình đổ bóng WGSL bằng các hàm tích hợp dot4U8Packeddot4I8Packed. Bạn cũng có thể sử dụng hướng dẫn đóng gói và giải nén với các vectơ 4 thành phần được đóng gói gồm các số nguyên 8 bit bằng các hàm tích hợp pack4xI8, pack4xU8, pack4xI8Clamp, pack4xU8Clamp, unpack4xI8unpack4xU8 WGSL.

Bạn nên sử dụng một requires-directive để báo hiệu khả năng không thể chuyển đổi với requires packed_4x8_integer_dot_product; ở đầu mã chương trình đổ bóng WGSL. Hãy xem ví dụ sau và vấn đề về màu: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
  }`,
});

Xin chân thành cảm ơn Nhóm đồ hoạ web của Intel tại Thượng Hải đã thúc đẩy việc hoàn tất quy cách và việc triển khai này!

Tham số con trỏ không hạn chế trong WGSL

Tiện ích ngôn ngữ "unrestricted_pointer_parameters" WGSL nới lỏng các hạn chế về con trỏ có thể được truyền đến các hàm WGSL:

  • Con trỏ tham số của không gian địa chỉ storage, uniformworkgroup cho các hàm do người dùng khai báo.

  • Truyền con trỏ đến các thành phần cấu trúc và phần tử mảng cho các hàm do người dùng khai báo.

Hãy xem Con trỏ dưới dạng tham số hàm | Chuyến tham quan WGSL để tìm hiểu thêm về vấn đề này.

Bạn có thể phát hiện tính năng này bằng cách dùng navigator.gpu.wgslLanguageFeatures. Bạn nên luôn sử dụng một requires-directive để báo hiệu khả năng không thể chuyển đổi với requires unrestricted_pointer_parameters; ở đầu mã chương trình đổ bóng WGSL. Hãy xem ví dụ sau, các thay đổi về thông số kỹ thuật WGSLvấn đề về màu sắc: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);
  }`
});

Cú pháp đơn giản để huỷ tham chiếu các thành phần trong WGSL

Khi tiện ích ngôn ngữ "pointer_composite_access" WGSL có trong navigator.gpu.wgslLanguageFeatures, mã chương trình đổ bóng WGSL của bạn hiện hỗ trợ quyền truy cập vào các thành phần của kiểu dữ liệu phức tạp bằng cách sử dụng cùng một cú pháp dấu chấm (.) cho dù bạn đang làm việc trực tiếp với dữ liệu hay với một con trỏ đến dữ liệu đó. Cách sử dụng như sau:

  • Nếu foo là một con trỏ: foo.bar là cách thuận tiện hơn để viết (*foo).bar. Thông thường, bạn cần dùng dấu hoa thị (*) để biến con trỏ thành một "tham chiếu" có thể được huỷ tham chiếu, nhưng giờ đây cả con trỏ và tham chiếu đều tương tự nhau hơn nhiều và gần như có thể thay thế cho nhau.

  • Nếu foo không phải là con trỏ: Toán tử dấu chấm (.) hoạt động chính xác như bạn thường dùng để truy cập trực tiếp vào các thành phần.

Tương tự, nếu pa là một con trỏ lưu trữ địa chỉ bắt đầu của một mảng, thì việc sử dụng pa[i] sẽ cho phép bạn truy cập trực tiếp vào vị trí bộ nhớ nơi phần tử thứ 'i của mảng đó được lưu trữ.

Bạn nên sử dụng một requires-directive để báo hiệu khả năng không thể chuyển đổi với requires pointer_composite_access; ở đầu mã chương trình đổ bóng WGSL. Hãy xem ví dụ sau và vấn đề về màu sắc: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.
  }`
});

Trạng thái chỉ đọc riêng biệt cho các khía cạnh về khuôn tô và độ sâu

Trước đây, các tệp đính kèm khuôn tô chiều sâu chỉ có thể đọc trong các lượt kết xuất yêu cầu cả hai khía cạnh (chiều sâu và khuôn tô) đều chỉ có thể đọc. Hạn chế này đã được gỡ bỏ. Giờ đây, bạn có thể sử dụng khía cạnh chiều sâu ở chế độ chỉ đọc, chẳng hạn như để theo dõi bóng đổ tiếp xúc, trong khi vùng đệm khuôn được ghi để xác định các pixel cho quá trình xử lý tiếp theo. Xem vấn đề dawn:2146.

Thông tin cập nhật về bình minh

Lệnh gọi lại lỗi chưa được ghi nhận được đặt bằng wgpuDeviceSetUncapturedErrorCallback() hiện được gọi ngay lập tức khi xảy ra lỗi. Đây là điều mà các nhà phát triển luôn mong đợi và muốn có để gỡ lỗi. Xem thay đổi dawn:173620.

Phương thức wgpuSurfaceGetPreferredFormat() trong API webgpu.h đã được triển khai. Xem vấn đề dawn:1362.

Đây chỉ là một số điểm nổi bật chính. Xem danh sách đầy đủ các cam kết.

Tính năng mới trong WebGPU

Danh sách mọi nội dung đã được đề cập trong loạt bài Tính năng mới trong 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