GPUComputePassEncoder: dispatchWorkgroups() 方法
注意:此功能在 Web Workers 中可用。
GPUComputePassEncoder 接口的 dispatchWorkgroups() 方法会分派一组特定网格的工作组,以执行当前 GPUComputePipeline 所做的(即通过 GPUComputePassEncoder.setPipeline() 设置的)工作。
语法
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 将变得无效。
示例
在我们的 基本计算演示 中,通过 GPUCommandEncoder 记录了几个命令。其中大多数命令都源自通过 beginComputePass() 创建的 GPUComputePassEncoder。
在代码的开头,我们将全局缓冲区大小设置为 1000。另外,请注意,着色器中的工作组大小设置为 64。
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 参数是根据全局缓冲区大小和着色器工作组计数设置的。
// …
// 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 |
浏览器兼容性
加载中…