GPU英文名称为Graphic Processing Unit,GPU中文全称为计算机图形处理器,1999年由NVIDIA公司提出。

一、GPU概述

GPU这一概念也是绝对于计算机系统中的CPU而言的,因为人们对图形的需要越来越大,尤其是在家用零碎和游戏发烧友,而传统的CPU不能满足现状,因而须要提供一个专门解决图形的外围处理器。

GPU作为硬件显卡的“心脏”,位置等同于CPU在计算机系统中的作用。同时GPU也能够用来作为辨别2D硬件显卡和3D硬件显卡的重要依据。2D硬件显卡次要通过应用CPU 来解决个性和3D 图像,将其称作“软减速”。

3D 硬件显卡则是把个性和3D 图像的解决能力集中到硬件显卡中,也就是“硬件加速”。目前市场上风行的显卡多半是由NVIDIA及ATI这两家公司生产的。

1.1、为什么须要专门呈现GPU来解决图形工作,CPU为啥不能够?

GPU是并行编程模型,和CPU的串行编程模型齐全不同,导致很多CPU上优良的算法都无奈间接映射到GPU上,并且GPU的构造相当于共享存储式多解决构造,因而在GPU上设计的并行程序与CPU上的串行程序具备很大的差别。GPU次要采纳立方环境的材质贴图、硬体T&L、顶点混合、凹凸的映射贴图和纹理压缩、双重纹理四像素256位的渲染引擎等重要技术。

因为图形渲染工作具备高度的并行性,因而GPU能够仅仅通过减少并行处理单元和存储器管制单元便可无效的进步解决能力和存储器带宽。

GPU设计目标和CPU截然不同,CPU是设计用来解决通用工作,因而具备简单的管制单元,而GPU次要用来解决计算性强而逻辑性不强的计算工作,GPU中可利用的处理单元能够更多的作为执行单元。因而,相较于CPU,GPU在具备大量反复数据集运算和频繁内存拜访等特点的利用场景中具备无可比拟的劣势。

1.2、GPU如何应用?

应用GPU有两种形式,一种是开发的应用程序通过通用的图形库接口调用GPU设施,另一种是GPU本身提供API编程接口,应用程序通过GPU提供的API编程接口间接调用GPU设施。

1.2.1、通用图形库

通过通用的图形库的形式应用GPU,都是通过 OpenGL 或Direct3D这一类现有的图形函数库,以编写渲染语言(Shading Language)的办法管制 GPU 外部的渲染器(Shader)来实现须要的计算。

目前业界公认的图形编程接口次要有OpenGL和DirectX这两种接口。OpenGL是以后可用于开发可交互、可移植的2D与3D图形应用程序的首选环境,也是以后图形利用最宽泛的规范。OpenGL是SGI公司开发的计算机图形处理零碎,是图形硬件的软件接口,GL为图形库(Graphics Library),OpenGL应用程序不须要关注所在运行环境所处的操作系统与平台。

只有在任何一个遵循OpenGL规范的环境下都会产生一样的可视化成果。与OpenGL相似,DirectX (Directe Xtension)也是一种图形API。它是由Microsoft创立的多媒体编程接口,并曾经成为微软视窗的规范。为适应GPU利用的需要,DirectX则依据GPU新产品性能的裁减与停顿及时地定义新的版本,它所提供的性能简直与GPU提供的性能同步

1.2.2、GPU本身编程接口

GPU本身提供的编程接口次要由提供GPU设施的两家公司提供,别离是括NVIDIA的CUDA框架和AMD(ATI)公司于2006年提出了CTM(Close To Metal)框架(备注,最后是ATI公司生产GPU设施,后被AMD收买)。AMD的CTM框架当初已不在应用,次要是AMD(ATI)于2007 年推出了ATI Stream SDK架构,2008 年AMD(ATI)齐全转向了公开的OpenCL规范,因而AMD(ATI)公司目前已没有独立的、公有的通用计算框架。

