GPU是计算机的一个重要组成部分,但GPU这类重要资源虚拟化的性能、扩展性和可用性相对于CPU等处于滞后的阶段。例如,英特尔的GPU虚拟化解决方案gVirt中,单个物理GPU仅支持7个虚拟GPU(VGPU),而Xen支持512个虚拟CPU。2013年,亚马逊首次推出了商业化的GPU实例。2017年2月,来自于英特尔第一个GPU全虚拟化方案KVMGT才正式加入Linux内核4.10。
传统GPU虚拟化通过API转发的方式,将GPU操作由虚拟机发送到虚拟机监控器代理执行,该方法被大量主流虚拟化产品采用并支持图形处理,但并非真正意义上的完整硬件虚拟化技术,其性能和可扩展性均无法满足通用GPU(GPGPU)计算等应用(如机器学习和高性能计算)的需要。
GPU虚拟化的软件模拟方法直接将设备分配给指定的虚拟机,采用类似于CPU虚拟化中的二进制转换方法进行模拟。但相对于CPU,GPU的特性复杂,不同的设备提供商之间的GPU规格区别很大,GPU的资源很难被拆分,模拟的效率低。因此,典型的QEMU软件仅模拟了视频图形阵列(VGA)设备的基本功能,它通过一个半虚拟化的图像缓冲区来加速特定的2D图像访问,不符合高效、共享的虚拟化要求。
GPU虚拟化的设备直通方法将物理GPU指定给虚拟机独占访问。与API转发提供了良好的GPU共享能力相比,设备直通方法通过独占使用,提供了优异的性能。例如,基于英特尔的VT-d/GVT-d技术,通过翻译DMA访问的内存地址的方法,让GPU分配给一个虚拟机使用,能够达到与原生物理GPU相近的性能,但牺牲了共享特性。英伟达(NVIDIA)的Tesla GPU也提供了类似的虚拟化方案Grid,虚拟机可以通过直通的方式直接访问物理GPU。
GPU虚拟化的直通共享方法允许虚拟机直接访问对性能敏感的资源(如GPU访问显存),可基本解决直通和共享的矛盾,采用类似于SR-IOV的硬件辅助虚拟化技术,通过影子页表隔离每个虚拟GPU的访问空间,使得大多数的命令执行不受虚拟机监控器的干预,因此虚拟GPU就可以获得接近非虚拟化的性能。
由于GPU结构复杂,技术限制多,直到2014年才提出了两种针对主流GPU平台做硬件辅助的全虚拟化方案,即基于英伟达GPU的GPUvm和基于英特尔GPU的gVirt。GPUvm支持全虚拟化,也支持半虚拟化。在全虚拟化模式下运行开销比较高。在优化过的半虚拟化模式下,性能比原生系统要慢2~3倍。gVirt是第一个针对英特尔平台的GPU全虚拟化开源方案,为每个虚拟机都提供了一个虚拟的GPU,并且不需要更改虚拟机的原生驱动。
FPGA作为一种可重新配置的计算资源,与现有的虚拟化框架并不兼容。与GPU和CPU不同,FPGA的使用情景趋向于独占。一方面,不同租户可能使用不同的访问接口,难以使用统一的指令集;另一方面,即使使用统一的接口规范,在租户切换时都需要进行耗时的重新烧写和复杂的状态保存,导致了系统大量的时间和空间开销。目前FPGA器件与各自的开发生态(工具链、库等)具有紧密的耦合关系,特定器件型号的FPGA需要特定的软件支持才能生成可供烧写的二进制文件,还没有统一的二进制接口规范。
为了将FPGA集成到云平台中,从2014年起,陆续展开了FPGA虚拟化的研究。多伦多大学的斯图尔特·拜玛(Stuart Byma)等通过OpenStack在多个FPGA之间提供了部分可重构区域作为云计算资源,允许用户像启动虚拟机一样启动用户设计的或者预先定义的通过网络连接的硬件加速器。IBM中国研究院的陈非(Fei Chen,音译)等提出了将FPGA集成到数据中心的一般性框架的,并基于OpenStack、LinuxKVM、XilinxFPGA完成了原型系统,实现了多虚拟机(VM)中多进程的隔离、精确量化的加速器资源分配和基于优先级的任务调度。