Spec-Zone.ru › Web APIs

GPUComputePassEncoder: метод dispatchWorkgroupsIndirect()

Ограниченная доступность

Эта функция не относится к Baseline, так как она не работает во всех наиболее широко используемых браузерах.

  • Подробнее
  • Полная совместимость
  • Отправить отзыв

Экспериментально: Это экспериментальная технология
Перед использованием в производстве внимательно проверьте таблицу совместимости браузеров .

Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.

Примечание: Эта функция доступна в Web Workers.

Метод dispatchWorkgroupsIndirect() интерфейса GPUComputePassEncoder отправляет сетку рабочих групп, определяемых параметрами GPUBuffer, для выполнения работы, выполняемой текущим GPUComputePipeline (т.е. установленным с помощью GPUComputePassEncoder.setPipeline()).

Синтаксис

dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset)

Параметры

indirectBuffer

GPUBuffer, содержащий значения X, Y и Z размеров сетки рабочих групп для отправки. Буфер должен содержать плотный блок из трёх 32-битных беззнаковых целых значений, представляющих размеры (12 байт в общей сложности), в том же порядке, что и аргументы для GPUComputePassEncoder.dispatchWorkgroups(). Например:

const uint32 = new Uint32Array(3);
uint32[0] = 25; // The X value
uint32[1] = 1; // The Y value
uint32[2] = 1; // The Z value

// Write values into a GPUBuffer
device.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);
indirectOffset

Смещение в байтах в indirectBuffer, где начинаются данные размеров.

Примечание: Значения размеров X, Y и Z, передаваемые в GPUComputePassEncoder.dispatchWorkgroups() и dispatchWorkgroupsIndirect(), представляют количество рабочих групп для отправки для каждого измерения, а не количество вызовов шейдера для выполнения в каждом измерении. Это соответствует поведению современных родных API графических процессоров, но отличается от поведения OpenCL. Это означает, что если GPUShaderModule определяет точку входа с @workgroup_size(4, 4), и работа отправляется в неё с вызовом dispatchWorkgroupsIndirect(indirectBuffer); с indirectBuffer, определяющим размеры X и Y как 8 и 8, точка входа будет вызвана 1024 раза в общей сложности — отправка 4x4 рабочей группы 8 раз по осям X и Y. 4 * 4 * 8 * 8 = 1024.

Возвращаемое значение

Ничего (Undefined).

Проверка

При вызове dispatchWorkgroupsIndirect() должны быть выполнены следующие условия, в противном случае генерируется GPUValidationError, и GPUComputePassEncoder становится недопустимым:

  • indirectBuffer содержит флаг GPUBufferUsage.INDIRECT.
  • indirectOffset плюс общий размер, задаваемый размерами X, Y и Z, меньше или равен размеру indirectBuffer.
  • indirectOffset кратно 4.

Примеры

// Set global buffer size
const BUFFER_SIZE = 1000;

// Compute shader; note workgroup size of 64
const 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 GPU
const commandEncoder = device.createCommandEncoder();

// Initiate render pass
const passEncoder = commandEncoder.beginComputePass();

// Issue commands
passEncoder.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 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-dispatchworkgroupsindirect

Совместимость с браузерами

Рабочие столы Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome Android Firefox для Android Opera Android Safari на iOS Samsung Internet WebView Android
dispatchWorkgroupsIndirect
113В настоящее время поддерживается только на ChromeOS, macOS и Windows.
113В настоящее время поддерживается только на ChromeOS, macOS и Windows.
превьюВ настоящее время поддерживается только на Linux и Windows.
99В настоящее время поддерживается только на ChromeOS, macOS и Windows.
превью 121 Нет 81 Нет 25.0 121

См. также

  • API WebGPU

© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/GPUComputePassEncoder/dispatchWorkgroupsIndirect

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API