События OpenCL и очереди команд
Я работаю над переводом приложения CUDA ( это, если вы должны знать) в OpenCL. Оригинальное приложение использует C-style CUDA API, с одним потоком только для того, чтобы избежать автоматического ожидания занятости при чтении результатов.
Теперь я замечаю, что очереди команд OpenCL очень похожи на потоки CUDA. Но вкоманде чтения устройства , а также в командах записи и выполнения ядра я также замечаю параметры для событий. Поэтому мне интересно, что нужно сделать, чтобы ... выполнить запись устройства, количество ядер (например, один вызов одного ядра, затем 100 вызовов другого ядра) и чтение устройства, все последовательно?
- Если я просто помещу их последовательно в одну и ту же очередь, будут ли они выполняться последовательно, как в CUDA?
- Если это не сработает, могу ли я / должен ли я использовать Дейзи-цепочку событий, делая список ожидания каждого вызова событием предыдущего вызова?
- или я должен добавить все предыдущие события в список ожидания каждого вызова, например, если есть поиск N^2 для зависимостей, что ли?
- или мне просто нужно событие.wait() для каждого вызова в отдельности, как сказано в учебнике AMD?
Спасибо!
1 ответ:
Это зависит от способа создания очереди команд. в clCreateCommandQueue есть параметр properties, который может содержать CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, что позволяет не последовательное выполнение в очереди команд.
Если это свойство задано, команды могут выполняться не по порядку или параллельно, и единственный способ синхронизировать их-использовать события.
Если это свойство не задано, команды выполняются последовательно в очереди.