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

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

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

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

Спасибо!


person Ken_g6    schedule 23.08.2010    source источник


Ответы (1)


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

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

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

person Dr. Snoopy    schedule 23.08.2010
comment
Единственное место, куда я не догадался заглянуть. Спасибо! - person Ken_g6; 24.08.2010
comment
Я собираюсь изменить свое заявление, чтобы оно было в основном принято. Кажется правдой, что количество ядер, поставленных в очередь по порядку, вычисляется по порядку. Однако операции чтения и записи буфера выполняются не по порядку, если только я не использую события и ожидания, возможно, даже если чтение/запись указаны как синхронные. См. также пример atiopencl в BOINC (boinc.berkeley.edu) в качестве рабочего примера. - person Ken_g6; 28.08.2010
comment
CL работает иначе, см. раздел 5.1 спецификации OpenCL о создании очередей команд. Если вы видите другое поведение, это ошибка реализации (ошибка). - person Dr. Snoopy; 29.08.2010