WebGPU 的新变化 (Chrome 128)

François Beaufort
François Beaufort

尝试使用子群组

子群组功能可实现 SIMD 级并行性,从而使群组内的线程能够进行通信并执行集体数学运算(例如,计算 16 个数字的总和)。这提供了一种高效的跨线程数据共享形式。

子群组提案的最小实现已在 chrome://flags/#enable-unsafe-webgpu 中通过“Unsafe WebGPU Support”标志提供,可用于本地测试。

您还可以通过注册源试用,在网站上针对真实用户尝试使用子群组。如需了解如何准备网站以使用源试用,请参阅源试用使用入门。源试用将从 Chrome 128 开始,到 Chrome 131 结束(2025 年 2 月 19 日)。请参阅意向到实验

"subgroups" 功能在 GPUAdapter 中可用时,请请求具有此功能的 GPUDevice,以在 WGSL 中获得子群组支持,并检查其 minSubgroupSizemaxSubgroupSize 限制。

您还需要使用 enable subgroups; 在 WGSL 代码中明确启用此扩展程序。启用后,您将可以访问以下附加功能:

  • subgroup_invocation_id:子群组中线程的索引的内置值。
  • subgroup_size:用于访问子组大小的内置值。
  • subgroupBallot(value):返回一组位字段,其中与 subgroup_invocation_id 对应的位为 1 表示 value 对于相应活跃调用为 true,否则为 0。
  • subgroupBroadcast(value, id):将调用中 subgroup_invocation_idid 相匹配的 value 从调用广播到子组中的所有调用。注意:id 必须是编译时常量。

未来还会添加更多内置函数,例如 subgroupAddsubgroupAllsubgroupElectsubgroupShuffle。请参阅问题 354738715

如需在子群组操作中允许使用 f16,请请求具有 "subgroups""subgroups-f16""shader-f16" 功能的 GPUDevice,然后在 WGSL 代码中使用 enable f16, subgroups, subgroups_f16; 启用该功能。

以下代码段提供了一个基础,可供您进行试验并发现子组的潜力。

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

弃用了为线和点设置深度偏差的功能

一项 WebGPU 规范变更规定,当渲染流水线的拓扑为线或点类型时,将 depthBiasdepthBiasSlopeScaledepthBiasClamp 设置为非零值会引发验证错误。为了让开发者有足够的时间更新代码,开发者工具控制台中会显示有关此即将进行的验证的警告,同时在这些情况下强制将值设为 0。请参阅问题 352567424

如果 preventDefault,则隐藏未捕获的错误开发者工具警告

在开发者工具控制台中,如果已注册 uncapturederror 的事件监听器,并且已在事件监听器回调中调用 Event preventDefault() 方法,则不再显示 uncapturederror 事件的警告。此行为与 JavaScript 中的事件处理相符。请参阅以下示例和问题 40263619

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL 先进行插值采样,然后

借助 WGSL interpolate 属性,您可以管理用户定义的 IO 数据插值。现在,新的插值采样参数 first(默认)和 either 可让您进行更多控制:first 使用图元的第一个顶点的值,而 either 允许使用第一个或最后一个顶点。请参阅问题 340278447

Dawn 更新

用于处理异步操作的 Dawn 的 WGPUFuture 实现现已完成。关键概念包括用于机会性事件处理的 wgpuInstanceProcessEvents 和用于定义回调位置的 WGPUCallbackMode。WGPUFuture 表示生命周期无限的一次性事件,而 wgpuInstanceWaitAny 会等待任何 future 完成或超时。请参阅问题 42240932

CompositeAlphaMode::Auto 值现在不会由 Surface::GetCapabilities() 报告。它仍然有效,相当于 Surface::GetCapabilities().alphaMode[0]。请参阅问题 292

OpenGL 后端现在支持 Surface,并为每次 Present() 调用提供 Y 翻转 blit。请参阅问题 344814083

Adapter::GetProperties() 方法已被弃用,请改用 Adapter::GetInfo()

外部贡献者 Jaswant 重写了所有 CMake 文件,使它们更易于更新,并支持预构建。如需了解如何在 CMake 项目中使用 Dawn,请查看快速入门指南

这仅涵盖了部分重要亮点。查看详尽的提交列表

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