我的实现执行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()。 那为什么会有这么大的性能差异呢?
答案 0 :(得分:0)
clFlush()
强制命令进入GPU,但不要等到它们完成。
在运行内核C之前,应该调用clFinish()
,以确保所有命令都已完成。
否则,内核C正在等待GPU完成内核A和B的执行。