未初始化缓冲区时内核执行时间会下降

时间:2016-09-21 12:46:55

标签: performance opencl intel

在测量OpenCL内核的执行时间时,我遇到了奇怪的行为。内核需要三个缓冲区作为输入。我在主机代码中创建了这些缓冲区,并使用CL_MEM_COPY_HOST_PTR对它们进行初始化。然后我通过OpenCL事件测量内核执行时间。但是,当我省略CL_MEM_COPY_HOST_PTR时,内核执行时间会减少到三分之一。

到目前为止,我发现这个问题与OpenCL编译器所做的优化有关。看起来编译器注意到缓冲区没有被初始化并相应地优化内核。如果我提供标志" -cl-opt-disable"初始化和不初始化缓冲区之间的执行时间没有差别。但禁用所有优化显然不是我打算做的。

有没有办法阻止编译器在没有禁用所有优化的情况下注意到缓冲区尚未初始化?不幸的是,只写一个字节进入缓冲区并没有做到这一点。

提前致谢!

1 个答案:

答案 0 :(得分:1)

CL_MEM_COPY_HOST_PTR强制CL驱动程序将内存副本执行到设备。因此,在复制操作完成之前,将阻止依赖于用于读取的数据的任何进一步的内核执行。

内核执行时间(由CL分析报告)在两种情况下肯定都是相同的。但是,如果您只是从CPU端进行测量(请不要这样做!),即使内核没有真正运行,您也会看到执行时间增加,但等待复制操作。

通过禁用优化,内核时间可能比复制产生更大的影响,因此会在测量中影响它。

注意:您可以尝试更多其他事项。

  • 将内核设置为" write_only"或者你的CL缓冲区为" WRITE_ONLY",即使缓冲区没有准备就应该使内核立即运行。
  • 创建缓冲区后设置sleep()
  • 运行内核2次并测量第二次。