【问题标题】:Using Cuda optimization approaches for OpenCL为 OpenCL 使用 Cuda 优化方法
【发布时间】:2011-08-21 19:06:18
【问题描述】:

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

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

您对此有何看法?你的经验是什么?

谢谢!

【问题讨论】:

  • 您在什么设备上运行 OpenCL? (英伟达)GPU?很可能 CUDA 的“最佳实践”也将转化为 OpenCL。

标签: optimization cuda opencl


【解决方案1】:

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

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

当然,其中大部分是依赖于应用程序的,因此它可能属于 TIAS(试一试)类别。

以下是一些我发现看起来很有希望的链接:

NVIDIA - Best Practices for OpenCL Programming

AMD - Porting CUDA to OpenCL

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

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

【讨论】:

    【解决方案2】:

    如果您只使用 nvidia 卡,您可以在 CUDA 和 OpenCL 中使用相同的优化方法。不过要记住的几件事是,与 nvidia 卡上的 CUDA 相比,OpenCL 的启动时间可能更长(这是不久前我在试验这两种方法的时候)。

    但是,如果您要使用不同的架构,则需要找到一种方法来泛化您的 OpenCL 程序,使其在多个平台上达到最佳状态,而 CUDA 则无法做到这一点。

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

    1. 读取和写入内存 对齐的地址将具有 更高的性能(有时 在像 Cell 这样的平台上是必需的 处理器)。
    2. 了解和理解有限的资源 每个平台的。 (可以叫 常量内存,共享内存, 本地内存或缓存)。
    3. 了解并行编程。 例如,弄清楚交易 在性能增益之间关闭 (启动更多线程)和 间接费用(启动, 通信和同步)。

    最后一部分在各种并行编程(多核、多核或网格计算)中都很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 2016-01-17
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2011-01-26
      • 2015-03-21
      相关资源
      最近更新 更多