配色: 字号:
通用计算时代来临 论CUDA与OpenCL的异同
2012-08-16 | 阅:  转:  |  分享 
  
挖掘GPU通用运算潜能,OpenCL和CUDA

NVIDIACUDA技术的到来,使GPU通用运算的应用领域得到了全面扩充,利用GPU强大的并行运算能力,使更加适合GPU进行运算的程序执行效率大幅提升。虽然早就有人提出了让并行计算架构的GPU,去处理非常适合他们的大规模并行计算工作,但是在CUDA问世前,所谓的GPGPU概念并没有真正的为我们解决问题,而早期专为图形运算而设计的GPU并不能通过一种通用性强的手段完成在GPU上的编程任务,专业性强的图形计算语言仅仅掌握在少数的专业图形开发者的手中。

NVIDIACUDA技术的最大突破就是可以让用户通过简单、易用、使用率广泛的编程语言对GPU进行控制,从而为人们提供高效率的运算工作。而最近一个为“OpenCL”的名词越来越多的出现在我们的视线中。



OpenCL是一种通用运算API,同样是种异构计算机的一种开放式开发语言,它也可以控制GPU去进行通用运算,并且还得到了IT业内广泛的关注和认同。CUDA和OpenGL都是创造计算机异构架构的方式,那么它们之间到底有何不同?OpenGL会不会取代CUDA?在进GPU通用运算时,我们应该使用CUDA还是OpenCL?……以上的问题越来越多的被关注GPU通用算的人提出,而对这两项技术了解不多的朋友更是被搞得一头雾水。

今天我们就为大家带来一次CUDA和OpenCL的详细解析,从未为您揭开CUDA与OpenCL之间的关系之谜。

并行计算的利器OpenCL问世

OpenCL1.0规范在2008年12月浮出水面,12月9日在新加坡召开的2008亚洲SIGGRAPH大会上NVIDIA公司正式宣布完全支持KhronosGroup新近发布的OpenCL1.0技术规范。我们已经知道了OpenCL(开放式计算语言)是一种全新计算应用程序接口(API),它让开发人员能够利用GPU内部巨大的并行计算动力,那么KhronosGroup又是什么呢?



KHRONOSGroup制定了OpenCL标准,KHRONOSGroup这个工作小组中包括了很多厂商,如:Intel、AMD、IBM、SONY、NOKIA……,NVIDIA也是KHRONOSGroup的一员,并且参与了OpenCL内容的制定。由多个厂商成员组成的KHRONOSGroup,提供了多种开放API标准的制定。



KHRONOSGroup中不仅包括了传统的PC硬件厂商,还包括了很多移动设备领域的厂商,因此,我们不应该将这个组织以及他们制定的标准局限在PC平台,也说明了在很多非PC领域上对开放API标准的需求同样重要。对GPU并行计算能力的需求越来越多,以前的OpenGLAPI并不能满足当前的需要,而OpenCL正是用来满足这些需求的,也从另一个侧面反映了NVIDIA一直强调的视觉计算发展方向。

什么是OpenCL?

OpenCL是一种全新计算应用程序接口(API),它的全称是OpenComputeLibrary(开放式计算语言),它让开发人员能够利用GPU内部巨大的并行计算动力。OpenCL的作用就是为通用计算领域提供一个跨平台的统一标准语言。

OpenCL最早是由Apple公司提出,而KHRONOSGroup通过协调各个厂商,从而使OpenCL的跨平台特性更加完善。简单的说,OpenCL是针对并行计算的API,它可以利用GPU进行并行计算方面的工作,OpenCLAPI是应用程序的编程接口,图形程序也有很多API,比如OpenGL和DirectX……

OpenCL开发人员可以利用GPU和CPU的计算能力,把CPU和GPU的异构系统运用在很多并行计算领域里面。

OpenCL工作小组

由KHRONOS所制定的开放标准

OpenCL是KHRONOS制定的多项开放标准中的并行计算和可视化的标准API

并行运算架构——CUDA

NVIDIACUDA技术,也是为释放GPU并行计算能力而设计的,NVIDIACUDA能够通过通用性防范的高级编程语言让GPU进行非常适合的并行计算。

CUDA最初同NVIDIAGeForce8800GPU一道推出,现在NVIDIA所有GPU均已支持CUDA。CUDA是NVIDIA并行计算战略的基础。与使用CPU相比,科学家们见证了CUDA为其应用程序所带来的最高20到200倍的速度提升,CUDA已经被全球研究界人士所广泛采用。从超级计算机与工作站到消费类PC,CUDA架构已被构建到各种各样的计算系统中。现在,目前有25,000多名开发人员利用CUDA架构从事活跃的开发工作。



由于C语言具备易学、使用者多等等普遍性,因此NVIDIA将C语言作为了CUDA架构的编程语言,CUDAC语言让很多对GPU架构、特性并不了解的人,同样可以控制GPU为他们服务。

