【问题标题】:OpenCL kernel execution does not start until clFinish or clWaitForEvents is called在调用 clFinish 或 clWaitForEvents 之前,OpenCL 内核执行不会开始
【发布时间】: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()。

标签: c++ opencl


【解决方案1】:

尝试在clEnqueueNDRangeKernel 之后立即调用clFlush

clFlush

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-16
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多