Optimization 在OpenCL中使用Cuda优化方法

Optimization 在OpenCL中使用Cuda优化方法,optimization,cuda,opencl,Optimization,Cuda,Opencl,我对OpenCL了解得越多,就越觉得内核的正确优化是成功的关键。此外,我注意到,这两种语言的内核似乎非常相似 那么,使用从OpenCL内核书籍和教程中学到的Cuda优化策略有多明智呢。。。考虑到Cuda比OpenCL有更多(好的)文献 你对此有什么看法?你有什么经验 谢谢 虽然我还是OpenCL新手(几乎没有看过CUDA),但开发人员级别的优化可以概括为对代码进行结构化,使其与硬件(和编译器)的首选方式相匹配 在GPU上,这可以是从正确排序数据以利用缓存一致性(GPU喜欢处理缓存数据,从上到下到

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

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

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


谢谢

虽然我还是OpenCL新手(几乎没有看过CUDA),但开发人员级别的优化可以概括为对代码进行结构化,使其与硬件(和编译器)的首选方式相匹配

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

当然,这大部分都是依赖于应用程序的,因此它可能属于TIA(试用并查看)类别

以下是我发现的一些有希望的链接:

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


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

如果您只使用NVIDIA卡,您可以在CUDA和OpenCL中使用相同的优化方法。不过,需要记住的是,与nvidia卡上的CUDA相比,OpenCL的启动时间可能要长一些(这是我不久前尝试这两种产品时的情况)

但是,如果您要使用不同的体系结构,则需要找出一种方法,将OpenCL程序推广到跨多个平台的最佳状态,这在CUDA中是不可能的

但一些基本的优化方法将保持不变。 例如,在任何平台上,以下内容都是正确的

  • 读写记忆 对齐的地址将具有 更高的性能(有时 在Cell这样的平台上是必要的 处理器)
  • 了解和理解有限的资源 每个平台的。(可以称之为 恒定内存,共享内存, 本地内存或缓存)
  • 理解并行编程。 例如,计算贸易 在性能提升之间进行切换 (启动更多线程)和 间接费用(启动, 通信和同步)

  • 最后一部分在所有类型的并行编程(多核、多核或网格计算)中都很有用。

    在什么设备上运行OpenCL?A(NVIDIA)GPU?CUDA的“最佳实践”很可能也会转化为OpenCL。