揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU( 二 )


  • 1998 年,VMWare 公司成立,采用 Binary Translation 方式,实现了系统虚拟化 。
  • 2001 年,剑桥大学 Xen Source,提出了 PV 虚拟化(Para-Virtualization),亦即 Guest-Host 的主动协作来实现虚拟化 。
  • 2005 年,Intel 提出了 VT,最初实现是安腾 CPU 上的 VT-i (VT for Itanium),很快就有了 x86 上的 VT-x 。
  • 2007 年,Intel 提出了 VT-d (VT for Device),亦即 x86 上的 IOMMU 。
  • 2008 年,Intel 提出了 EPT,支持了内存虚拟化 。
  • 2010 年,Linux 中的 PV Hypervisor lguest 的作者,Rusty Russell(他更有名的作品是 iptables/netfilter),提出了 VirtIO,一种 Guest-Host 的 PV 设备虚拟化方案 。
应该可以说,在 PV 时代和 Binary Translation 时代,虚拟化是危险的 。只有当 VT 在硬件层面解决了 CPU 的隔离、保证了安全性之后,公有云才成为可能 。VT-x 于 2005 ~ 2006 年出现,亚马逊 AWS 于 2006 年就提出云计算,这是非常有远见的 。
系统的三个要素: CPU,内存,设备 。CPU 虚拟化由 VT-x/SVM 解决,内存虚拟化由 EPT/NPT 解决,这些都是非常确定的 。但设备虚拟化呢?它的情况要复杂的多,不管是 VirtIO,还是 VT-d,都不能彻底解决设备虚拟化的问题,这些我们稍后还会谈到 。
除了这种完整的系统虚拟化,还有一种也往往被称作「虚拟化」的方式: 从 OS 级别,把一系列的 library 和 process 捆绑在一个环境中,但所有的环境共享同一个 OS Kernel 。
严格来说,这种容器技术,和以 KVM 为代表的系统虚拟化,有着本质的区别 。随着容器的流行,「虚拟化」这个术语,也被用来指称这种 OS 级别的容器技术 。因此我们也从众,把它也算作虚拟化的一种 —— 只不过为了区分,称之为「OS 虚拟化」 。
这种 OS 虚拟化最初于 2005 年,由 Sun 公司在 Solaris 10 上实现,名为「Solaris Zone」 。Linux 在 2007 ~ 2008 开始跟进,接下来有了 LXC 容器等;到了 2013 年,Docker 横空出世,彻底改变了软件分发的生态,成为事实上的标准 。
2.3 GPU 虚拟化的谱系2.3.1 作为 PCIe 设备的 GPU不考虑嵌入式平台的话,那么,GPU 首先是一个 PCIe 设备 。GPU 的虚拟化,还是要首先从 PCIe 设备虚拟化角度来考虑 。
那么一个 PCIe 设备,有什么资源?有什么能力?
2 种资源:
  • 配置空间
  • MMIO
  • (有的还有 PIO 和 Option ROM,此略)
2 种能力:
  • 中断能力
  • DMA 能力
一个典型的 GPU 设备的工作流程是:
  1. 应用层调用 GPU 支持的某个 API,如 OpenGL 或 CUDA
  2. OpenGL 或 CUDA 库,通过 UMD (User Mode Driver),提交 workload 到 KMD (Kernel Mode Driver)
  3. KMD 写 CSR MMIO,把它提交给 GPU 硬件
  4. GPU 硬件开始工作... 完成后,DMA 到内存,发出中断给 CPU
  5. CPU 找到中断处理程序 —— KMD 此前向 OS Kernel 注册过的 —— 调用它
  6. 中断处理程序找到是哪个 workload 被执行完毕了,...最终驱动唤醒相关的应用
2.3.2 PCIe 直通我们首先来到 GPU 虚拟化的最保守的实现: PCIe 设备直通 。
如前述,一个 PCIe 设备拥有 2 种资源、2 种能力 。你把这 2 种资源都(直接或间接地)交给 VM、针对这 2 种能力都把设备和 VM 接通,那么,VM 就能完整使用这个 PCIe 设备,就像在物理机上一样 。这种方案,我们称之为 PCIe 直通(PCIe Pass-Through) 。它只能 1:1,不支持 1:N 。其实并不能算真正的虚拟化,也没有超卖的可能性 。
VM 中,使用的是原生的 GPU 驱动 。它向 VM 内核分配内存,把 GPA 填入到 GPU 的 CSR 寄存器,GPU 用它作为 IOVA 来发起 DMA 访问,VT-d 保证把 GPA 翻译为正确的 HPA,从而 DMA 到达正确的物理内存 。
PCIe 协议,在事务层(Transaction Layer),有多种 TLP,DMA 即是其中的一种: MRd/MWr 。在这种 TLP 中,必须携带发起者的 Routing ID,而在 IOMMU 中,就根据这样的 Routing ID,可以使用不同的 IOMMU 页表进行翻译 。
很显然,PCIe 直通只能支持 1:1 的场景,无法满足 1:N 的需求 。
2.3.3 SR-IOV那么,业界对 1:N 的 PCIe 虚拟化是如何实现的呢?我们首先就会想到 SR-IOV 。SR-IOV 是 PCI-SIG 在 2007 年推出的规范,目的就是 PCIe 设备的虚拟化 。SR-IOV 的本质是什么?考虑我们说过的 2 种资源和 2 种能力,来看看一个 VF 有什么: