Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. Web-APIs
  3. GPUComputePassEncoder
  4. dispatchWorkgroupsIndirect()

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

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.

Syntax

js
dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset)

Parameter

indirectBuffer

EinGPUBuffer, 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:

js
const 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);
indirectOffset

Der Offset in Bytes innerhalb vonindirectBuffer, 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.usage vonindirectBuffer enthält das FlagGPUBufferUsage.INDIRECT.
  • indirectOffset + die durch die DimensionenX,Y undZ angegebene Gesamtgröße ist kleiner oder gleich derGPUBuffer.size vonindirectBuffer.
  • indirectOffset ist ein Vielfaches von 4.

Beispiele

js
// 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

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp