Выполнение ядра OpenCL не начинается до тех пор, пока не будут вызваны clFinish или clWaitForEvents

Я пытаюсь запустить ядро ​​на GPU и выполнить дополнительные вычисления на хосте (CPU). Я вижу этот эффект:

только ядру требуется около 2000 мс:

clEnqueueNDRangeKernel …

clFinish (или clWaitForEvents, я пробовал оба)

Я моделировал дополнительные вычисления на CPU с помощью сна (10):

clEnqueueNDRangeKernel …

сна (10);

clFinish (или clWaitForEvents)

Теоретически ядро ​​должно работать на GPU, и после 10-секундного сна ядро ​​должно быть завершено. Но время измерения говорит, что все это нужно 12000 мс, а не 10000.

ClFinish или clWaitForEvents запускают ядро ​​для запуска или я что-то упустил?

Я использую AMD Fusion CPU / GPU и Linux.

Большое спасибо.

6

Решение

Попробуйте позвонить clFlush сразу после clEnqueueNDRangeKernel:

clFlush

Выполняет все ранее поставленные в очередь команды OpenCL в
очередь команд на устройство, связанное с очередью команд.

http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clFlush.html

6

Другие решения

clFinish () гарантирует, что ядро ​​было завершено только тогда, когда программа выполняет эту функцию, но когда ядро ​​будет запущено, не уверен. clFlush () может гарантировать, что ядро ​​было запущено на устройстве, в то время как программа переходит к предложению clFlush (), но когда оно будет закончено, не уверен, поэтому вам нужно clFlush (), чтобы убедиться, что ядро ​​было запущено на устройстве, затем время (2000 мс) может перекрываться временем ожидания (10000 мс) на стороне хоста. Надеюсь, это может быть полезно.

2

По вопросам рекламы [email protected]