2007年NVIDIA公司公布CUDA (Compute Unified Device Architecture)专用通用计算框架。应用CUDA 进行通用计算编程不再须要借助图形学API,而是应用与C 语言以非常相似的形式进行开发。在CUDA 编程模型中,有一个被称为主机(Host)的CPU 和若干个被称作设施(Device)或者协处理器(Co-Processor)的GPU。

在该模型中,CPU和GPU协同工作,各司其职。CPU负责进行逻辑性较强的事务处理和串行计算,而GPU 则专一于执行线程化的并行处理工作。CPU、GPU 各自领有互相独立的存储器地址空间主机端的内存和设施端的显存。个别采纳CUDA 框架本人进行编程的都是一些大型的应用程序,比方石油勘测、流体力学模仿、分子动力学仿真、生物计算、音视频编解码、地理计算等畛域。

而咱们个别企业级的应用程序因为开发成本以及兼容性等起因,大多数都是采纳通用的图形库来进行开发调用GPU设施。

1.3、GPU如何工作?

GPU 对于通用计算机和图形处理的外部组件次要有两局部: 顶点处理器(Vertex Processor)和子素处理器(Fragment Processor)。这种处理器具备流处理机的模式,即不具备大容量的快存/存储器能够读写,只是间接在芯片上利用长期寄存器进行流数据的操作。

当GPU 用于图形处理时,此时GPU 外部的顶点渲染、像素渲染以及几何渲染操作都能够通过流处理器实现。从图中能够看出,此时GPU 外部的所有流处理器相当于一个多核的处理器,数据能够很不便地在不同的流处理器之间的输出和输入之间挪动,同时GPU分派器和管制逻辑能够动静的指派流处理器进行相应的顶点,像素,几何等操作,因为流处理器都是通用的。

二、GPU虚拟化

开始咱们的正题,目前虚拟机零碎中的图形处理形式有三种:一种是采纳虚构显卡的形式,另一种是间接采纳物理显卡,最初是采纳GPU虚拟化。

2.1、虚构显卡

第一种采纳虚构显卡是当初支流的虚拟化零碎的抉择,因为业余的显卡硬件价格不菲。目前采纳虚构显卡的这些技术包含:

虚构网络计算机VNC (Virtual Network Computing)
Xen 虚构帧缓存
VMware虚构图形显示处理器GPU (Graphics Processing Unit)
独立于虚拟机管理器的图形减速零碎VMGL (VMM-Independent Graphics Acceleration)。
VNC(Virtual Network Computing)基本上是属于一种显示零碎,也就是说它能将残缺的窗口界面通过网络,传输到另一台计算机的屏幕上。Windows 服务器中蕴含的"Terminal Server"即是属于这种原理的设计。VNC 是由AT&T 实验室所开发的,其采纳GPL(General Public License)受权条款,任何人都可收费获得该软件。VNC软件要由两个局部组成:VNC server和VNC viewer。用户需先将VNC server装置在被近程操控的计算机上后,能力在主控端执行VNC viewer 进行近程操控。

XEN虚构帧缓存是指XEN提供的一个虚构的显示设施。该虚构显示设施采纳特权域的VNC服务器,因而该虚构显示设施具备类似的VNC接口。客户机在XEN虚构帧缓存中写入数据,而后通过VNC 协定来传输已批改的图片,最初告诉前端进行相应区域的更新。这个虚构帧缓存设施的源码是来自开源的Qemu。咱们在XenServer上看见虚拟机的操作系统桌面界面,即是这种技术的显示。

虚构网络计算机VNC 和XEN 虚构帧缓存这两种模式至今在虚拟机中仍未提供肯定的硬件图形减速能力。因为目前仍没有一个机制能使虚拟机进行拜访图形硬件的能力,因而这些虚构的显示设施都是通过应用CPU以及内存的形式对图形数据进行相应解决。并没有采纳物理显示设施的性能。

然而VMGL这种模式曾经实现了这种机制,这个机制通常被称为前端-后端虚拟化机制(Front-end virtualization)。VMGL这种模式采纳这个机制将须要图形处理的数据发送到一个领有硬件图形减速性能的虚构监控机上进行相应的图形数据处理。目前存在的比拟支流可用于GPU利用程序开发的图形处理接口有两类:OpenGL和Direct3D。

