2016-09-21 45 views
0

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

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

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

在此先感谢!

+0

您使用的是clenqueuewrite还是clenqueuemap?也许你正在做这些额外的副本? –

+0

所以你试图微调一些东西,并希望编译器不要以不同的方式优化内核?那么您可以测试它,而不会将内存从主机复制到GPU的潜在瓶颈?你确定那不是已经发生了什么?也许它更快,因为内存只是保持在GPU上缓存? (这可能没有意义,我不了解OpenCL,主要是优化和硬件的工作原理)。 –

回答

1

CL_MEM_COPY_HOST_PTR强制CL驱动程序将您的内存复制到设备。因此,任何进一步的内核执行取决于读取数据将被阻止,直到复制操作完成。

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

通过禁用优化,内核时间可能比副本有更大的影响,因此将其映射到测量中。

注:您可能尝试更多的东西。

  • 设置你的内核,以“WRITE_ONLY”或您的CL缓冲区“WRITE_ONLY”,即应使内核运行瞬间即使缓冲区没有准备好。
  • 缓冲区创建后进入sleep()
  • 运行内核2次并测量第二个。
相关问题