我正在使用CUDA 6.0以及与CUDA SDK捆绑在一起的OpenCL实现.我为每个平台都有两个相同的内核(它们在特定于平台的关键字中有所不同).它们只读写全局内存,每个线程的位置不同.CUDA的启动配置是200 blocks of 250 threads (1D)直接对应于OpenCL的配置50,000 global work size and 250 local work size.
OpenCL代码运行得更快.这有可能还是我错了?我的理解是NVIDIA的OpenCL实现基于CUDA的实现.使用OpenCL,我的性能提升了大约15%.
如果你可以建议我为什么会看到这个以及NVIDIA实现的CUDA和OpenCL之间的某些差异,那将会很棒?
She*_*ama 21
在现代GPU上执行的内核几乎从不受计算限制,并且几乎总是受内存带宽限制.(因为与可用的内存路径相比,运行的计算核心数量如此之多.)
这意味着给定内核的性能通常很大程度上取决于给定算法所展示的内存访问模式.
在实践中,这使得很难预测(或甚至理解)提前预期的性能.
您观察到的差异可能是由于OpenCL与CUDA工具链进行的不同优化导致两个内核之间的内存访问模式存在细微差别.
要了解如何优化GPU内核,您需要了解可用的内存缓存硬件的详细信息,以及如何最有效地使用它.(例如,战略性地使用"本地"内存缓存而不是直接转向OpenCL中的"全局"内存.)