首页 > 其他分享 >GPU实现虚拟化

GPU实现虚拟化

时间:2023-10-23 15:37:26浏览次数:42  
标签:VF 虚拟化 实现 IOMMU VM host GPU 设备

GPU 虚拟化 [一]

GPU 虚拟化 [一]

兰新宇 兰新宇 talk is cheap  

对于 GPU 这样的高速 PCIe 设备,虽然也可以借助 virtio 的方式来实现 guest VM 对 GPU 资源的共享,但因为需要 hypervisor 参与 emulation,效率不高。性能更佳的方案是将物理 GPU 以整体或部分的形式,“透传”给 VM。

独吞

先来说整体 pass-through 的方案,也就是将一整个物理 GPU 完全划给一个 guest VM 使用。这是图啥呢,这还能叫虚拟化么?

有种情况是一台机器有多个物理 GPU,也运行了多个 VM,分一分正好,互不影响。即便一台机器只有一个物理 GPU,整体 pass-through 也可以带来如下好处:

一是在 VM 里面做 GPU 驱动的一些实验,这样即便 driver 不小心把内核弄 crash 了,那也只是导致虚拟机 hang 住,重启 VM 可比重启物理机快捷多了。

二是可以测试 GPU 卡 hotplug 时对应驱动的加载情况,这比在物理机上真正的“热插拔”也方便多了。那怎么对 VM 实施设备的 hotplug 呢?

以 libvirt 管理的 VM 为例,编辑下面这样一段描述设备的 xml 文件(假设命名为 "gpu-pt.xml"):

<hostdev mode='subsystem' type='pci' managed='yes'>
 <source>
  <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
 </source>
</hostdev> 

然后把该设备动态地 assign 给正在运行的 VM:

virsh attach-device --file gpu-pt.xml --live <gvm-name>

接下来在 VM 里 "lspci" 就可以看到这张 GPU 卡了。

上述 xml 文件里的 "bus", "slot", "function" 基本就等同于 PCIe 设备的 BDF 号,而 "managed=yes" 表示 VM 启动时,libvirt 会自动将这张 GPU 卡与 host driver 解绑,然后绑定 vfio-pci 驱动。

有意思的是,虽然此时这张 GPU 卡已经 assign 给 VM 了,但在 host 上还是可以看到它,但是 host 不能再使用它了。如果想切换给 host 使用(交回 GPU 卡的控制权),需要先 virsh detach 移除这个设备,然后 unbind 掉 之前绑定的 vfio-pci 驱动。

这里 libvirt/qemu 所使用的 vfio-pci 驱动【注-1】,除了可以像早期的 pci-stub 那样作为 dummy driver 阻止 host driver 占用设备,还可以借助 IOMMU Group 来实现设备的隔离(需使能 IOMMU 并开启 pt 模式【注-2】,以使用 VT-d 的 Intel CPU 为例,在内核启动参数中加入"intel_iommu=on iommu=pt")。

IOMMU Group 是将设备分配给 VM 的最小单位,即一个 Group 内的设备必须 pass-through 给同一个 VM。比如下图红框部分(或使用 "find /sys/kernel/iommu_groups/ -type l" 命令):

分享

再来说说部分 pass-through 的方案。

如果一个 GPU 本身支持 SR-IOV 的话,那么现实中更常用的方式是利用 PCIe 提供的 SR-IOV 特性,从硬件上将物理 GPU 资源进行一定的划分,形成 PF (Physical Function) 和 VF (Virtual Function)

一张 GPU 卡内部包含多个 engine,比如用于地址翻译的 GpuMmu,用于数据拷贝的 DMA,以及一些视频/图形的编解码 IP。假设 DMA 引擎包含 8 个 channels,GpuMmu 包含 4 个地址转换单元,那么可以生成 4 个 VF,一个 VF 包含 1 个 MMU 单元和 2 个 DMA channel。

VF 可视作一个独立的设备,在 PCIe 里,有一种特性叫做 FLR (Function Level Reset),就是可以在 VF 的级别做复位。VF 除了能透传给 VM 使用,也可供 host 上的 container 使用(对应为 Application)。

为什么要叫 function 呢?这可能和 BDF 的命名有关,同一物理设备划分出的不同 VF 共享相同的 Bus 和 Deivce 编号,但拥有不同的 Function 编号。

SR-IOV 这种固定的划分方式,灵活性似乎差了点,有没有更 flexible 的方案呢?请看下文分解。

 

