GPU计算应用日趋广泛
随着图像处理技术的发展,对图形和图像的处理要求也越来越高,特别是3D技术的兴起,使图形图像处理和3D计算技术已经应用到各种视频游戏、电影产业、医疗成像、空间探索、远程通信等方面。同时,伴随着移动互联网以及终端技术的发展和普及,云端须处理的数据量呈爆发式增长,对大数据、视频和3D计算提出了更多的需求。
在通用计算领域,凭借高密度并行计算能力,GPU现已用于解决大量的通用计算问题,形成GPGPU(General-purpose computing on graphic computing unit)研究领域,特别是在CUDA推出以后,GPU计算已被广泛应用于图像处理以外的领域,包括导航识别、数理统计分析、数值天气预报、分子力学模拟、流体力学模拟、军事模拟、地质勘探等。
统一计算架构CUDA
CUDA(Compute Unified Device Architecture)是由NVIDIA公司提出的一种GPU通用计算框架,为GPU增加一个易用的编程接口,是目前应用广泛的编程框架。
CUDA是C语言的一种扩展,它允许使用标准C来进行GPU代码编程。这个代码既适用于主机处理器(CPU),也适用于设备处理器(GPU)。主机处理器负责派生出运行在GPU设备上的多线程任务(CUDA称其为内核程序)。GPU设有内部调度器来把这些内核程序分配到相应的GPU硬件上。一般将逻辑语句多的,并且串行执行的处理,使用主机编程,而数据处理较密集,算术运算多的,具有高度并行性的部分使用GPU处理。
CUDA架构优势。相比CPU而言,CUDA架构中的GPU具备以下特点:
从硬件架构角度,GPU的计算单元有两层结构:SM(Streming Multiprocessor)和SP(Streming Processor)。一个GPU,实际上是一个SM的阵列,每个SM包含多个SP。SM相当于CPU的核,相同的SM中的所有SP可同时处理不同的数据。例如费米架构的GPU卡包含16个SM,每个SM包含32个SP。相对于一个四核的CPU来说,一个费米架构的GPU,核数是其4倍,数据吞吐量是其32倍。在内存方面,CPU程序模型的内存层次由硬件解决,程序员无需关心。而GPU的设计则在SM层设计了程序员可见的共享内存,可供程序员根据需要灵活使用以提高数据访问速度。同时,GPU具有多个寄存器组,可快速进行线程间切换。
从编程模型的角度,CPU使用MIMD(多指令多数据) 指令模型,而GPU采用SIMT(单指令多线程)指令模型。CUDA的编程模型将线程组合在一起形成了线程束、线程块以及线程网络,这些线程组合在一起形成了并行程序。相比CPU的按时间片串行执行程序,GPU采用硬件并行的模式,需大量线程填充数据区,利用有效的工作池来保证一直有事可做,不会出现闲置。当遇到指令延迟与存储器延迟引起的阻塞时,CPU处理器会闲置等待操作完成,而GPU的线程模型会快速切换到另外的线程,以实现对这种延迟的隐藏。
综上所述,CUDA的硬件架构和编程模型,决定其性能优势集中体现在硬件的并行计算上。基于高密度并行处理的CUDA程序,可极大地提高异构系统的整体性能。
基于CUDA构建高密计算云
GPU虚拟化。构建GPU高密计算云,必须解决GPU计算能力的虚拟化问题。目前,对于GPU虚拟化方法的研究,主要集中在三个方面。
设备仿真:采用模拟出完整的硬件环境的方式,为系统提供一个伪设备。实际仿真的设备位于CPU或内存中。由于实际运行的CPU并不具备GPU的大规模并行计算能力,其执行效率太低,在实际应用环境中并不具有实用价值。
设备独占:该方式允许用户通过操作系统直接控制物理设备,本质上是直接通过原生的显卡驱使用GPU,跳过了VMM(Virtual Machine Monitor)的参与。由于缺少VMM跟踪和硬件设备的维护状态,采用该方式无法支持虚拟机的实时迁移、快照等高级特性。
API虚拟化:该方式主要是对应用程序接口API进行重定向。通过拦截所有与GPU相关的API,使用重定向或者模拟的方式,将计算任务发送至物理机,在物理机中利用相应硬件去完成相应功能,最后将计算的结果通过指定的通信方式返回给客户端应用程序。
目前,大多数虚拟化平台对CUDA虚拟化的支持,仅达到设备独占的层次,仅有Citrix XenServer可以达到Partitioning的高度,即在同一虚拟机上将一个物理GPU进行多个复用的功能,而对于更高级的功能,比如基于分时复用、热迁移等功能都没有涉及。
学术界对CUDA的虚拟化方法的研究则更加深入,主要集中在对API重定向技术上,已提出多个基于CUDA的API重定向的虚拟化可行方案,实现对上层应用的完全透明,可无缝支持热迁移、快照等功能。
基于CUDA的API重定向实现GPU虚拟化。
自CUDA架构提出以来,基于CUDA的API重定向的GPU虚拟化技术,成为国内外学者广泛关注的一个热点。由于API重定向技术的灵活性,越来越多的研究人员认定API重定向技术是GPU虚拟化技术的归宿,提出了多种不同的解决方案,如vCUDA(Virtual CUDA)、rCUDA(remote CUDA)、GVim(GPU-accelerated Virtual achines)、gVirtuS等。
vCUDA通过API重定向的方法,拦截用户层的所有CUDA的API调用,重定向到物理机器上执行,实现对程序员的全透明,使得开发难度大大降低。考虑到RPC的性能开销问题,该解决方案采用了懒惰RPC的方法,尽可能减少RPC调用的次数。具体的做法是通过累积、过滤、合并上层调用等方式,合理确定发送RPC的时机,将连续的API打包一次性发送,有效提高了系统性能。
rCUDA,通过socket的通信方式在远程执行CUDA,相对采用RPC的vCUDA来说,效率有所提高。
GVim通过建立前端、后端、拦截库、库封装器四个模块来实现API的拦截和重定向。但是该解决方案只适用于特定的Xen虚拟化平台。
gVirtuS在vCUDA和GVim的基础上,独立实现了GPU虚拟化架构,保证了平台无关性,适用于Xen、VMware、KVM等主流的虚拟化平台。
CUDA高密计算云应用现状
自2007年提出CUDA以来,NVIDIA公司一直致力于云计算平台与CUDA的技术结合。其率先于2012年5月推出利用GPU加速云计算技术,同年10月推出了首款云计算虚拟GPU加速平台—VGX K2,并于2013年GTC大会上推出了云计算产品服务器平台—NVIDIA GRID。GRID 卡采用基于 NVIDIA Kepler架构的GPU,首次实现了 GPU 的硬件虚拟化。这意味着多名用户可以共享单一GPU。随后,国外的多家云服务提供商也推出了各自的基于GPU并行计算的云服务平台,包括Amazon、Nimbix、Peer 1 Hosting等。
在国内,“云图”和“云渲染”方案的提出,也标志着云服务提供商开始在GPU高密计算方面发力。“云图”(W760-G10)由曙光公司、NVIDIA公司、思杰公司于2014年合作推出,虽然尚未有明确的云租用服务,但已具备GPU硬件虚拟化的能力。阿里云于2013年提出“云渲染”方案,在国产3D动画电影《昆塔》中首次使用了云计算进行后期渲染的新技术,通过将一个或者多个渲染任务分割成若干部分,在计算机集群中的各个节点同时进行,以此类推,大大缩短渲染时间。
可以预见,随着CUDA与云计算的紧密结合,强大的GPU计算能力将推动云服务平台在图像分时、动画渲染、视频编码、3D运算、导航识别、数理统计分析以及大数据挖掘等领域发挥重要作用。