【发布时间】:2015-11-02 02:32:41
【问题描述】:
我的实现执行 3 个 OpenCL 内核:
KernelA()、KernelB() 和 KernelC()
它们都对相同的数据进行操作,内核 C 依赖于由 A 和 B 生成的数据。
对于评估,我先执行 A 和 B,然后对相同的输入数据执行 Kernel C 多次。
我注意到: 当我重复执行 C 时,它非常快。 在相同的数据上,它的速度快了 3 倍。 (15 毫秒对 45 毫秒)
这很有趣,因为我无法解释这种行为。 没有 RAM-GPU 内存传输或任何东西。 仅使用全局、常量和私有内存。 数据非常大:全局工作组大小为 640x480,本地工作组大小为 32x2(暴力评估的最佳结果)。
我的 GPU 是 Nvidia Quadro NVS 4200 和 Qualcom Adreno 430。
由于数据缓存,我无法解释这一点,因为有大量工作组在不同的数据上执行。我也在每次计算后执行 cl_flush() 。 那么为什么会有如此巨大的性能差异呢?
【问题讨论】:
-
I can't explain this because of data caching为什么不呢?如果你重复执行 C,你显然会比 A->B->C 更少的缓存未命中。请澄清你的问题。此外,32x2 的工作组大小在桌面 GPU 上可能不是最理想的。 -
工作组大小是性能最好的一个,通过暴力破解所有可能的配置来确定。我排除了内存缓存,因为工作组每次计算都会使用不同的数据执行数千次。
标签: performance caching opencl gpu gpgpu