7

我正在尝试在 GPU 上运行内核并在主机(CPU)上进行额外的计算。我看到了这个效果:

只有内核需要大约 2000 毫秒:

clEnqueueNDRangeKernel ...

clFinish(或 clWaitForEvents,我都试过了)

我用 sleep(10) 在 CPU 上模拟了额外的计算:

clEnqueueNDRangeKernel ...

睡眠(10);

clFinish(或 clWaitForEvents)

理论上内核应该在 GPU 上运行,并且在 10 秒睡眠后内核应该完成。但是时间测量表明这一切都需要 12000 毫秒而不是 10000 毫秒。

clFinish 或 clWaitForEvents 是调用内核启动还是我错过了什么?

我正在使用 AMD Fusion CPU/GPU 和 Linux。

非常感谢。

4

2 回答 2

6

尝试clFlush在以下情况下立即调用clEnqueueNDRangeKernel

刷新

将命令队列中所有先前排队的 OpenCL 命令发布到与命令队列关联的设备。

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

于 2012-09-20T11:05:24.087 回答
2

clFinish() 只保证当程序继续执行这个函数时内核已经完成,但内核何时开始执行则不确定。clFlush() 可以保证内核已经在设备上启动,而程序继续执行 clFlush() 语句,但是什么时候结束还不确定,所以需要 clFlush() 来保证内核已经在设备上启动,然后时间(2000ms)可以与主机端的睡眠时间(10000ms)重叠。希望它会有所帮助。

于 2012-09-21T07:21:17.280 回答