GPU虚拟化

上一篇文章,讲解了计算虚拟化之CPU虚拟化和内存虚拟化。而GPU从某种意义上来讲,其作用也是用于计算,只不过同CPU应用用于通用计算相比,GPU则主要用于对图形和图像要求较高的场景,比如高清视频编解码、3D游戏、物理仿真等。本篇带领大家了解一下GPU虚拟化技术。

GPU虚拟化

GPU技术在芯片行业中也如同CPU技术一样快速发展,而且越来越多的用户开始部署虚拟桌面方案。因此将GPU技术与虚拟化技术融合,是近年来虚拟化行业中比较热门的技术课题,通过此种方式,将大大降低图形图像用户的使用成本以及提高数据的处理效率和数据安全性。所谓GPU虚拟化,就是将一块GPU卡的计算能力进行切片,分成多个逻辑上虚拟的GPU,即vGPU,以vGPU为单位分配GPU的计算能力。以vGPU为单位可以将单块GPU卡分配给多台虚拟机使用,使得虚拟机能够运行3D软件、播放高清视频等,极大地提升了用户体验。

目前GPU虚拟化主要有如下几种技术:

Device Simulation

API Forwarding

GPU Pass-Through

Full GPU Visualization


Device Simulation

Device Simulation

设备模拟直接将设备分配给指定的虚拟机。采用类似于CPU虚拟化中二进制转换方法进行模拟。但相对于CPU,GPU的特性复杂,不同的设备提供商之间的GPU规格区别很大,GPU的资源很难被拆分,模拟的效率低。因此,典型的QEMU软件仅模拟了VGA设备的基本功能,它通过一个半虚拟化的图像缓冲区来加速特定的2D图像访问,不符合高效、共享的虚拟化要求。由于设备模拟没有一个确定的机制能使虚拟机进行访问图形硬件的能力,因此这些虚拟的显示设备都是通过使用CPU以及内存的方式对图形数据进行相应处理。

API Forwarding

API Forwarding

API转发将图形指令如OpenGL从客户虚拟机转发到虚拟机监视器VMM中,实现虚拟化环境下GPU的共享。该方法目前被广泛应用在VMWare和VirutalBox等软件中。基于Chromium的VMGL和Oracle的VirtualBox,采用定制过的OpenGL库来替换原有的OpenGL库,将虚拟机中的OpenGL指令转发到虚拟机监视器中去执行。针对GPU运用于通用计算,rCUDA、vCUDA和gVirtuS、都采用转发CUDA和OpenGL的指令来解决虚拟化环境下运行GPU通用计算程序的问题。然而API转发受限于平台,例如Windows采用的接口是DirectX,不兼容于OpenGL或CUDA。因此,一个Linux主机就不能执行Windows客户机转发过来的DirectX命令。同时由于API转发引起大量的上下文切换,性能损失较大。

GPU Pass-Through

GPU Pass-Through

显卡穿透(pass-through)也叫显卡直通,是指绕过虚拟机管理系统,将GPU单独分配给某一虚拟机,只有该虚拟机拥有使用GPU的权限,这种独占设备的方法分配方式保存了GPU的完整性和独立性,在性能方面与非虚拟化条件下接近,且可以用来进行通用计算。但是显卡直通需要利用显卡的一些特殊细节,同时兼容性差,仅在部分GPU中设备可以使用。同时GPU透传只能将GPU分配给一台虚拟机使用,无法在多台虚拟机间共享,其他虚拟机无法使用到GPU提供的计算能力。由于显卡直通实际上是由客户操作系统使用原生驱动和硬件,缺少必要的中间层来跟踪和维护GPU状态,它不支持实时迁移等虚拟机高级特性。

Full GPU Visualization

Full GPU Visualization

显卡虚拟化就是将显卡进行切片,并将这些显卡时间片分配给虚拟机使用的过程。由于支持显卡虚拟化的显卡一般可以根据需要切分成不同的规格的时间片,因此可以分配给多台虚拟机使用。GPU全虚拟化允许虚拟机直接访问对性能敏感的资源(如GPU访问显存),基本解决直通和共享的矛盾。比如类似于IO虚拟化的SR-IOV技术,通过影子页表隔离每个虚拟GPU的访问空间,从而大多数的命令执行会不受虚拟机监控器的干预,因此虚拟GPU就可以获得接近非虚拟化情况下的性能。

不同的显卡厂商,其全虚拟化的实现方式不同。比如AMD在其最新的GPU上采用了SR-IOV(单根虚拟化)技术来实现;Intel则采用KVMGT技术来实现,Nvidia采用了GPUvm/GRID技术来实现。

推荐阅读更多精彩内容