События OpenCL и очереди команд


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

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

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

Спасибо!

1 5

1 ответ:

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

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

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