GPU虚拟化的评价标准
4个主要指标用于评价GPU虚拟化的方法:
- 性能(performance)
- 保真度(fidelity)
- 资源复用(multiplexing)
- 是否支持虚拟化的特性(interposition)
其中性能和保真度强调减小GPU虚拟化的代价,性能是指执行操作的速度,保真度是指支持多少GPU提供的特性,以及对这些特性的支持的质量。资源复用以及是否支持虚拟化的特性则强调虚拟化为我们带来价值。资源复用是指能够使多台虚拟机共享同一个物理GPU的能力,资源复用要求虚拟机之间的安全隔离,GPU资源复用提高了GPU资源利用率,在保持虚拟机内GPU性能不下降的情况下,复用一个GPU的虚拟机越多,对应的GPU虚拟化方案越符合资源复用的要求。是否支持虚拟化的特性是指GPU虚拟化的方案是否能支持虚拟化技术提供的虚拟机与物理机之间的中介过程,如要求虚拟机创建系统还原点,或者挂起,以及更加高级的特性,如热迁移、可容错执行等。这些标准经常是相对的,比如要提升性能,就需要牺牲虚拟化的其他特性。
GPU虚拟化技术的实现策略分类
GPU虚拟化的目标是为虚拟机提供虚拟GPU设备的支持,使得虚拟机内部调用的与GPU相关的指令或者与GPU相关的API(比如OpenCL或者CUDA)能够正常得执行。
为了提升GPU虚拟化的性能,虚拟机需要利用GPU硬件来实现加速,也就是说虚拟机内部调用的GPU相关的命令或者GPU相关的API,能够在硬件GPU上运行。所有GPU虚拟化技术的实现策略以及GPU虚拟化技术的发展都围绕着这一目标。
下面列举了四种GPU虚拟化技术的实现策略,按照利用GPU硬件加速的程度从小到大分别为分为设备模拟(Device Emulation)、API转发(API Forwarding)、中介传递(Mediated Pass-through)和直接传递(Direct Pass-through也被称为Fixed Pass-through),如图所示。
下面对这四种实现策略分别介绍:
设备模拟(Device Emulation)
设备模拟是指通过软件的方法来为虚拟机模拟GPU设备,这种方法的好处是虚拟机内部都可以调用GPU命令,可以完全记录GPU设备的状态,保证虚拟化技术的全部特性,满足四个标准中的资源复用和支持虚拟化特性的标准。QEMU 通过软件模拟实现了传统的VGA设备,但是该设备的性能很低,只能支持基础的功能。软件模拟设备的方法几乎不会使用硬件加速,因此其实现的GPU性能已经无法满足现在虚拟机的图形图像处理和高性能计算的需求。而且正如前文提到的,现代GPU架构具有很高的复杂性,而且缺少文档,因此很难实现对一个真实的物理GPU进行软件模拟。这意味着设备模拟方法只能模拟少量的API,只能保证少量的GPU特性提供给虚拟机。由于设备模拟的方法在性能和支持的GPU特性上和真实的GPU相差过大,设备模拟的技术已经不再应用到GPU虚拟化技术中。
API转发(API Forwarding)
API转发是指通过实现包裹图形API的库,这些库在虚拟机调用相关的API时,将这些图形API通过远程过程调用的方法转发到主机上,然后调用主机上的图形驱动提供的API支持完成调用。通过给高层的API实现包裹库,客户机就能支持高层的API如CUDA。vCUDA、vGRIS等虚拟化方案都是利用API转发的方法。这种方法的优点是利于实现,而且一定程度上利用了GPU硬件实现加速,同时可以使多个虚拟机调用的GPU相关指令与API在物理GPU上执行。但是API转发的主要问题在于这种方法失去了语言和库的灵活性选择,包裹库和支持的API的不匹配会造成GPU虚拟化不成功。而如果在迁移的过程中,目标主机与源主机的包裹库版本不一致,可能会造成迁移之后GPU虚拟化不成功,因此API转发会影响虚拟化提供的特性。
中介传递(Mediated Pass-through)
GPU已经可以支持多个独立的上下文,中介传递的方法使虚拟机只占用这些上下文的一个或者子集。高带宽操作(指令缓存提交、帧缓存提交)需要使用映射到物理GPU的内存或者MMIO资源,低带宽操作(资源分配、传统的特性)可能会通过使用全虚拟化的资源来实现。目前Intel集成GPU主流的虚拟化方案gVirt和GPUvm使用的方法都是中介传递。
直接传递(Direct Pass-through)
直接传递是指给一台虚拟机使用一个物理GPU的全部访问权限。Intel提供了Intel VT-d硬件辅助技术,使研究者不需要去了解GPU的编程接口就可以直接实现一台虚拟机占用物理GPU的全部访问权限。这种方法的好处在于可以提供与真实机器相近的性能以及保真度,亚马逊的Amazon EC2提供的GPU资源就是使用这种虚拟化策略。但是这种方法问题在于一个物理GPU只能被一台虚拟机使用,牺牲了GPU资源在多台机器之间共享的条件。而且虚拟化的迁移功能也会受到影响,因为不同体系架构的GPU之间可能存在不兼容。
全虚拟化与半虚拟化
GPU虚拟化实现策略按照是否需要修改客户机操作系统内部的驱动代码分为GPU全虚拟化和GPU半虚拟化。GPU全虚拟化是指实现在多个虚拟机之间共享GPu资源的同时不需要修改虚拟机内部的图形驱动。GPU半虚拟化是指向虚拟机提供软件实现的理想设备模型,对客户机的图形驱动进行底层的控制。使用GPU半虚拟化的方法,比API转发的性能消耗更小,但是客户机的设备驱动必须要改写。主流的GPU虚拟化方案GPUvm使用半虚拟化的实现策略对虚拟机GPU的性能有明显的改善。