在这两类图形处理接口中,OpenGL是惟一一类可能在支流操作系统中跨平台操作的图形API接口。在虚拟机平台中,VMGL是首个针对OpenGL API进行虚拟化的我的项目。VMGL的工作原理是,它在客户端操作系统中部署了一个伪库(Fake Library)用来取代规范的OpenGL 库,伪库(Fake Library)领有与规范的OpenGL库雷同的接口,在客户端操作系统中的伪库也实现了指向近程服务器的宿主机操作系统的近程调用。

这样一来,所有的本地OPENGL调用都将被解释为对近程服务器的一次服务申请,近程服务器的宿主机操作系统领有真正的OPENGL库、显卡驱动和物理硬件GPU,它负责实现OPENGL申请并将执行结果显示到屏幕上。因为VMGL在整个过程操作中都是齐全通明的,因而调用OPENGL的应用程序不须要批改源代码也不须要进行二进制改写,无需为虚拟机平台作任何改变。

2.2、显卡直通

显卡直通也叫做显卡穿透(Pass-Through),是指绕过虚拟机管理系统,将GPU 独自调配给某一虚拟机,只有该虚拟机领有应用GPU的权限,这种独占设施的办法调配形式保留了GPU的完整性和独立性,在性能方面与非虚拟化条件下靠近,且能够用来进行通用计算。然而显卡直通须要利用显卡的一些非凡细节,同时兼容性差,仅在局部GPU 中设施能够应用。

Xen 4.0减少了VGA Passthrough技术,因而XenServer也领有了该技术,XenServer的Passthrough 就是利用英特尔设施虚拟化(Intel VT-d)技术将显示设施裸露给某一个客户虚拟机,不仅其它客户虚拟机不能拜访,就连宿主虚拟机也失去了应用该GPU的能力。它在客户虚拟机中实现了显卡的一些非凡细节,如VGA BIOS、文本模式、IO 端口、内存映射、VESA模式等,以反对间接拜访。应用Xen Server的 VGA Pass-Through 技术的GPU执行效率高,性能全,但只能被繁多零碎独占应用,失去了设施复用的性能。VMware ESXi 中包含一个VM Direct Path I/O框架,应用该技术也能够将咱们的显卡设施直通给某一虚拟机进行应用。

XenServer和VMware应用的是不同的技术然而实现的成果都是一样的,行将物理显卡设施直通给其中的某一虚拟机应用,以达到虚拟机进行3D显示和渲染的成果。

因为显卡直通实际上是由客户操作系统应用原生驱动和硬件,短少必要的中间层来跟踪和保护GPU 状态,它不反对实时迁徙等虚拟机高级个性。如XenServer Passthrough禁止执行Save/Restore/Migration 等操作。VMware的虚拟机中,一旦开启VMDirectPath I/O性能,其对应的虚拟机将失去执行挂起/复原、实时迁徙的能力。

2.3、显卡虚拟化(GPU虚拟化)

显卡虚拟化就是将显卡进行切片,并将这些显卡工夫片调配给虚拟机应用的过程。因为反对显卡虚拟化的显卡个别能够依据须要切分成不同的规格的工夫片,因而能够调配给多台虚拟机应用。其实现原理其实就是利用应用层接口虚拟化(API remoting),API重定向是指在应用层进行拦挡与GPU相干的应用程序编程接口(API),通过重定向(依然应用GPU)的形式实现相应性能,再将执行后果返回应用程序。

咱们当初应用Citrix的3D桌面虚拟化解决方案中,大部分是应用NVIDIA公司提供的显卡虚拟化技术,即是vCUDA(virtual CUDA)技术,后面咱们说过了CUDA框架,再此不在阐明。vCUDA采纳在用户层拦挡和重定向CUDA API的办法,在虚拟机中建设物理GPU的逻辑映像——虚构GPU,实现GPU资源的细粒度划分、重组和再利用,反对多机并发、挂起复原等虚拟机高级个性。

