在嵌入式虚拟化中,常遇到能移植hypervisor,能启动虚拟机,如果要显示图形界面有两种方案:
一是GPU设备透传,虚拟机加载原生图形栈
二是GPU虚拟化,其中GPU虚拟化又分为硬件辅助的GPU虚拟化和软件的GPU虚拟化
方案一不属于严格意义上的GPU虚拟化,本文主要分析方案二GPU虚拟化。
对比 |
GPU透传 |
GPU虚拟化 |
功能 |
一个GPU仅支持一个OS |
一个GPU支持多OS显示 |
性能 |
接近原生 |
弱于原生 |
1. 概述
1.1 GPU子系统分层
GPU主要用于通用计算和图形渲染。上图GPU子系统抽象了几层概念:
应用程序:调用图形API,如OpenGLES,Vulkan
底层库:图形用户态驱动,一般为GPU厂商闭源实现
内核和硬件:包括GPU硬件驱动,最底层为GPU硬件
1.2 GPU虚拟化需求
多虚拟机对GPU资源共享的需求,应用场景如:
多屏车机(IVI/Cluster共用GPU)
本地桌面虚拟机(Vmvare,Virtualbox,Qemu-kvm)
远程桌面虚拟机(云桌面多租户)
云手机
1.3 GPU虚拟化分类
根据GPU子系统实现分层,虚拟化技术也可以实现在三个层次,即用户层、内核层和硬件层:
用户层:API 拦截和 API forwarding
内核层:GPU 驱动拦截; GPU 驱动半虚拟化(Para Virtualization)
硬件层:硬件辅助虚拟化; SRIOV(Single Root I/O Virtualization); Nvidia MIG(Multi-Instance GPU)
2. 用户层
在用户态图形API函数库(如libopenglES)进行拦截和转发,可以在本地转发,也可以转发到别的系统
2.1 本地 API 拦截和 API forwarding