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

瀏覽器相容性

另見