2011-10-24 82 views
2

我可以看到很多关于OpenCL的内容,它似乎是最有希望的(唯一一个?)多架构库。 OpenCL应该是第一个并行架构编程标准,并且最终将被大部分程序员采用。这很好,但是,从本地编程库迁移到OpenCL会导致性能下降吗?在nVidia GeForces的情况下,我已经发现一篇文章是同一个程序的两个实现 - CUDA与OpenCL代码 - 进行了比较,第一个似乎更高性能。在Pthread或Windows线程的情况下,我真的不知道,但我认为“通用性”和多架构方法总是会有“付出”的东西。 只是为了停止对这个或那个问题的猜测,我想自己检查一切,但我需要你帮助我!是否有一个OpenCL基准测试集,可以用来与本地代码进行比较,这是普遍接受的?是否有类似OpenCL代码编写的CUDA SDK? 感谢大家。OpenCL Benchmark

+0

如有以下答案回答你的问题给它一个绿色对号 – Yakk

回答

3

目前没有设置性能基准来测试不同框架的速度。几个基准已经创建。着名的例子包括SHOC基准套件和Rodinia。即将发布OpenCL and the 13 Dwarves,这对基准测试可能有用。

为了做到框架之间的测试,已经完成在性能方面的测试OpenCL和CUDA之间的区别的工作。这些工作中的一部分涉及了解OpenCL,虽然存在正确性可移植性,但不能保证性能可移植性。 Daga在他的论文中强调了架构感知优化的重要性。

+0

SHOC是Oakridge国家实验室开发的一个很好的基准。以下是我认为非常好的HPC连线文章:http://www.hpcwire.com/hpcwire/2012-02-28/opencl_gains_ground_on_cuda.html –

4

不是性能/基准测试专家我只能尝试给你一些关于OpenCL和CUDA的一般想法。公平的警告虽然,我可能会得到一些错误的东西。

基准测试的问题很明显,您只能客观地评估非常特定的事情 - 比如说,在CUDA和OpenCL中完成的相同程序,在同一硬件上(与您命名的源代码一样)。但是,您将无法从该实验中推断出您将在另一个程序或不同的硬件上获得类似的结果。结果会有所不同,所以你将不得不有一个大的测试套件。这就是你所要求的,但我不知道存在的任何东西 - 人们会选择任何一种技术用于他们更大的项目,而不会把所有的东西都写两遍。

NVIDIA代码示例有CUDAOpenCL。你可以选择一些并比较你的结果。

虽然我不认为这将花费时间。也许你应该从另一个角度来处理这个问题:你可以用一个你不能用另一个做的框架来做什么?他们都使用相同的驱动程序,因此两者都将支持新硬件出现的奇特技术。线程调度在硬件中完成,因此它们在那里具有相同的性能。什么还有待检验的东西,如:

  • 将最佳代码使用所有可用内存带宽
  • 将编译器创建高效的代码
  • 你能够让所有的计算单元中使用
  • 和所以...

从我的测试中,这些问题的答案 - 我的代码是否会最佳地使用硬件 - 对于这两个框架都是肯定的。所以他们肯定在同一个联盟中打球,即使现在某个具体问题比另一个快5%,我也不会在一般观点上有所作为。

我故意没有写关于OpenCL的其他用例的任何信息,例如:在CPU上。由于您拥有不同的操作系统,甚至针对相同处理器(例如Apple和I​​ntel)的不同OpenCL SDK,以及许多在没有OpenCL的情况下并行编程的方式(相比较),该字段的范围更广。

+0

非常感谢。我同意你写的所有内容,但我有一些具体的问题需要解决。我知道,速度提高5%并不是 - 一般来说 - 显着的提速,但现在我问自己“好的,我必须做这个计算,我会用什么硬件和什么库?”显然,我会选择更快的解决方案。我的问题的维度没有设定,也许5%的性能差异可能变得“重要”。所以,非常感谢您的回答,我将学习nVidia示例的OpenCL版本。 – biagiop1986

+0

@ biagiop1986:不仅仅是性能考虑。请记住,CUDA代码只能在NVIDIA设备上运行,并且OpenCL代码可以运行在众多设备上,包括那些NVIDIA设备。这不是“所有其他事情都是平等的”情况。除非您要运行一次代码,并且再也不需要它,考虑到硬件兼容性可能非常重要。当AMD发布一款速度非常快的新卡时会发生什么?还是NVIDIA下了?对于硬件不可知代码有很多要说的。 –

2

一般来说OpenCL和CUDA获得相同的性能。 有没有适当的基准,因为根本无法比较不同的硬件和体系结构。

如果你刨去编写一个基于GPU的应用程序,只是想知道至极一个你应该选择。不要因为速度而决定这个或那个。与CPU实现相比,OCL和CUDA都会给x100-x300加速。

我的建议:

  • 如果你打算做一个高层次的应用程序,你需要大量的库,也许应该使用CUDA,因为它有一个更好的SDK和支持。

  • 如果您打算做低级应用程序,并且您将从头开始编写所有代码,请使用OpenCL,因为它将支持几乎所有未来的硬件(CPU和GPU)。你也可以使用一些库,但是没有CUDA好。