越来越多的人正在关注异构计算,为了发表一点个人理解和看法,本文将从一个开发者的角度阐述一下自己的观点。期待大家的批评指正。
越来越多的主流媒体,出版物都在花时间向大家传递一个信息——异构计算已经并可能在相当长的一段未来时期中主宰计算平台[1,2]。那到底什么是异构计算呢?
作为软件开发者,我认为异构计算就是在异构平台上执行计算,因此我们应该先对异构的计算平台有一定理解,然后在了解如何在异构平台上执行计算。那到底什么是异构平台呢?首先我们知道现在有很多可以用于计算的单元,诸如CPU,GPU,MIC,DSP,FPGA等等,如果在同一个计算机系统中加入不同的计算单元,那么组成的这个计算机系统就可以认为是一个异构的计算平台。大多数人认为现在比较成熟的异构平台是CPU+GPU的计算平台,原因在于两点:越来越多的用户开始使用这种平台;这种异构的计算平台的性能在top *百中屡有佳绩。当然这两点原因看上去联系也很密切。
关于CPU+GPU的这种计算平台,目前也有多种存在形式,根据是否共享内存可以分为两种:CPU与GPU共享内存,比如AMD的APU,目前AMD将CPU和GPU共享同一块内存,但是CPU的线程不能和GPU的线程共享同一块数据,在HPCChina2012上,AMD表示不久的将来他们会完成CPU线程与GPU线程共享数据,作为开发者我们也期望那一天再点到来;另一种就是CPU和GPU完全保有独立的存储单元,他们之间使用PCIE通信,这是Nvidia正在做的,Nvidia还在继续努力的提高GPU计算单元的访存和计算速度,以及计算单元的个数。另外,除了GPU这种已经流行的协处理器之外,Intel的协处理器MIC也许会在真正发布之后,获得异构计算的一席之地。
有了异构平台,作为软件开发者,我们应该如何开发异构的应用呢?接下来我们将讨论这个问题。
从GPU说起。其实在很早以前,人们已经意识到GPU的众核性能,开始大家只能使用图形处理接口来利用GPU的计算资源,后来CUDA[3]的推出,将基于CPU+GPU的异构计算逐渐推广!紧接着越来越多的硬件厂商开始开发自己的异构硬件平台,他们也想推出自己的软件接口。这样就带了一个问题,我们作为程序开发人员,最不希望的就是要掌握所有平台,而更可悲的是他们完全可以统一!所以OpenCL[4]出现了!OpenCL是一种统一的标准,它可以实现在不同硬件厂商的平台的兼容的编写程序。并且我们可以统一将除了CPU以外的属于同一个计算机系统的其它计算单元称为协处理器。
OpenCL标准中包含如下几个重要部分:如何定义在协处理器上执行的多线程函数;如何定义在协处理器上数据;使用什么接口在CPU和协处理器之间传输数据;如何获得异构平台的资源描述。有了这些说明和定义,我们便可以书写程序了。
我们继续讨论OpenCL。一般我们的协处理器上的多线程函数被称为核函数,核函数的编译时在程序第一次运行时进行的。另外由于OpenCL支持所有平台,这一点使得OpenCL丢掉一定的性能,在程序开发的时候,应该考虑到这一点。另外,OpenCL的需要程序员花费很多精力在资源管理上,它的编程方式类似于驱动接口。
还有一种基于指导语句的编程方式可以让我们更容易的使用异构平台,目前比较成熟的是OpenHMPP[5]标准,还有已经公布了1.0标准的OpenACC[6]标准。这种编程方式是将并行化过程交给编译器来完成,通过简化程序员的工作,获得更高的工作效率。当然加了指导语句的程序在性能方面会依赖于不同的编译器生产商。比如PGI的编译器虽然支持OpenACC,但是他们的编译器只支持Nvidia的GPU,并且不提供输出核函数的中间代码,而CAPS的编译器则对所有平台支持,并且会产生核函数中间代码,给用户带来更多的优化空间。
随着异构计算的不断发展,越来越多的企业和个人将会获得异构计算带来的经济效益。作为异构计算的一名技术工程师,期待您也能尽快了解异构计算,并从中获益!
参考文献:
[1] http://www.programmer.com.cn/7771/
[2] 《OpenCL异构计算》
[3] http://en.wikipedia.org/wiki/CUDA
[4] http://en.wikipedia.org/wiki/OpenCL
[5] http://en.wikipedia.org/wiki/OpenHMPP
[6] http://en.wikipedia.org/wiki/OpenACC