OpenCL编程范例有望成为异构计算的免版税开放标准。我们应该花时间在基于OpenCL的软件开发上吗?优点缺点?
OpenCL编程范例有望成为异构计算的免版税开放标准。我们应该花时间在基于OpenCL的软件开发上吗?优点缺点?
Answers:
这个问题过于广泛和模糊,无法真正得到回答。但是,从科学计算的角度来看,我确实看到了反对OpenCL的一个值得注意的观点,这一点很少被强调。到目前为止,还没有为OpenCL制作开源基础结构库的努力,而CUDA有几个出色的选择:
我相信这确实会对OpenCL造成伤害,因为采用的主要促进因素是高质量,开放的库。
OpenCL与什么?
如果问题是OpenCL与CUDA,我会在这个问题上费尽心思,对我来说似乎很疯狂。没关系 诚实。两种语言之间的内核(所有艰苦思考都必须经过)实际上是相同的。您可以为自己喜欢的编辑器编写宏,以完成在OpenCL和CUDA之间反弹的99%的工作。一定是那样的。它们是对最终非常相似的硬件的低级控制。一旦找到了如何在{OpenCL,CUDA}中编写重要内核的方法,将它们移植到{CUDA,OpenCL}就很简单了。
您必须编写的样板宿主代码也类似,但是CUDA使简单情况变得简单。这就是为什么我们在我们的中心教CUDA。您可以直接进入编写内核代码的过程,而我们将需要花1-2小时的全日制课程来解释OpenCL的内核启动内容。
但是即使在那里,差异也不是那么重要。一旦您开始做更复杂的事情(多个GPU上的异步内核),它们同样同样复杂,并且您几乎可以进行逐行转换。
如果是的OpenCL VS基于指令的办法- 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支持现在比2年前成熟得多。唯一仍然有所不同的一点是,NVIDIA在CUDA社区的支持下确实做得很好。
OpenCL的附加优点是它可以在CPU上运行,并且已经被Intel和AMD支持。因此,如果您想利用任何可用的CPU内核,则无需更改算法框架。我不认为OpenCL是面向单个CPU /多核应用程序的最佳解决方案,因为CPU优化的内核看起来可能与GPU优化的内核大不相同。但是,以我的经验,CODE开发确实可以在CPU上运行而受益。
我认为OpenCL当前缺少“冠军”。例如,如果您现在(2011年12月16日)访问NVIDIA网站,则初始页面上有几张“肯恩·伯恩斯效应”(Ken Burns Effect)风格的照片,着重于GPU计算的科学/工业方面,以及〜1 /导航选项的第4点将您带到可能会在CUDA中结束的事物。出售“ GPU计算”服务器和工作站的制造商正在出售NVIDIA解决方案。
ATI提供的竞争产品与AMD的一般站点混合在一起,很难找到,并且在第三方解决方案中功能不那么强大。这些解决方案以及进行基于OpenCL的编程的能力确实存在,但是至少在我看来,但在我与之交谈的其他一些人的心中,它却留下了这样的印象:OpenCL平台的大型企业赞助商已经“退出该领域”。例如,使用OS X的人可能都太忙于猜测Apple工作站是否会在一年后出现,以至于对他们推动OpenCL GPU计算没有信心。
最重要的因素是CUDA将仅受NVIDIA硬件支持。
因此,如果您要制作功能强大且可移植的软件,则OpenCL是唯一的选择。最多,您可以围绕一些当前由CUDA驱动的库构建,并希望它们能在将来通过OpenCL扩展您的代码。