Требуется ли clWaitForEvents для очереди в порядке? - PullRequest
0 голосов
/ 30 мая 2018

Я создал очередную очередь OpenCL.Мой конвейер помещает в очередь несколько ядер.

    queue = clCreateCommandQueue(cl.context, cl.device, 0, &cl.error);

    for(i=0 ;i < num_kernels; i++){
        clEnqueueNDRangeKernel(queue, kernels[i], dims, NULL, global_work_group_size, local_work_group_size, 0, NULL, &event);
    }

Вывод ядер [0] является вводом для ядер [1].Вывод ядер [1] является вводом для ядер [2] и т. Д.

Поскольку моя очередь команд является очередью в порядке, я предполагаю, что ядра [1] будут запускаться только после того, как ядра [0] будутзавершено.

  1. Допустимо ли мое предположение?
  2. Должен ли я использовать clWaitForEvents, чтобы убедиться, что предыдущее ядро ​​завершено, прежде чем ставить в очередь следующее ядро?
  3. Можно ли как-нибудь сложить несколько ядер в очередь и просто передать вводkernels [0] и напрямую получать вывод из последнего ядра?(без необходимости ставить в очередь каждое ядро ​​одно за другим)

1 Ответ

0 голосов
/ 30 мая 2018

Ваше предположение верно.Вам не нужно ждать событий в очереди в порядке.Посмотрите на документ OpenCL:

https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clCreateCommandQueue.html

Если свойство CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE очереди команд не установлено, команды, поставленные в очередь команд, выполняются в порядке,Например, если приложение вызывает clEnqueueNDRangeKernel для выполнения ядра A, а затем clEnqueueNDRangeKernel для выполнения ядра B, приложение может предположить, что сначала завершается ядро ​​A, а затем выполняется ядро ​​B.Если объекты памяти, выводимые ядром A, являются входными данными для ядра B, тогда ядро ​​B увидит правильные данные в объектах памяти, созданных в результате выполнения ядра A. Если установлено свойство CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE очереди команд, то нет гарантии, что ядро ​​A будетзакончите до того, как ядро ​​B. начнет выполнение.

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

Конечно, вы всегда можете написать своих собственных помощников на C / C ++ (или на любом другом языке, который вы используете), которые упрощают это и потенциально скрывают громоздкостьвызовы ядра.Или используйте библиотеку абстракций GPGPU, чтобы сделать то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...