【发布时间】:2012-09-21 15:21:17
【问题描述】:
我正在尝试在 GPU 上运行内核并在主机 (CPU) 上进行额外的计算。我看到了这个效果:
只有内核需要大约 2000 毫秒:
clEnqueueNDRangeKernel ...
clFinish(或 clWaitForEvents,我都试过了)
我用 sleep(10) 在 CPU 上模拟了额外的计算:
clEnqueueNDRangeKernel ...
睡眠(10);
clFinish(或 clWaitForEvents)
理论上内核应该在 GPU 上运行,并且在 10 秒睡眠后内核应该完成。但是时间测量表明这一切都需要 12000 毫秒而不是 10000 毫秒。
clFinish 或 clWaitForEvents 是调用内核启动还是我错过了什么?
我正在使用 AMD Fusion CPU/GPU 和 Linux。
非常感谢。
【问题讨论】:
-
您的数据有多大? 2000 毫秒是否可能代表将数据从 GPU 传输到 CPU 所需的时间?
-
数据小于 1 MB。但它不应该在我的测量范围内。我将数据复制到设备,开始测量,执行内核+睡眠+clFinish,停止测量,将数据复制回主机
-
您测量的准确度如何?您是否将数据同步复制到设备?
-
是的,我使用 clEnqueueWriteBuffer(command_queue, Ddata, CL_TRUE, ...) 复制数据,并在命令队列中使用默认值。对于时间测量,我使用 gettimeofday()。