Я пытаюсь запустить ядро на GPU и выполнить дополнительные вычисления на хосте (CPU). Я вижу этот эффект:
только ядру требуется около 2000 мс:
clEnqueueNDRangeKernel …
clFinish (или clWaitForEvents, я пробовал оба)
Я моделировал дополнительные вычисления на CPU с помощью сна (10):
clEnqueueNDRangeKernel …
сна (10);
clFinish (или clWaitForEvents)
Теоретически ядро должно работать на GPU, и после 10-секундного сна ядро должно быть завершено. Но время измерения говорит, что все это нужно 12000 мс, а не 10000.
ClFinish или clWaitForEvents запускают ядро для запуска или я что-то упустил?
Я использую AMD Fusion CPU / GPU и Linux.
Большое спасибо.
Попробуйте позвонить clFlush
сразу после clEnqueueNDRangeKernel
:
clFlush
Выполняет все ранее поставленные в очередь команды OpenCL в
очередь команд на устройство, связанное с очередью команд.
http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clFlush.html
clFinish () гарантирует, что ядро было завершено только тогда, когда программа выполняет эту функцию, но когда ядро будет запущено, не уверен. clFlush () может гарантировать, что ядро было запущено на устройстве, в то время как программа переходит к предложению clFlush (), но когда оно будет закончено, не уверен, поэтому вам нужно clFlush (), чтобы убедиться, что ядро было запущено на устройстве, затем время (2000 мс) может перекрываться временем ожидания (10000 мс) на стороне хоста. Надеюсь, это может быть полезно.