GPUComputePassEncoder: dispatchWorkgroups() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

GPUComputePassEncoder 接口的 dispatchWorkgroups() 方法会分派一组特定网格的工作组,以执行当前 GPUComputePipeline 所做的(即通过 GPUComputePassEncoder.setPipeline() 设置的)工作。

语法

js
dispatchWorkgroups(workgroupCountX)
dispatchWorkgroups(workgroupCountX, workgroupCountY)
dispatchWorkgroups(workgroupCountX, workgroupCountY, workgroupCountZ)

参数

workgroupCountX

要分派的工作组网格的 X 维度。

workgroupCountY 可选

要分派的工作组网格的 Y 维度。如果省略,workgroupCountY 默认为 1。

workgroupCountZ 可选

要分派的工作组网格的 Z 维度。如果省略,workgroupCountZ 默认为 1。

注意: 传递给 dispatchWorkgroups()GPUComputePassEncoder.dispatchWorkgroupsIndirect() 的 X、Y 和 Z 维度值是要为每个维度分派的工作组数量,而不是要在每个维度上执行的着色器调用数量。这与现代原生 GPU API 的行为一致,但与 OpenCL 的行为不同。这意味着,如果一个 GPUShaderModule 定义了一个入口点,其 `@workgroup_size(4, 4)`,并且使用调用 passEncoder.dispatchWorkgroups(8, 8); 将工作分派给它,那么该入口点将总共调用 1024 次 — 在 X 和 Y 轴上各分派 8 个 4 x 4 的工作组。 4 * 4 * 8 * 8 = 1024

返回值

无 (Undefined)。

验证

调用 dispatchWorkgroups() 时必须满足以下条件,否则将生成 GPUValidationError 并且 GPUComputePassEncoder 将变得无效。

  • workgroupCountXworkgroupCountYworkgroupCountZ 都小于或等于 GPUDevicemaxComputeWorkgroupsPerDimension 限制

示例

在我们的 基本计算演示 中,通过 GPUCommandEncoder 记录了几个命令。其中大多数命令都源自通过 beginComputePass() 创建的 GPUComputePassEncoder

在代码的开头,我们将全局缓冲区大小设置为 1000。另外,请注意,着色器中的工作组大小设置为 64。

js
const BUFFER_SIZE = 1000;

// Compute shader
const shader = `
@group(0) @binding(0)
var<storage, read_write> output: array<f32>;

@compute @workgroup_size(64)

...

`;

在代码的后面,dispatchWorkgroups()workgroupCountX 参数是根据全局缓冲区大小和着色器工作组计数设置的。

js
// …

// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();

// Initiate render pass
const passEncoder = commandEncoder.beginComputePass();

// Issue commands
passEncoder.setPipeline(computePipeline);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.dispatchWorkgroups(Math.ceil(BUFFER_SIZE / 64));

// End the render pass
passEncoder.end();

// Copy output buffer to staging buffer
commandEncoder.copyBufferToBuffer(
  output,
  0, // Source offset
  stagingBuffer,
  0, // Destination offset
  BUFFER_SIZE,
);

// End frame by passing array of command buffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);

// …

规范

规范
WebGPU
# dom-gpucomputepassencoder-dispatchworkgroups

浏览器兼容性

另见