OpenCL 编程范式有望成为异构计算的免版税开放标准。我们应该花时间开发基于 OpenCL 的软件吗?优点缺点?
OpenCL 的未来?
OpenCL 与什么?
如果问题是 OpenCL 与 CUDA,我看到很多人对这个问题感到不安,这对我来说似乎很疯狂。没关系。诚实的。内核——所有艰苦思考的地方——在两种语言之间实际上是相同的。您可以为您最喜欢的编辑器编写宏来完成 99% 的工作,以便在 OpenCL 和 CUDA 之间切换。必须是这样;它们是对最终非常相似的硬件的低级控制。一旦你弄清楚如何在 {OpenCL,CUDA} 中编写重要的内核,将它们移植到 {CUDA,OpenCL} 就很简单了。
您必须编写的样板主机代码也类似,但 CUDA 使简单案例保持简单。这就是我们在中心教授 CUDA 的原因;您可以直接开始编写内核代码,而我们必须花费 1-2 个小时的一整天课程来解释 OpenCL 的内核启动内容。
但即使存在差异也不是那么重要。一旦你开始做更复杂的事情(多个 GPU 上的异步内核),它们都同样复杂,而且你几乎可以从一个到另一个进行逐行转换。
如果是 OpenCL 与基于指令的方法——OpenACC或HMPP 之类的——这些可能(希望?)将来会成为编程这类架构的好方法,你可以获得 90% 的性能10%的工作。但是哪种选择会“获胜”还有待观察,我不建议您花很多时间与这些人一起工作。
所以我想说,在 CUDA 或 OpenCL 之间选择一种对你来说方便的语言并使用它,不要太担心它。有价值的部分 - 弄清楚如何将您的问题分解为具有非常少内存的小内核的大规模并行 SIMD 代码 - 将很容易在编程模型之间移植。
如果你使用的是 NVIDIA 硬件——你可能是——那么我通常推荐 CUDA——Matt Knepley 关于库的观点是完全正确的。如果你不是,那么 OpenCL。
您是否应该花时间开发基于OpenCL的软件是一个只有您才能回答的问题。如果它看起来有可能解决你现在面临的问题,而其他开放的解决方案都没有,那么你最好的做法可能是冒险用它来实施一个小项目。
如果一切顺利,您可以在更大的项目中尝试它等等,直到您建立足够的信心来标准化它,或者放弃它以支持其他解决方案(可能是您自己的专有解决方案,另一个开放解决方案,甚至另一种专有解决方案)。
开源运动的美妙之处在于,因为您拥有源代码,所以您拥有在必要时分叉项目所需的一切。即使社区本身没有为您提供所需的设施,也没有什么能阻止您自己实施这些设施。此外,如果您想要这些设施,则其他用户很可能想要它们,因此如果您将这些更改贡献回核心项目,我们将不胜感激。
不仅如此,如果你从自己的角度让它变得更好,它可能会让其他人变得更好,鼓励他们提交自己的改进,最终让软件对每个人都更好。
最后,是的,这是一个相当通用的问题的通用答案。为了更全面地回答,我们需要知道您对 OpenCL 的担忧是什么。是成熟吗?社区支持?便于使用?需要时间学习吗?开发时间?改变你的程序?当您询问优缺点时,您还试图将 OpenCL 与哪些其他产品进行比较?你已经做了哪些研究?您需要哪些功能来支持您的异构计算环境?
一大优点是 OpenCL 背后的供应商数量。我有一些关于这方面的轶事经验,曾遇到一个研究小组,该小组花费大量时间和精力为 NVIDIA 驱动的系统开发相当复杂的 CUDA 代码。代码开发一年后,研究小组获得了更大更快的基于 AMD 的系统,但他们无法使用它,因为他们没有(人力)资源来移植代码。
即使 CUDA 和 OpenCL 的核心功能集几乎相同(正如 @JonathanDursi 指出的那样),如果原始开发人员不是负责转换代码的任务,那么整个移植项目可能会非常耗时。
但是,CUDA 和 OpenCL 之间存在一些官方不兼容的问题。最引人注目的是 CUDA 支持 c++ 模板,而 OpenCL 尚未正式支持它们。但是,AMD 努力开发 OpenCL 扩展,支持模板和其他 C++ 功能,更多信息请参见 AMD 开发中心的这篇文章。我希望 OpenCL 的未来修订版可能会添加这项工作。
在这个时间点(2012 年初),@MattKnepley 链接到的很棒的库是封闭源代码或使用模板,因此它们不会在 NVIDIA 以外的硬件上可用,至少目前是这样。
对于正在学习 gpu 计算的人来说,我会说 OpenCL C 可能相当困难,因为有很多细节会分散学习者对基本思想的注意力,而 CUDA 更简单直接。但是,有一些工具可以让 OpenCL 更易于学习和使用,例如 PyOpenCL(opencl 的 python 包装器),它将所有的 python 糖带到 OpenCL(请注意,还有一个 PyCUDA)。例如,添加两个数组的 PyOpenCL 演示不到 25 行,它包括:在主机和设备上创建数组、数据传输、创建上下文和队列、内核、如何构建和执行内核,从 GPU 获取结果并将它们与 numpy 进行比较(参见下面的链接)。
PyOpenCL—— http ://mathema.tician.de/software/pyopencl
PyCUDA—— http ://mathema.tician.de/software/pycuda
对于经验丰富的 gpu 程序员,我同意@JonathanDursi 的观点,CUDA 和 OpenCL 基本相同,实际上没有任何区别。此外,为 GPU 开发高效算法的艰苦工作在很大程度上与语言无关,供应商和文档的 OpenCL 支持现在比两年前要成熟得多。唯一不同的是,NVIDIA 在他们对 CUDA 社区的支持下确实做了一些很棒的工作。
OpenCL 的另一个好处是它可以在 CPU 上运行,并且已经得到 Intel 和 AMD 的支持。因此,如果您想利用任何可用的 CPU 内核,则无需更改算法框架。我不认为 OpenCL 是面向单 CPU/多核应用程序的最佳解决方案,因为 CPU 优化内核可能看起来与 GPU 优化内核有很大不同。但是,根据我的经验,代码开发确实受益于能够在 CPU 上运行。