其vCUDA的实现原理大略包含三个模块:CUDA客户端、CUDA服务端和CUDA治理端。以XenServer为例,在物理硬件资源上运行着一个VMM用于向上提供硬件映像,在VMM上运行着若干个虚拟机。其中一个虚拟机为特权虚拟机(Host VM),即为XenServer中的Domain 0,在虚拟机中运行的操作系统称为Host OS。

Host OS可能间接管制硬件,零碎内装置着原生的CUDA库以及GPU驱动,使得Host OS能够间接拜访GPU和应用CUDA。其它的虚拟机属于非特权虚拟机(Guest VM),其上运行的操作系统(Guest OS)不能间接操纵GPU。在这里咱们将CUDA客户端称之为客户端驱动,CUDA服务端称之为宿主机的驱动,CUDA治理端称之为GPU管理器。

2.3.1、客户端

客户端驱动其实质就是咱们装置在虚拟机比方Windows 7上的显卡驱动程序。次要的性能是在用户层提供针对CUDA API的库以及一个保护CUDA相干软硬件状态的虚构GPU(vGPU)。客户端驱动间接面向CUDA应用程序,其作用包含:

1)拦挡应用程序中CUDA API调用;
2)抉择通信策略,为虚拟化提供更高层语义的反对;
3)对调用的接口和参数进行封装、编码;
4)对服务端返回的数据进行解码,并返回给利用。
此外,客户端驱动在第一个API调用到来之前,首先到治理端索取GPU资源。每一个独立的调用过程都必须到宿主治理端驱动申请资源,以实现对GPU资源和工作的实时调度。

此外,客户端驱动同时设置了vGPU用来保护与显卡相干的软硬件状态。vGPU自身本质上仅仅是一个键值对的数据结构,在其中存储了以后应用的地址空间、显存对象、内存对象等,同时记录了API的调用秩序。当计算结果返回时,客户端驱动会依据后果更新vGPU。

2.3.2、服务器端

服务端组件位于特权虚拟机(XenServer术语:特权域)中的应用层。特权虚拟机能够间接与硬件交互,因而服务端组件能够间接操纵物理GPU来实现通用计算工作。

服务端面向实在GPU,其作用包含:

1)接管客户端的数据报,并解析出调用和参数;
2)对调用和参数进行审核;
3)利用CUDA和物理GPU计算审核通过的调用;
4)将后果编码,并返回给客户端;
5)对计算零碎中反对CUDA的GPU进行治理。
此外,服务端运行的第一个工作是将本身反对CUDA的GPU设施的信息注册到治理端中。服务端应答客户端的申请时,为每个利用调配独立的服务线程。服务端对立治理本地GPU资源,依照肯定的策略提供GPU资源,并将因为API调用批改的相干软硬件状态更新至vGPU。

2.3.3、治理端

治理端组件位于特权域,在实现CUDA编程接口虚拟化的根底上,将GPU弱小的计算能力和计算资源在更高的逻辑档次上进行隔离、划分、调度。在CUDA服务端应用计算线程和工作线程在肯定水平上使同在一个物理机上的GPU间负载平衡,设置CUDA治理端组件在更高的逻辑档次上进行负载平衡,使在同一个GPU虚构集群中的GPU负载平衡。

治理端组件调度的准则是尽量使在同一个物理机上的GPU需要自给,如果该物理机上具备满足条件的GPU资源,在个别状况下,该物理机上的虚拟机的GPU需要都重定向到该物理机的CUDA服务端。

治理端对GPU资源进行对立治理,采纳集中、灵便的机制,实现:

1)动静调度:当用户所占资源闲暇工夫超过肯定阈值或者工作完结时,治理端回收该资源,当该用户再次公布计算工作时,从新为其任务分配GPU资源;
2)负载平衡:当部分计算压力过大时,调整计算负载,通过动静调度时抉择适合的GPU资源来扩散计算负载;
3)故障复原:当呈现故障时,将工作转移到新的可用GPU资源上。