虽然CUDAC让人们真正的了解了GPU通用运算,在很多领域体验到了CUDA的优势,但是还是有很多人不太了解什么是CUDA,CUDA其实并不是一种编程语言,而是一种并行运算的架构,我们可以把每个支持CUDA的NVIDIAGPU当作是一个CUDA架构,例如:GT200,在进行通用运算时,我们就可以把他们当作是一个240个处理器的CUDA架构,而CUDAC语言仅仅是协调、控制这个CUDA架构的一种语言环境。

CUDAC语言发展路线图

OpenCL与CUDA的关系

NVIDIA的CUDA架构和KHRONOS制定的OpenCL并不冲突,他们之间的关系是API与执行架构之间的关系,举个简单的例子:我们熟悉的X86架构是一种CPU架构,而各种编程语言,如:汇编语言、C语言等低级语言或高级语言仅仅是建立在X86运算架构之上的一种编程环境。那么,CUDA架构和OpenCL之间的关系和X86与编程语言的关系是相同的。

CUDA架构是OpenCL的运行平台之一,因此他们之间并不存在谁取代谁的关系。OpenCL仅仅是为CUDA架构提供了一个可编程的API而已。



CUDA架构与编程语言、API的关系

为了有助于大家理解,我们制作了上面的示意图,从图中我们可以看到,C语言和OpenCL才是在相同级别上的,而CUDA架构是在它们之上的,在CUDA架构上,还可以使用更多的编程语言,DirectX11计算、古老的Pascal、Fortran语言、JAVA都可以控制CUDA架构,通过CUDA架构来处理并行计算工作。那么CUDAC语言和OpenCL是否存在冲突呢?答案仍然是否定的。

CUDAC语言和OpenCL是两种不同的编程模式

对于编程人员来说他可以选择不同的语言或者API进行编程,可以选择OpenCL编程也可以选择CUDA上面的C语言来编程,或者其他API的语言来编程。API和C语言进行开发是有一些不同的,API是一个编程接口,它的核心是函数库和应用程序开发的一个硬件接口,对于API来编程的话,它有一个好处,那就是可以访问比较低层次的硬件,但是它也有一点,特别是像内存的管理,这个是需要程序员自己来进行管理的。而C语言相对来说我们在利用CUDAC语言来编程的时候,很多东西是由我们的开发环境来进行管理的,比如内存他是用runtime进行管理的,runtime实际上就是运行时的一些支持程序来进行这方面的管理。不管OpenCL或者CUDAC语言来编程,最终它都是需要通过一个驱动程序来变成一个PTX的代码,PTX相当于我们CUDA的指令集来进行执行,然后交给图形处理其或者交给硬件来进行执行。这两个最终达到都是使用PTX或者在我们GPU上进行执行。

简单的说,CUDAC和OpenCL的关系就像是武将所使用的不同武器一样,剑和刀都可以让武将杀敌,而这两种武器的使用方法是不一样的,而CUDA架构和OpenCL、CUDAC的关系就相当于武将和武器,CUDA架构(武将)可以很好的驾驭CUDAC语言(刀),也可以熟练的使用OpenCL(剑),而刀和剑的特点并不一样,它们都有各自的长处。而编程者开发程序的作用就像是一本武功秘籍或兵器使用指南,哪本秘籍能让武将更完美的驾驭兵器,哪个就能得到更好的结果,因此CUDAC和OpenCL之间也不存在哪个效率更高、哪个效率更低的区别,决定效率的仅仅是程序的效率。

NVIDIA携手OpenCL引领GPU通用运算

相信看过前面的内容后,大家能够了解OpenCL和CUDA的关系,下面我们来对两者的关系进行一下总结:

1、OpenCL是KHRONOS成员制定的,可运行在多种平台上的并行计算API,NVIDIA也是制定该标准的一员。

2、CUDA是NVIDIA的GPU并行计算架构,OpenCL是可以运行在该架构上的API

3、CUDAC和OpenCL的编程模式不同,两者不存在冲突

4、CUDAC的效率无法直接与OpenCL进行对比,决定权在编程者编写的程序端



NVIDIA的CUDA技术开启了GPU实现通用运算的大门,而OpenCL的到来,则使CUDA架构可以在更多的领域中得到发挥,让更多以往从事OpenGLAPI编程的人找到了开发GPU并行计算能力的钥匙。另外,OpenCL所具备的开放性使跨平台的程序可以在CUDA架构上高效运行,使CUDA架构得到了更多的使用价值。

从Apple公司首次提出OpenCL概念到OpenCL1.0的真正问世,NVIDIA都在其中扮演了重要的角色,相信在CUDA架构应用范围的逐渐扩大,更多的人在更多的领域无论是使用OpenCL还是其他CUDA所支持的API、编程语言,都可以创造更多价值!















































献花(0)
+1
(本文系yangshiquan...首藏)