使用CUDA优化方法来优化OpenCL

3

我越了解OpenCL,就越觉得内核的正确优化是成功的关键。此外,我注意到两种语言的内核非常相似。

那么,从OpenCL内核的书籍和教程中学习Cuda优化策略会有多明智呢?考虑到Cuda比OpenCL有更多(好的)文献。

你对此有什么看法?你有什么经验?

谢谢!


1
你在哪个设备上运行OpenCL?是(NVIDIA)GPU吗?很可能CUDA的“最佳实践”同样适用于OpenCL。 - Bart
2个回答

4
如果您只使用nvidia卡,那么在CUDA和OpenCL中都可以使用相同的优化方法。但需要注意的是,与CUDA相比,在nvidia卡上启动OpenCL可能需要更长的时间(这是我之前尝试它们时的情况)。
然而,如果您要使用不同的架构,您需要找到一种将OpenCL程序泛化为多个平台最优的方法,而这在CUDA中是不可能的。
但是,一些基本的优化方法仍然适用。例如,在任何平台上,以下内容都是正确的:
1. 从对齐的内存地址读取和写入将具有更高的性能(在某些平台上甚至是必需的,如Cell处理器)。 2. 知道和理解每个平台的有限资源(无论是常量内存、共享内存、本地内存还是缓存)。 3. 理解并行编程,例如找出性能增益(启动更多线程)和开销成本(启动、通信和同步)之间的权衡。
最后一部分在所有类型的并行编程中都很有用(包括多核、众核或网格计算)。

3

虽然我在OpenCL方面还很新(并且几乎没有看过CUDA),但开发者层面的优化可以总结为使代码结构与硬件(和编译器)首选的操作方式相匹配。

在GPU上,这可以是任何事情,从正确排序数据以利用缓存一致性(GPU喜欢使用缓存数据,从顶部到各个核心 [有几个级别的缓存]) 到利用内置操作,如向量和矩阵操作。最近,我不得不在OpenCL中实现FDTD,发现通过将流行实现中的扩展点/叉积替换为矩阵操作(GPU喜欢!),重新排序循环,使X维度(其元素按顺序存储)在内部循环中处理而不是外部循环,避免分支(GPU讨厌),等等,我能够将速度提高约20%。这些优化应该适用于CUDA、OpenCL甚至GPU汇编语言,并且我希望所有最有效的GPU优化都是如此。

当然,大多数都是应用程序相关的,因此可能属于TIAS(尝试并查看)类别。

这里有几个看起来很有前途的链接:

NVIDIA - OpenCL编程最佳实践

AMD - 将CUDA移植到OpenCL

我的研究(甚至包括NVIDIA的文档)指出CUDA和OpenCL之间有近乎一对一的对应关系,因此如果优化在它们之间不能很好地转换,我会非常惊讶。我读过的大部分内容都集中在缓存一致性、避免分支等方面。

此外,请注意,在OpenCL的情况下,实际的编译过程由供应商处理(我认为它发生在视频驱动程序中),因此查看供应商(NVIDIA、ATI、Intel(?)等)的驱动程序文档和OpenCL工具包可能是值得的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接