传统的多核心CPU在和GPU沟通工作任务时存在一些问题。举例来说,在Fermi架构上,Fermi架构支持多1个信息传递界面(Message Passing Interface,简称为MPI),只能接受来自于CPU的一个工作任务。造成这样的原因主要是考虑到伪相依性问题(主要指在GPU计算过程中的排列问题,比如谁先写入、谁后写入、谁先占用寄存器等)。对CPU来说,由于只有一个MPI,CPU多核心运作效率往往不高。并且由于MPI数量单一,如果任务不繁重的话,可能出现GPU效率不高、无法达到满载的情况。虽然在很多情况下,通过重新排布等方法,这样的问题可以得到一定程度的缓解,但面对越来越复杂的程序,单一MPI本身对GPU利用不高、浪费CPU性能的问题逐渐变得令人关注。
在GK110上,NVIDIA使用了名为Hyper-Q的技术来大幅度提高CPU的效率和GPU的占用率。Hyper-Q的主要改进在于增加了CPU和GPU内的CUDA Work Distributor(直译为CUDA工作分发设备,简称为CWD)之间的链接总数。再加上其他的改进,新的GK110可以接受来自多个CUDA命令以及MPI的进程,甚至一个进程内部的多个工作执行单元都可以在新的GK110上并行执行。现在GK110可以执行多32个并行的MPI。为了达到这个目的,每个CUDA进程的内部工作序列管理,以及相依关系等需要重新处理以达到佳化,并且GK110在某进程内部的计算不会扰乱或阻挡其他进程。如果不同进程不存在严格的相依性,也可以同时并行执行,大大提升了效率。
NVIDIA给出了例子用于解释Hyper-Q的工作方式,在Fermi上,A-B-C、P-Q-R、X-Y-Z之间的CP、RX之间存在伪相依关系。也就是说,C的执行结果虽然和P完全没有任何关系,但C可能会和P使用同样的寄存器(或者其他原因),那么Fermi只有等C执行完了以后,才能开始P的执行。但是在GK110上,由于伪相依的关系被Hyper-Q移除,A-B-C、P-Q-R、X-Y-Z三个程序可以分别同时执行。就像本文前面描述的那样,CPU可以充分发挥多核心优势,同时给GK110提供多个并行的任务,提高CPU占用率,GK110本身也可以达到高效率、满载运行的状态,让计算在短时间内完成。
为了更好地完成动态并行技术、Hyper-Q等新技术的操作,NVIDIA还特别设计了全新的网格管理单元,对Grid进行操作。
Hyper-Q可以让MPI界面链接增加到32个,远远超过Fermi的1个,在极限条件下,Kepler效能会达到Fermi的32倍。
什么是Grid呢?直译Grid的意思是栅格、网格。在CUDA中,线程低等级是Thread,多组线程组成了Warp(上期已经介绍过),再上一层是Thread Block,上层是Grid。简单来说,Grid类似与一个在CUDA中的完整程序功能组,这个功能组可以实现自己独特的功能,与别的程序相关性很差。每一个Grid拥有自己独立的全局内存、常数内存和纹理内存。
在Fermi上,每一个Grid在接受CPU命令启动后,会直接执行到结束,中途不会停止也不会被暂停替代。在GPU上,Grid会由CWD建立一个CPU到SM的单向工作流。这个单向工作流由CPU发出,目标是SM。SM在没有执行完成之前,是不能得到CPU任何指令的。
这样的做法足够简单,但稍显粗暴,GK110需要的动态流程控制等功能显然和这样的设计相悖。举例来说,在GK110上,第一个Grid依旧由CPU启动,但是新的Grid也可以由GPU内部的SMX单元内、以新程序的方式由CUDA建立—这是动态并行控制工作的重要方式。为了达到这个目的,NVIDIA设计了一个新的、被称作Grid Management Unit(网格管理单元,简称GMU)的新部件,控制这些新生成的Grid并给予Grid更多自由的功能。
GK110在执行CUDA程序时,GMU能够调度在CWD中准备好的32个执行中的Grid。和之前CWD直接单向链接SM不同的是,GMU以双向链接和CWD相搭配,这种双向链接设计,可以让GMU暂停新的Grid,分配新的Grid或者保留等待的Grid在存储器中以便需要的时候再进一步发配。GMU和SMX单元直接链接,新的动态并行控制功能也可以在GMU的控制下,根据工作任务的优先级来排列,以更好地确保GPU的工作效率。
简单来说,GMU实际上是NVIDIA在GK110中加入的一个全新逻辑处理区域,它的使用使得GK110进一步降低了对CPU的需求。GMU和之前的动态并行控制等功能一起,极大地提升了GK110的并行计算效能,让GPU能够真正以更聪明、更智能、更接近CPU的方式工作。
目前的大规模并行计算早已不满足于使用单一GPU来进行计算,多GPU进行“并行之上的并行”是迅速提升计算能力的重要技术。之前的GPU比如Fermi,虽然可以很好地进行并行计算,但每个GPU本地显存中存储的数据却不能互相访问。
在使用了GPUDirect后,整个数据访问会变得更为简单,跨设备和跨区域的访问成为可能,这可以节约大量时间并极大的提升效率。
这就带来了一个数据互联互通的问题。在并行计算中,将任务分配给多个GPU同时计算时,如果GPU之间的计算数据不能有效通讯,那么只有等待计算完成后才能统一将数据和结果再次综合并分配下去,这样无疑降低了效率并浪费时间。NVIDIA在Kepler上引入了GPUDirect功能,GK110更是支持GPUDirect中的RDMA功能。这个功能的特点在于可以让第三方设备,比如网卡、SSD等设备直接读取GPU显存,从而降低中转步骤并提高性能。此外,在一些需要多GPU并行分布计算的任务中,不同的GPU借助GPUDirect和CUDA 5.0,可以互相访问对方显存中的数据,GPU和GPU的直接通讯可以不经过CPU以及PCI-E控制器,速度和访问延迟都得到了极大的改善。
NVIDIA在GPU通用计算的道路上已经走了很远。现在,NVIDIA GPU的设计已经基本上彻底GPGPU化。和图形处理器发展中GPU不断用新的功能代替CPU计算一样,目前NVIDIA在通用计算中,一步一步地在加强GPU本身的功能,加入了更多类似逻辑判断、流程控制等功能,以期望在未来的发展中进一步降低CPU在整个CPU-GPU体系中的重要性。比如采用性能更低的CPU(比如ARM架构)也可以组建性能强大的超大规模并行计算体系,这和NVIDIA本身的产品缺陷和发展方向是一脉相承的。
NVIDIA没有足够强大的CPU产品,即不能像AMD那样以APU为名,实现CPU和GPU的片上融合;也不能像英特尔那样以强大的CPU性能搭配众核架构来实现超大规模并行计算。因此,NVIDIA只有不断地加强自己的GPU,让GPU做更多的工作,再搭配未来可能出现的强大的采用ARM架构的CPU来实现自己跨越发展的梦想。
通用计算目前的难题依旧在并行本身,如何让程序更进一步并行化并有效率的工作,是所有程序员需要面对的困难。英特尔的众核计划产品Xeon Phi已经向NVIDIA步步逼来,不过Xeon Phi也要面对并行化的困扰。相信凭借英特尔强大的技术研发实力和市场能力,在超大规模并行计算市场上分一杯羹显然不算太难。NVIDIA需要进一步加强实力,因此我们看到了GK110,这个71亿晶体管的巨兽,它带来的不仅仅是NVIDIA创新的图形和通用计算技术,还有NVIDIA的希望。