文章内容大程度参考B站王利明老师对《GPU虚拟化技术分享》的演讲:https://b23.tv/uQKBpcK
GPU 有什么用?
GPU可以用于图形渲染,也能够用于高性能计算和编解码等场景。
图:GPU 的典型软件架构(不含虚拟化)
GPU 虚拟化是什么?
虚拟化使用软件在计算机硬件上创建抽象层,能够将单个计算机的硬件元素(包括处理器、内存、存储器等)分成多个虚拟计算机,通常称为虚拟机 (VM)。
GPU虚拟化是系统软硬件模拟 GPU 资源,支持虚拟机方案。
为什么要GPU虚拟化?
资源共享的需求:GPU性能越来越强大,需要多租户(多容器和多虚机)共享资源。应用场景如多屏车机、本地桌面虚机、远程桌面/VDI、云GPU虚机
资源隔离的需求:QoS。要保证多租户互不影响,应用场景如显存隔离、算力隔离、故障隔离。
GPU虚拟化技术实现
- API 拦截和 API forwarding
- GPU 驱动拦截
- GPU 驱动半虚拟化:Para Virtualization
- 硬件虚拟化:Virtualization
- SRIOV:Single Root I/O Virtualization
- Nvidia MIG:Multi-Instance GPU
用户层虚拟化
本地 API 拦截和 API forwarding
- 在用户态实现一个函数库,假设叫 libwrapper ,它要试下底层库的所有 API
- 让 APP 调用这个 libwrapper
- libwrapper 拦截用户的函数调用,对函数进行解析,然后使用参数去调用实际的底层库相同名称的函数
- 调用完成后,libwrapper 把结果返回给 APP
远程 API forwarding
- libwrapper 通过网络,去调用不同机器上的底层库
- libwrapper 变成两部分,client 用于转发,和 server 用于接收和调用
- 可以实现 GPU 池化(即多个 GPU 可以组成调用池,由多个 client 来调用),可以做到不具备 GPU 的机器能实现 GPU 的功能
半虚拟化 API forwarding
- APP 和 libwrapper 运行在虚机中
- libwrapper 通过半虚拟化方式(virtio)进行通讯,调用宿主机的底层库
- 虚机的内核要实现 virtio frontend
- 宿主机的 hypervisor 实现 virtio backend
- 宿主机完成底层库的调用
GPU 驱动半虚拟化
- APP 和底层库都在虚机里
- 虚机的 GPU 驱动实现半虚拟化接口,通过类似 hypercall 的方式,调用宿主机实际的 GPU 驱动
- hypercall 切换 guest 到 hypervisor, hypervisor 通过内核中的驱动代理来访问实际的 GPU 驱动
车机中的 GPU 虚拟化
基于 type 1 的 hypervisor 虚拟化技术,支持多个 Guest。
硬件虚拟化基础
- 支持 CPU 和内存的硬件虚拟化
- 支持 IOMMU
全虚拟化(Full Virtualization)
- 虚机的 GPU 驱动,不需要做任何修改,基本上访问的是真实的硬件资源
- 整个 GPU 透传给虚机,性能损耗最小
- 因为无法实现 GPU 资源共享,一般认为不属于GPU 虚拟化