OpenCL: clSetKernelArg против clSetKernelArg + clEnqueueWriteBuffer - PullRequest
0 голосов
/ 26 апреля 2018

Вопрос относительно переноса буфера в OpenCL: Я хочу передать буфер (cl_mem) от хоста к ядру (то есть к устройству). Есть две функции хоста:

  • clEnqueueWriteBuffer
  • clSetKernelArg

Я использую clSetKernelArg, чтобы передать свой буфер одному из аргументов ядра. Но значит ли это, что буфер автоматически переносится на устройство? Кроме того, есть функция clEnqueueWriteBuffer, которая записывает буфер на устройство.

Мой вопрос: есть ли разница в использовании (a.) Только clSetKernelArg или (b.) ClSetKernelArg и clEnqueueWriteBuffer в сочетании для моего варианта использования (передача буферов в ядро)?

1 Ответ

0 голосов
/ 26 апреля 2018

Вы должны вызвать обе функции, прежде чем ставить ядро ​​в очередь для выполнения.

clSetKernelArg

Используется для установки значения аргумента для конкретного аргумента ядра.

Этот параметр устанавливает только аргумент значение , например, некоторый указатель для вызываемого ядра. нет неявных передач данных .


Подумайте о следующих примерах:

  • один и тот же объект памяти используется в качестве аргумента для разных ядер
    • => требуется только одна запись на устройство; но для разных ядер нужно задать несколько аргументов
  • изменяющийся объект входной памяти может использоваться несколько раз с одним и тем же ядром
    • => одна запись на звонок; но аргумент ядра устанавливается только один раз
  • буфер чтения и записи может переключаться с помощью clSetKernelArg() между двумя вызовами одного и того же ядра (двойная буферизация)
    • => возможно, нет передачи или только каждые n итераций; но два аргумента перед каждым вызовом

В общем: Передача данных между хостом и вычислительным устройством очень дорогая, и поэтому ее следует избегать, что лучше всего сделать путем явного запуска.

...