Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
GPUComputePassEncoder: Methode dispatchWorkgroupsIndirect()
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Sicherer Kontext: Diese Funktion ist nur insicheren Kontexten (HTTPS) in einigen oder allenunterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist inWeb Workers verfügbar.
DiedispatchWorkgroupsIndirect()-Methode derGPUComputePassEncoder-Schnittstelle startet ein Raster von Workgroups, das durch die Parameter einesGPUBuffer definiert wird, um die vom aktuellenGPUComputePipeline ausgeführte Arbeit (d.h. festgelegt überGPUComputePassEncoder.setPipeline()) zu erledigen.
In diesem Artikel
Syntax
dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset)Parameter
indirectBufferEin
GPUBuffer, der die X-, Y- und Z-Dimensionen des Rasters von Workgroups enthält, die gestartet werden sollen. Der Puffer muss einen fest gepackten Block von drei 32-Bit-Ganzzahlen ohne Vorzeichen enthalten, der die Dimensionen (insgesamt 12 Bytes) in der gleichen Reihenfolge wie die Argumente fürGPUComputePassEncoder.dispatchWorkgroups()darstellt. Zum Beispiel:jsconst uint32 = new Uint32Array(3);uint32[0] = 25; // The X valueuint32[1] = 1; // The Y valueuint32[2] = 1; // The Z value// Write values into a GPUBufferdevice.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);indirectOffsetDer Offset in Bytes innerhalb von
indirectBuffer, an dem die Dimensionsdaten beginnen.
Hinweis:Die X-, Y- und Z-Dimensionen, die anGPUComputePassEncoder.dispatchWorkgroups() unddispatchWorkgroupsIndirect() übergeben werden, sind die Anzahl der Workgroups, die für jede Dimension gestartet werden sollen, nicht die Anzahl von Shader-Aufrufen, die über jede Dimension ausgeführt werden sollen. Dies entspricht dem Verhalten moderner nativer GPU-APIs, unterscheidet sich jedoch vom Verhalten von OpenCL. Das bedeutet, wenn einGPUShaderModule einen Einstiegspunkt mit@workgroup_size(4, 4) definiert und Arbeit mit dem AufrufdispatchWorkgroupsIndirect(indirectBuffer); gestartet wird, wobeiindirectBuffer die X- und Y-Dimensionen von 8 und 8 angibt, wird der Einstiegspunkt insgesamt 1024 Mal aufgerufen — ein 4 x 4 Workgroup wird 8 Mal entlang der X- und Y-Achsen gestartet.4 * 4 * 8 * 8 = 1024.
Rückgabewert
Keiner (Undefined).
Validierung
Die folgenden Kriterien müssen beim Aufruf vondispatchWorkgroupsIndirect() erfüllt sein, andernfalls wird einGPUValidationError erzeugt und derGPUComputePassEncoder wird ungültig:
GPUBuffer.usagevonindirectBufferenthält das FlagGPUBufferUsage.INDIRECT.indirectOffset+ die durch die DimensionenX,YundZangegebene Gesamtgröße ist kleiner oder gleich derGPUBuffer.sizevonindirectBuffer.indirectOffsetist ein Vielfaches von 4.
Beispiele
// Set global buffer sizeconst BUFFER_SIZE = 1000;// Compute shader; note workgroup size of 64const shader = `@group(0) @binding(0)var<storage, read_write> output: array<f32>;@compute @workgroup_size(64)...`;// …// Create GPUCommandEncoder to encode commands to issue to the GPUconst commandEncoder = device.createCommandEncoder();// Initiate render passconst passEncoder = commandEncoder.beginComputePass();// Issue commandspassEncoder.setPipeline(computePipeline);passEncoder.setBindGroup(0, bindGroup);const uint32 = new Uint32Array(3);// Note workgroupCountX is set based on the global buffer size and the shader workgroup count.uint32[0] = Math.ceil(BUFFER_SIZE / 64);uint32[1] = 1;uint32[2] = 1;const workgroupDimensions = device.createBuffer({ size: 12, usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,});device.queue.writeBuffer(workgroupDimensions, 0, uint32, 0, uint32.length);passEncoder.dispatchWorkgroupsIndirect(workgroupDimensions, 0);// End the render passpassEncoder.end();// Copy output buffer to staging buffercommandEncoder.copyBufferToBuffer( output, 0, // Source offset stagingBuffer, 0, // Destination offset BUFFER_SIZE,);// End frame by passing array of command buffers to command queue for executiondevice.queue.submit([commandEncoder.finish()]);// …Spezifikationen
| Specification |
|---|
| WebGPU> # dom-gpucomputepassencoder-dispatchworkgroupsindirect> |
Browser-Kompatibilität
Siehe auch
- DieWebGPU API