注-1:需要系统中包含 vfio-pci.ko 驱动文件,如果在 "/lib/modules" 路径下找不到,可以看下是不是已经被编译进内核了,一种方法是查看内核配置的 config 文件,另一种是查看 "modules.builtin" 文件

注-2:IOMMU 概况起来主要有两个功能:translation 和 isolation。IOMMU 的 pt 模式侧重于 isolation(比如 IOMMU group),而 bypass 了 DMA Remapping 功能(但保留了 Interrupt Remapping)。

 

参考:

 

原创文章,转载请注明出处。

标签:VF,虚拟化,实现,IOMMU,VM,host,GPU,设备
From: https://www.cnblogs.com/wcxia1985/p/17782575.html

相关文章

  • 显卡虚拟化使用及配置技术
    http://www.360doc.com/content/18/0814/21/9824753_778296481.shtml将GPU技术与虚拟化技术融合,是近年来虚拟化行业中比较热门的技术课题,通过此种方式,将大大降低图形图像用户的使用成本以及提高数据的安全性。接下来我们将了解显卡虚拟化使用及配置技术。  一、简介本......
  • vmvare 17 gpu 虚拟化 vmware workstation gpu虚拟化
    https://blog.51cto.com/u_12959/6296111?articleABtest=0  虚拟化(KVM)虚拟化介绍:VMwareWorkstation就是虚拟化虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源关键词Hypervisor(VMM......
  • vmware 显卡虚拟化 vmware gpu虚拟化
    https://blog.51cto.com/u_12959/6296111?articleABtest=0一、问题由于需要玩一下OpenNebula,但是现在自己只有一台笔记本,如何玩?当然是VMVare了,于是装了几台Ubuntu的虚拟机,但是在看安装OpenNebula的前提要求是安装的主机cpu必须支持虚拟化,于是我用了命令查看cpu是否支持虚拟化c......
  • linux cat查看文件使用grep实现多条件多场景过滤
    在实际应用过程中,我们查看日志文件时,经常会根据一定自定义的词语过滤,查看所有相关的数据行。最近遇到用cat查看文件,需要根据多关键词进行不同的场景过滤,在这里进行一个简单的总结:1.过滤多个关键词同时存在catfile.log|grep-e'关键词1'|grep-e'关键词2'#或者grep-......
  • POI实现,两个Excel里重复字段去重,之后写到另一个Excel(代码库)
    importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.lang3.StringUtils;importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;importorg.apache.poi.ss.usermodel.*;importorg.jetbrains.annotations.NotNull;import......
  • javascript类的继承的实现
    首先需要知道两个概念:构造函数的prototype属性是实例的原型,这个属性的值是一个对象,可以被重新赋值,比如有时候为了简便会把prototype属性重新赋值为一个对象字面量;每个对象都有一个__proto__内部属性,指向自己的原型,虽然是非标准的,但是各大浏览器都实现了他,在mdn文档中提到的[[Pr......
  • Windows11 实时字幕如何实现实时翻译?
    Windows11实时字幕如何实现实时翻译?引言 2023年6月27日Windows11更新新增实用功能!此更新添加了以下语言的实时字幕:中文(简体和繁体)法语(法国、加拿大)German意大利语日语葡萄牙语(巴西、葡萄牙)Spanish丹麦语英语(爱尔兰,其他英语方言)韩......
  • 软件设计之C/S结构连接数据库实现登录功能
    界面展示具体代码//DBUtil.javapackageorg.example;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;publicclassDBUtil{publicstaticConnectiongetConnection()throwsClassNotFoundException,SQLException......
  • 《玩转翻译》实战连载№2:如何批量实现多语言翻译的格式对齐?
    《玩转翻译》实战连载№2:如何批量实现多语言翻译的格式对齐?引言 生活和工作很多时候都会遇到翻译的情况,如果是几个单词或几句话,则有很多途径可以实现翻译。但如果需要翻译的词汇量比较大、句子、段落比较多,又需要保持原先的格式或者保持行或段落,如何解决? 一般的方法,可能会......
  • vm怎么开启GPU虚拟化
    vm怎么开启GPU虚拟化 原创mob64ca12ecf3b42023-08-1616:26:00©著作权文章标签虚拟化驱动程序加载文章分类虚拟化云计算阅读数453在VM中开启GPU虚拟化方案问题描述虚拟机(VM)是一种常见的虚拟化技术,它允许在一台物理计算机上运行多个独立的操作系统实例。然而,虚拟机通......