Hỗ trợ giá trị dấu phẩy động 16 bit trong WGSL
Trong WGSL, kiểu f16
là tập hợp các giá trị dấu phẩy động 16 bit của định dạng nhị phân16 IEEE-754 (bán chính xác). Điều này có nghĩa là nó sử dụng 16 bit để biểu thị một số dấu phẩy động, thay vì 32 bit cho dấu phẩy động độ chính xác đơn thông thường (f32
). Kích thước nhỏ hơn này có thể dẫn đến cải thiện đáng kể hiệu suất, đặc biệt là khi xử lý lượng lớn dữ liệu.
Để so sánh, trên thiết bị Apple M1 Pro, việc triển khai f16
của các mô hình Llama2 7B dùng trong bản minh hoạ trò chuyện WebLLM nhanh hơn đáng kể so với việc triển khai f32
, với tốc độ điền trước cải thiện 28% và tốc độ giải mã cải thiện 41% như trong ảnh chụp màn hình sau.
Không phải GPU nào cũng hỗ trợ giá trị dấu phẩy động 16 bit. Khi tính năng "shader-f16"
có sẵn trong GPUAdapter
, giờ đây, bạn có thể yêu cầu GPUDevice
có tính năng này và tạo mô-đun chương trình đổ bóng WGSL tận dụng loại dấu phẩy động có độ chính xác nửa f16
. Bạn chỉ có thể sử dụng loại này trong mô-đun chương trình đổ bóng WGSL nếu bật tiện ích WGSL f16
bằng enable f16;
. Nếu không, createShaderModule() sẽ tạo lỗi xác thực. Hãy xem ví dụ tối thiểu sau và vấn đề dawn:1510.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("shader-f16")) {
throw new Error("16-bit floating-point value support is not available");
}
// Explicitly request 16-bit floating-point value support.
const device = await adapter.requestDevice({
requiredFeatures: ["shader-f16"],
});
const code = `
enable f16;
@compute @workgroup_size(1)
fn main() {
const c : vec3h = vec3<f16>(1.0h, 2.0h, 3.0h);
}
`;
const shaderModule = device.createShaderModule({ code });
// Create a compute pipeline with this shader module
// and run the shader on the GPU...
Bạn có thể hỗ trợ cả loại f16
và f32
trong mã mô-đun chương trình đổ bóng WGSL bằng alias
tuỳ thuộc vào tính năng hỗ trợ "shader-f16"
như trong đoạn mã sau.
const adapter = await navigator.gpu.requestAdapter();
const hasShaderF16 = adapter.features.has("shader-f16");
const device = await adapter.requestDevice({
requiredFeatures: hasShaderF16 ? ["shader-f16"] : [],
});
const header = hasShaderF16
? `enable f16;
alias min16float = f16;`
: `alias min16float = f32;`;
const code = `
${header}
@compute @workgroup_size(1)
fn main() {
const c = vec3<min16float>(1.0, 2.0, 3.0);
}
`;
Phá vỡ giới hạn
Theo mặc định, số byte tối đa cần thiết để lưu trữ một mẫu (pixel hoặc pixel phụ) của dữ liệu đầu ra của quy trình kết xuất, trên tất cả các tệp đính kèm màu là 32 byte. Giờ đây, bạn có thể yêu cầu tối đa 64 bằng cách sử dụng giới hạn maxColorAttachmentBytesPerSample
. Hãy xem ví dụ sau và vấn đề dawn:2036.
const adapter = await navigator.gpu.requestAdapter();
if (adapter.limits.maxColorAttachmentBytesPerSample < 64) {
// When the desired limit isn't supported, take action to either fall back to
// a code path that does not require the higher limit or notify the user that
// their device does not meet minimum requirements.
}
// Request highest limit of max color attachments bytes per sample.
const device = await adapter.requestDevice({
requiredLimits: { maxColorAttachmentBytesPerSample: 64 },
});
Giới hạn maxInterStageShaderVariables
và maxInterStageShaderComponents
dùng để giao tiếp giữa các giai đoạn đã được tăng lên trên tất cả các nền tảng. Hãy xem vấn đề dawn:1448 để biết thông tin chi tiết.
Theo mặc định, đối với mỗi giai đoạn chương trình đổ bóng, số mục nhập bố cục nhóm liên kết tối đa trên bố cục quy trình là 8 vùng đệm lưu trữ. Giờ đây, bạn có thể yêu cầu tối đa 10 mã bằng cách sử dụng giới hạn maxStorageBuffersPerShaderStage
. Xem vấn đề dawn:2159.
Thêm giới hạn maxBindGroupsPlusVertexBuffers
mới. Giá trị này bao gồm số lượng tối đa của nhóm liên kết và các khe đệm đỉnh được sử dụng đồng thời, tính cả mọi khe trống bên dưới chỉ mục cao nhất. Giá trị mặc định là 24. Xem vấn đề dawn:1849.
Các thay đổi đối với trạng thái depth-stencil
Để cải thiện trải nghiệm cho nhà phát triển, các thuộc tính trạng thái độ sâu-khung đệm depthWriteEnabled
và depthCompare
không phải lúc nào cũng bắt buộc nữa: depthWriteEnabled
chỉ bắt buộc đối với các định dạng có độ sâu và depthCompare
không bắt buộc đối với các định dạng có độ sâu nếu không được sử dụng. Xem vấn đề dawn:2132.
Thông tin cập nhật về bộ chuyển đổi
Các thuộc tính thông tin trình chuyển đổi type
và backend
không chuẩn hiện có sẵn khi gọi requestAdapterInfo() khi người dùng đã bật cờ "Tính năng dành cho nhà phát triển WebGPU" tại chrome://flags/#enable-webgpu-developer-features
. type
có thể là "GPU riêng biệt", "GPU tích hợp", "CPU" hoặc "không xác định". backend
là "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" hoặc "null". Xem vấn đề dawn:2112 và vấn đề dawn:2107.
Xoá tham số danh sách unmaskHints
không bắt buộc trong requestAdapterInfo(). Xem vấn đề dawn:1427.
Số lượng dấu thời gian truy vấn
Truy vấn dấu thời gian cho phép các ứng dụng đo lường thời gian thực thi của các lệnh GPU với độ chính xác nano giây. Tuy nhiên, thông số kỹ thuật WebGPU không bắt buộc phải có truy vấn dấu thời gian do lo ngại về tấn công theo thời gian. Nhóm Chrome tin rằng việc lượng tử hoá các truy vấn về dấu thời gian sẽ mang lại giải pháp hợp lý giữa độ chính xác và tính bảo mật, bằng cách giảm độ phân giải xuống 100 micrô giây. Xem vấn đề dawn:1800.
Trong Chrome, người dùng có thể tắt tính năng lượng tử hoá dấu thời gian bằng cách bật cờ "Tính năng dành cho nhà phát triển WebGPU" tại chrome://flags/#enable-webgpu-developer-features
. Xin lưu ý rằng chỉ cờ này thôi không thể bật tính năng "timestamp-query"
. Việc triển khai vẫn đang trong giai đoạn thử nghiệm và do đó cần có cờ "Unsafe WebGPU Support" (Hỗ trợ WebGPU không an toàn) tại chrome://flags/#enable-unsafe-webgpu
.
Trong Dawn, một nút bật/tắt thiết bị mới có tên là "timestamp_quantization" đã được thêm vào và được bật theo mặc định. Đoạn mã sau đây cho bạn biết cách cho phép tính năng "truy vấn dấu thời gian" thử nghiệm mà không cần lượng tử hoá dấu thời gian khi yêu cầu thiết bị.
wgpu::DawnTogglesDescriptor deviceTogglesDesc = {};
const char* allowUnsafeApisToggle = "allow_unsafe_apis";
deviceTogglesDesc.enabledToggles = &allowUnsafeApisToggle;
deviceTogglesDesc.enabledToggleCount = 1;
const char* timestampQuantizationToggle = "timestamp_quantization";
deviceTogglesDesc.disabledToggles = ×tampQuantizationToggle;
deviceTogglesDesc.disabledToggleCount = 1;
wgpu::DeviceDescriptor desc = {.nextInChain = &deviceTogglesDesc};
// Request a device with no timestamp quantization.
myAdapter.RequestDevice(&desc, myCallback, myUserData);
Các tính năng dọn dẹp đón mùa xuân
Tính năng thử nghiệm "timestamp-query-inside-passes" đã được đổi tên thành "chromium-experimental-timestamp-query-inside-passes" để nhà phát triển hiểu rõ rằng tính năng này đang trong giai đoạn thử nghiệm và hiện chỉ có trong các trình duyệt dựa trên Chromium. Xem vấn đề buổi sáng:1193.
Tính năng "pipeline-statistics-query" thử nghiệm (chỉ được triển khai một phần) đã bị xoá vì không còn được phát triển nữa. Xem vấn đề chromium:1177506.
Nội dung này chỉ đề cập đến một số điểm nổi bật chính. Hãy xem danh sách các thay đổi đầy đủ.
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 131
- Cắt khoảng cách trong WGSL
- GPUCanvasContext getConfiguration()
- Mã gốc điểm và đường kẻ không được có sai lệch chiều sâu
- Hàm tích hợp quét toàn diện cho các nhóm con
- Hỗ trợ thử nghiệm cho nhiều bản vẽ gián tiếp
- Toán học nghiêm ngặt về tuỳ chọn biên dịch mô-đun đổ bóng
- Xoá GPUAdapter requestAdapterInfo()
- Thông tin cập nhật về Dawn
Chrome 130
- Hỗn hợp nguồn kép
- Cải thiện thời gian biên dịch chương trình đổ bóng trên Metal
- Ngừng sử dụng GPUAdapter requestAdapterInfo()
- Thông tin cập nhật về Dawn
Chrome 129
- Hỗ trợ HDR bằng chế độ ánh xạ tông màu canvas
- Mở rộng tính năng hỗ trợ nhóm con
- Thông tin cập nhật về bình minh
Chrome 128
- Thử nghiệm với các nhóm nhỏ
- Giảm tình trạng sai lệch độ sâu cho đường và điểm
- Ẩn cảnh báo Công cụ cho nhà phát triển về lỗi không được ghi lại nếu preventDefault
- WGSL nội suy lấy mẫu trước và
- Thông tin cập nhật về Dawn
Chrome 127
- Hỗ trợ thử nghiệm cho OpenGL ES trên Android
- Thuộc tính thông tin GPUAdapter
- Cải tiến khả năng tương tác của WebAssembly
- Cải thiện lỗi bộ mã hoá lệnh
- Thông tin cập nhật về Dawn
Chrome 126
- Tăng giới hạn maxTextureArrayLayers
- Tối ưu hoá tính năng tải vùng đệm lên cho phần phụ trợ Vulkan
- Cải thiện thời gian biên dịch chương trình đổ bóng
- Vùng đệm lệnh đã gửi phải là duy nhất
- Thông tin cập nhật về Dawn
Chrome 125
- Nhóm con (tính năng đang được phát triển)
- Hiển thị lát cắt của hoạ tiết 3D
- Thông tin cập nhật về Dawn
Chrome 124
- Kết cấu bộ nhớ chỉ đọc và đọc-ghi
- Hỗ trợ worker và worker dùng chung
- Thuộc tính mới về thông tin của bộ chuyển đổi
- Sửa lỗi
- Thông tin cập nhật về Dawn
Chrome 123
- Hỗ trợ các hàm tích hợp DP4a trong WGSL
- Tham số con trỏ không bị hạn chế trong WGSL
- Cú pháp đơn giản để huỷ tham chiếu các thành phần kết hợp trong WGSL
- Trạng thái chỉ có thể đọc riêng biệt cho các khía cạnh của bản in và chiều sâu
- Thông tin cập nhật về Dawn
Chrome 122
- Mở rộng phạm vi tiếp cận bằng chế độ tương thích (tính năng đang trong quá trình phát triển)
- Tăng giới hạn maxVertexAttributes
- Thông tin cập nhật về bình minh
Chrome 121
- Hỗ trợ WebGPU trên Android
- Sử dụng DXC thay vì FXC để biên dịch chương trình đổ bóng trên Windows
- Truy vấn dấu thời gian trong các lượt tính toán và kết xuất
- Điểm truy cập mặc định đến mô-đun chương trình đổ bóng
- Hỗ trợ display-p3 dưới dạng hệ màu GPUExternalTexture
- Thông tin về vùng nhớ khối xếp
- Thông tin cập nhật về Dawn
Chrome 120
- Hỗ trợ giá trị dấu phẩy động 16 bit trong WGSL
- Vượt giới hạn
- Thay đổi đối với trạng thái chiều sâu-khung đệm
- Cập nhật thông tin về bộ chuyển đổi
- Định lượng truy vấn dấu thời gian
- Các tính năng dọn dẹp mùa xuân
Chrome 119
- Hoạ tiết nổi 32 bit có thể lọc
- Định dạng đỉnh unorm10-10-10-2
- Định dạng hoạ tiết rgb10a2uint
- Thông tin cập nhật về Dawn
Chrome 118
- Hỗ trợ HTMLImageElement và ImageData trong
copyExternalImageToTexture()
- Hỗ trợ thử nghiệm cho hoạ tiết bộ nhớ đọc-ghi và chỉ đọc
- Thông tin cập nhật về bình minh
Chrome 117
- Huỷ đặt vùng đệm đỉnh
- Huỷ đặt nhóm liên kết
- Loại bỏ lỗi khi tạo quy trình không đồng bộ khi thiết bị bị mất
- Thông tin cập nhật về quá trình tạo mô-đun chương trình đổ bóng SPIR-V
- Cải thiện trải nghiệm của nhà phát triển
- Lưu các quy trình vào bộ nhớ đệm bằng bố cục được tạo tự động
- Thông tin cập nhật về Dawn
Chrome 116
- Tích hợp WebCodecs
- Thiết bị bị mất do GPUAdapter
requestDevice()
trả về - Giữ cho video phát mượt mà nếu
importExternalTexture()
được gọi - Tuân thủ quy cách
- Cải thiện trải nghiệm của nhà phát triển
- Thông tin cập nhật về Dawn
Chrome 115
- Các tiện ích ngôn ngữ WGSL được hỗ trợ
- Hỗ trợ thử nghiệm cho Direct3D 11
- Nhận GPU rời theo mặc định khi dùng nguồn AC
- Cải thiện trải nghiệm của nhà phát triển
- Thông tin cập nhật về bình minh
Chrome 114
- Tối ưu hoá JavaScript
- getCurrentTexture() trên canvas chưa được định cấu hình sẽ gửi InvalidStateError
- Nội dung cập nhật về WGSL
- Thông tin cập nhật về Dawn