为什么OpenCL中不同的内核执行模式之间存在如此巨大的性能差异?

时间:2015-08-10 08:39:58

标签: performance caching opencl gpu gpgpu

我的实现执行3个OpenCL内核:

KernelA(),KernelB()和KernelC()

它们都在相同的数据上运行,内核C依赖于A和B生成的数据。

对于评估,我首先执行A和B,然后在相同的输入数据上多次执行内核C.

我注意到了什么: 当我反复执行C时,它非常快。 它在同一数据上快3倍。 (15ms vs 45 ms)

这很有趣,因为我无法解释这种行为。 没有RAM-GPU内存传输或任何东西。 仅使用全局,常量和私有内存。 数据非常大:全球工作组规模为640x480,本地工作组规模为32x2(蛮力评估的最佳结果)。

我的GPU是Nvidia Quadro NVS 4200和Qualcom Adreno 430。

由于数据缓存,我无法解释这一点,因为在不同的数据上执行了大量的工作组。我还在每次计算后执行cl_flush()。 那为什么会有这么大的性能差异呢?

1 个答案:

答案 0 :(得分:0)

clFlush()强制命令进入GPU,但不要等到它们完成。 在运行内核C之前,应该调用clFinish(),以确保所有命令都已完成。

否则,内核C正在等待GPU完成内核A和B的执行。