我越了解OpenCL,就越觉得内核的正确优化是成功的关键。此外,我注意到两种语言的内核非常相似。
那么,从OpenCL内核的书籍和教程中学习Cuda优化策略会有多明智呢?考虑到Cuda比OpenCL有更多(好的)文献。
你对此有什么看法?你有什么经验?
谢谢!
我越了解OpenCL,就越觉得内核的正确优化是成功的关键。此外,我注意到两种语言的内核非常相似。
那么,从OpenCL内核的书籍和教程中学习Cuda优化策略会有多明智呢?考虑到Cuda比OpenCL有更多(好的)文献。
你对此有什么看法?你有什么经验?
谢谢!
虽然我在OpenCL方面还很新(并且几乎没有看过CUDA),但开发者层面的优化可以总结为使代码结构与硬件(和编译器)首选的操作方式相匹配。
在GPU上,这可以是任何事情,从正确排序数据以利用缓存一致性(GPU喜欢使用缓存数据,从顶部到各个核心 [有几个级别的缓存]) 到利用内置操作,如向量和矩阵操作。最近,我不得不在OpenCL中实现FDTD,发现通过将流行实现中的扩展点/叉积替换为矩阵操作(GPU喜欢!),重新排序循环,使X维度(其元素按顺序存储)在内部循环中处理而不是外部循环,避免分支(GPU讨厌),等等,我能够将速度提高约20%。这些优化应该适用于CUDA、OpenCL甚至GPU汇编语言,并且我希望所有最有效的GPU优化都是如此。
当然,大多数都是应用程序相关的,因此可能属于TIAS(尝试并查看)类别。
这里有几个看起来很有前途的链接:
我的研究(甚至包括NVIDIA的文档)指出CUDA和OpenCL之间有近乎一对一的对应关系,因此如果优化在它们之间不能很好地转换,我会非常惊讶。我读过的大部分内容都集中在缓存一致性、避免分支等方面。
此外,请注意,在OpenCL的情况下,实际的编译过程由供应商处理(我认为它发生在视频驱动程序中),因此查看供应商(NVIDIA、ATI、Intel(?)等)的驱动程序文档和OpenCL工具包可能是值得的。