События OpenCL и очереди команд - PullRequest
5 голосов
/ 24 августа 2010

Я работаю над переводом приложения CUDA (, если вы должны знать ) в OpenCL. Исходное приложение использует CUDA API в стиле C с одним потоком, чтобы избежать автоматического ожидания занятости при чтении результатов.

Теперь я заметил, что очереди команд OpenCL очень похожи на потоки CUDA. Но в команда чтения устройства , а также в командах write и kernel execute также отмечают параметры для событий. Поэтому мне интересно, что нужно для выполнения записи устройства, ряда ядер (например, один вызов одного ядра, затем 100 вызовов другого ядра) и чтения устройства, все последовательно?

  1. Если я просто последовательно поставлю их в одну и ту же очередь, будут ли они выполняться последовательно, как в CUDA?
  2. Если это не сработает, могу ли / должен ли я последовательно соединять события, делая список ожидания каждого звонка событием предыдущего звонка?
  3. Или я должен добавить все предыдущие события в список ожидания каждого вызова, например, если в N ^ 2 выполняется поиск зависимостей или что-то еще?
  4. Или мне нужно просто вызывать event.wait () для каждого звонка индивидуально, как сказано в учебнике AMD ?

Спасибо!

1 Ответ

5 голосов
/ 24 августа 2010

Это зависит от того, как вы создаете очередь команд.в clCreateCommandQueue есть параметр свойств, который может содержать CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, который разрешает непоследовательное выполнение в очереди команд.

Если это свойство установлено, команды могут выполняться не по порядку или параллельно, и единственный способ синхронизацииони используют события.

Если это свойство не задано, команды последовательно выполняются в очереди.

...