GPUComputePassEncoder: Methode dispatchWorkgroups()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die Methode dispatchWorkgroups()
der GPUComputePassEncoder
Schnittstelle sendet eine bestimmte Anordnung von Workgroups, um die Arbeit auszuführen, die von der aktuellen GPUComputePipeline
durchgeführt wird (d.h. festgelegt über GPUComputePassEncoder.setPipeline()
).
Syntax
dispatchWorkgroups(workgroupCountX)
dispatchWorkgroups(workgroupCountX, workgroupCountY)
dispatchWorkgroups(workgroupCountX, workgroupCountY, workgroupCountZ)
Parameter
workgroupCountX
-
Die X-Dimension des zu sendenden Workgroup-Gitters.
workgroupCountY
Optional-
Die Y-Dimension des zu sendenden Workgroup-Gitters. Wenn weggelassen, ist der Standardwert für
workgroupCountY
1. workgroupCountZ
Optional-
Die Z-Dimension des zu sendenden Workgroup-Gitters. Wenn weggelassen, ist der Standardwert für
workgroupCountZ
1.
Hinweis:
Die an dispatchWorkgroups()
und GPUComputePassEncoder.dispatchWorkgroupsIndirect()
übergebenen X-, Y- und Z-Dimensionswerte sind die Anzahl der Workgroups, die für jede Dimension gesendet werden sollen, nicht die Anzahl der Shader-Aufrufe, die über jede Dimension hinweg ausgeführt werden sollen. Dies entspricht dem Verhalten moderner nativer GPU-APIs, unterscheidet sich jedoch vom Verhalten von OpenCL. Das bedeutet, wenn ein GPUShaderModule
einen Einstiegspunkt mit @workgroup_size(4, 4)
definiert und Arbeit damit mit dem Aufruf passEncoder.dispatchWorkgroups(8, 8);
gesendet wird, wird der Einstiegspunkt insgesamt 1024 mal aufgerufen — Es wird eine 4 x 4 Workgroup 8 Mal entlang sowohl der X- als auch der Y-Achse gesendet. 4 * 4 * 8 * 8 = 1024
.
Rückgabewert
Keiner (Undefined
).
Validierung
Die folgenden Kriterien müssen erfüllt sein, wenn dispatchWorkgroups()
aufgerufen wird, andernfalls wird ein GPUValidationError
erzeugt und der GPUComputePassEncoder
wird ungültig:
Beispiele
In unserem einfachen Compute-Demo werden mehrere Befehle über einen GPUCommandEncoder
aufgezeichnet. Die meisten dieser Befehle stammen vom GPUComputePassEncoder
, der über beginComputePass()
erstellt wurde.
Am Anfang des Codes wird eine globale Puffergröße von 1000 festgelegt. Beachten Sie auch, dass die Workgroup-Größe im Shader auf 64 gesetzt ist.
const BUFFER_SIZE = 1000;
// Compute shader
const shader = `
@group(0) @binding(0)
var<storage, read_write> output: array<f32>;
@compute @workgroup_size(64)
...
`;
Später im Code wird der workgroupCountX
Parameter der dispatchWorkgroups()
-Methode basierend auf der globalen Puffergröße und der Shader-Workgroup-Anzahl festgelegt.
// …
// 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()]);
// …
Spezifikationen
Specification |
---|
WebGPU # dom-gpucomputepassencoder-dispatchworkgroups |
Browser-Kompatibilität
Siehe auch
- Die WebGPU API