虚拟化界的强强联手:VirtIO与GPU虚拟化的完美结合

近距离了解 VirtIO 和 GPU 虚拟化

  

这是一篇 Linaro 开发团队项目组的科普文章。我们在处理器虚拟化项目中,经常会遇到 VirtIO 相关的问题;比如运行 Andriod 系统的时候需要运行 VirtIO 组件。‍‍‍随着 Cassini 项目和 SOAFEE(嵌入式边缘可扩展开放架构)等项目的开发,VirtIO 成为支持基于标准的云原生边缘开发/部署环境的关键构件,旨在实现这些高效的 EDGE 开发环境。GPU 虚拟化是 VirtIO 中较为复杂的组件之一。

本文将讨论其中的一些挑战以及 Linaro 开发团队在这一领域取得的进展。基于VirtIO的块和网络设备是相对简单的抽象,可以很好地映射到底层硬件。这些设备经过多轮优化,最大限度地减少了虚拟化开销。由于硬件种类繁多,图形处理器(GPU)更难抽象化。在简单的 2D 图形时代,任何特定的硬件都只能支持特定范围的内存布局和色深。随着技术的发展,图形引擎获得了复制内存区域、管理精灵或旋转纹理等各种不同的能力。随着 3D 技术的出现,情况并没有变得更简单。

现代 GPU 实际上是一种特殊用途处理器,经过优化后可以执行渲染现代场景所需的大量并行计算。很多现代超级计算机都以这些数字运算流水线为核心,这并不奇怪。然而,与大多数 CPU 不同的是,GPU 执行模型的细节往往不为用户所知。通常情况下,GPU 要么使用更高级别的 API 进行编程,然后由专有的二进制 Blob 将其翻译成秘密的隐藏指令流,再输送到 GPU。虽然有许多开放的 GPU 编程 API,旨在实现 GPU 之间的可移植性,但也有与特定硬件绑定的供应商专用库。所有这些都使得 GPU 虚拟化成为一个特别具有挑战性的领域。可以使用的方法大致有两种:虚拟函数和 API 转发。89f75f285230010ce75a67502e9413ab.jpeg
虚拟功能

这种方法与其他高性能虚拟化硬件的做法类似,都是将单个物理卡划分为多个虚拟功能(VF)。然后,每个 VF 都可以与访客共享,访客可以直接驱动它,就像作为主机运行一样。在服务器领域,主要 GPU 厂商(英特尔、AMD、nVidia)的高端 GPU 卡都支持 SR-IOV。它使用成熟的 PCI 分区在客户机之间划分 VF。然而,面向汽车和工业市场的 GPU 面临两个挑战:
- VF 数量较少(可能只有 2 个,需要抽象化)- 平台特定的分区方案市场上支持 VF 分区的 GPU 仍然相当罕见,而且现有的 GPU 通常只支持有限的分割,这意味着仍然需要一个完全抽象的虚拟 GPU 来复用多个有图形需求的客户。由于这些设备通常是平台设备(即直接映射内存,而非 PCI 设备),因此需要在固件、平台和驱动程序之间协调,才能支持这些 VF 的分配。从简洁抽象的角度来看,这使得问题变得更加复杂。
软件辅助虚拟功能为了解决这些限制,我们采用了各种软件辅助方法来弥补纯硬件支持的不足。其最初形式是一种名为 "中介设备"(mdev)的扩展,在硬件允许的情况下,它允许主机内核对设备进行分区。目前,支持该功能的内核驱动程序只有英特尔 i915 驱动程序和一个 s390 加密驱动程序。

d13f3aa9412403eb7aedc652b7547235.jpeg

利用 virtIO-gpu 的扩展(本地上下文)优化 GPU 虚拟化。
此方法:
- 利用 VirtIO 机制实现常用功能
- 直接向客户机提供原生上下文
- 客户机运行经过修改的原生 GPU 驱动程序,支持:
- VirtIO 感知
- 针对特定 GPU 的自定义协议


应用程序接口转发GPU 虚拟化的另一种方法是 API 转发。它的工作原理是为客户提供一个理想化的虚拟硬件,该硬件与共享库抽象的要求密切相关。VirtIO GPU 最初的 3D 加速基于 OpenGL。

该设备提供了一个名为 VirGL 的虚拟 OpenGL 设备,它基于 Gallium3D 接口。这样,访客只需向设备输入一系列 OpenGL 命令和通用的独立于 GPU 的着色器中间语言。在后端,这些命令被输入 virglrenderer,然后通过主机 GPU 进行渲染。1309ab8268ed3121a4429514d97e8bcb.jpeg对 VirGL 方法的主要不满在于效率。虽然可以运行流畅的桌面体验,但性能却远低于直接在主机上运行的预期。其中一个原因可能是古老的 OpenGl 编程模型与现代 GPU 的编程方式相比过于抽象。再加上不可避免的虚拟化开销,加剧了其性能问题。为了取代 OpenGL,我们开发了一种名为 Vulkan 的更现代的 API,它是一种更低级的编程 API,更贴近现代图形硬件的工作方式。它还将图形与计算工作流(GPUS 的一个重要用例)统一在一个 API 下。

虽然虚拟 GPU 对 Vulkan 的支持尚未在 QEMU 等项目中实现,但一些替代虚拟机监控器(VMM)能够使用这种模式提供更高效的虚拟 GPU 实现。最后还有第三种协议,即 Wayland 协议,它并不直接针对 GPU,而是用于与支持 3D 的显示服务器进行对话。这样,在客户机中运行的客户程序就能与主机显示管理器无缝集成。最初的用例是让 CrosVM 客户端中的 Linux 应用程序与 ChromeOS 主机集成。有趣的是,该协议还针对车载娱乐系统进行了扩展。
两种方法的比较对于那些希望通过保持尽可能轻量级的抽象来尽可能提高图形硬件性能的用户来说,虚拟函数似乎是未来的发展方向。此外,通过将复杂的图形栈隔离在客户域库中,还可以降低开发风险,这也是一个很好的安全论据。GPU 就其本质而言,必须处理大量不受信任的访客数据。

不过,这种直通方法也有一些缺点。在云原生开发中,最大的问题是将客户代码绑定到特定的 GPU 架构上,这意味着云和边缘部署之间的可移植性较差。此外,对于 Linaro 这家主要使用开源技术的公司来说,增加支持需要访问遍布整个堆栈的专有代码,而不是处理开源抽象。我们认为,通过使用 Rust 等更安全的语言编写 VirtIO 后端,图形堆栈的一些安全问题可以得到改善。 但需要注意的是,大部分后端最终仍将使用普通 C 语言库进行处理。要降低特权主机被攻击的风险,一种方法是将图形后端转移到单独的虚拟机(有时称为驱动域)中。这样,如果守护进程被攻破,攻击者仍会被控制在一个相对有限的环境中。d476dcb33f320b0788718e014936f853.jpeg

与 Orko 项目的关系

Orko 项目是我们之前的虚拟化项目 Stratos 的精神继承者。我们正在努力将一些 VirtIO 设备集成到 SOAFEE 参考平台中,以加快其应用。多媒体是汽车工作负载的主要驱动力,因此拥有一个实用的 GPU 解决方案非常重要。最初有两项工作计划用于支持 GPU。

衡量抽象成本

虽然有一些关于 VirGL 在某些系统上的性能的轶事,但我们还没有看到对这些抽象在 ARM 硬件上的成本进行全面测量。我们想知道这些较新的图形管线是否可用于处理像运行 AAA 级游戏一样的繁重工作负载,而不会产生过多的开销。

对于 QEMU,有几个小组提出了各种补丁,通过各种扩展来增强 virtio-gpu 设备。我们打算在帮助审查的同时,将这些补丁与 QEMU 最近的 xenpvh 支持集成,并开始在实际硬件上测量每个抽象的成本。我们还想探索使用 CrosVM Wayland 后端(它在引擎盖下使用 vhost-user),看看与 QEMU 的 xenpvh 模式和我们的 Xen vhost-user 前端集成有多少工作量。
独立的 virtio-gpu 守护进程

虽然我们在 SOAFEE 平台中使用 QEMU 来帮助启动 VirtIO 设备,但我们的愿景仍然是利用 rust-vmm 组件,使用 Rust 编写独立于管理程序的独立守护进程。独立守护进程之所以有用,还有很多其他原因:

  • 通过 rust-vmm 特质和 vhost-user 扩展,我们隐藏了 Xen 中映射内存和通知的底层实现,实现了跨管理程序的抽象层。这种方法简化了管理程序的交互,并提高了虚拟机管理的灵活性。
  • 如果没有独立于核心 VMM 的后端,我们就无法尝试我之前讨论过的驱动域概念


最好的办法是扩展 CrosVM 的 Wayland 实现以支持其他 GPU 命令流,还是从头开始编写一个新的后端,还有待观察。我们目前正在进行准备工作,测量各种抽象的开销,以帮助我们了解未来的发展方向。 

-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HFSS学习-day1-T形波导的内场分析和优化设计

入门实例--T形波导的内场分析和优化设计 HFSS--此实例详细步骤1.创建项目2.设置求解类型3.设置与建模相关的一些信息设置默认的建模长度单位 4.创建T形模型的三个臂基本参数端口激励进行复制 5.创建被挖去的部分设置正确的边界条件和端口激励方式添加求解设置添加扫频项检查一下…

大模型_基于医疗领域用lora微调ChatDoctor模型

文章目录 ChatDoctor目标方法结果结论收集和准备医患对话数据集创建外部知识数据库具有知识大脑的自主聊天医生的开发模型培训结果数据和模型: 微调推理 ChatDoctor 目标 这项研究的主要目的是通过创建一个在医学建议中具有更高准确性的专业语言模型,来…

【毕业设计】基于SSM的运动用品商城的设计与实现

1.项目介绍 在这个日益数字化和信息化的时代,随着人们购物习惯的转变,传统的实体商店已经无法满足人们日益增长的在线购物需求。因此,基于SSM(Spring Spring MVC MyBatis)框架的运动用品商城项目应运而生&#xff0…

最原理的一集——Mathtype公式编号设置(Mathtype7.8+Word)

版本 Mathtype7.8Office2019 Word 读完本文你将会 随心所欲,想怎么给公式编号就怎么给公式编号,想从(X.1)开始,就从(X.1)开始大概了解Mathtype公式设置原理给作者点赞 如果你想自己跟着文章做的话 请不要在自己的论文里边直接操作&#…

【6D位姿估计】数据集汇总 BOP

前言 BOP是6D位姿估计基准,汇总整理了多个数据集,还举行挑战赛,相关报告被CVPR2024接受和认可。 它提供3D物体模型和RGB-D图像,其中标注信息包括6D位姿、2D边界框和2D蒙版等。 包含数据集:LM 、LM-O 、T-LESS 、IT…

Python数据清洗与可视化实践:国际旅游收入数据分析

文章目录 概要整体流程名词解释NumPyPandasMatplotlibre 技术细节数据清洗可视化 小结 概要 在本篇博客中,我们将通过一个实际的案例,演示如何使用Python进行数据清洗和可视化,以分析国际旅游收入数据。我们将使用Python中的Pandas库来进行数…

磐石云最版本使用教程

磐石云外呼系统是一款集成了呼叫平台、电话线路和话术系统的软件,旨在提高企业的电话营销效率。以下是磐石云外呼系统的基本操作步骤: 安装和配置: 首先需要在Linux操作系统上安装磐石云外呼系统,通常需要至少4核CPU、8GB内存以及…

软件设计师-应用技术-数据库设计题2

基础知识及技巧: 1. 数据库设计过程: 四个阶段:需求分析、概念结构设计、逻辑结构设计、物理设计。每个阶段的产物: 需求分析:数据流图、数据字典、需求说明书。概念结构设计:ER模型逻辑机构设计&#xf…

设计模式之传输对象模式

在编程江湖里,有一种模式,它如同数据的“特快专递”,穿梭于系统间,保证信息的快速准确送达,它就是——传输对象模式(Data Transfer Object, DTO)。这不仅仅是数据的搬运工,更是提升系…

设置定位坐标+请按任意键继续

设置定位坐标 目的 在编程和游戏开发中,设置定位坐标的目的是为了确定对象在屏幕或游戏世界中的具体位置。坐标通常由一对数值表示,例如 (x, y),其中 x 表示水平位置,y 表示垂直位置。设置定位坐标的目的包括: 1. **精…

如何快速掌握DDT数据驱动测试?

前言 网盗概念相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离, 这样的测试脚本设计模式称为数据驱动。(网盗结束)当我们测试某个网站的登录功能时,我们往往会使用不同的用户名和密码来验证登录模块对系统的影响&#x…

软考之零碎片段记录(二十九)+复习巩固(十七、十八)

学习 1. 后缀式(逆波兰式) 2. c/c语言编译 类型检查是语义分析 词法分析。分析单词。如单词的字符拼写等语法分析。分析句子。如标点符号、括号位置等语言上的错误语义分析。分析运算符、运算对象类型是否合法 3. java语言特质 即时编译堆空间分配j…

引领智算变革,九章云极DataCanvas公司激活油气行业新质生产力

近日,“2024中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛”在京成功举办,九章云极DataCanvas公司携“油气行业AI智算服务全栈解决方案”震撼亮相,为油气行业数智化转型和新质生产力发展提供领先的技术视角和前瞻实战经验分…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换,使用的是ucontext_t结构体,和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体,并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具,使python可在cmd(命令行窗口,WinR后输入cmd)中执行 针对 “pip不是内部或外部命令也不是可运行” 问题,需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

LLVM的ThinLTO编译优化技术在Postgresql中的应用

部分内容引用:https://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html LTO是什么? 链接时优化(Link-time optimization,简称LTO)是编译器在链接时对程序进行的一种优化。它适用于以文件为单位编译…

触摸OpenNJet,感悟云原生

小程一言 云原生使得应用充分利用云计算、容器化和微服务架构等现代技术来构建和运行应用程序。 云原生技术的用处在于提高应用程序的可靠性、可伸缩性和灵活性,加快开发和部署速度,降低成本,提升整体的效率和竞争力。通过采用云原生技术&a…

mysql使用索引。并未命中

今天在给项目看板查询语句增加索引的时候,发现了一个很有趣的问题。如下: 我这样创建索引,就可以使用,但是我另外一个查询语句,需要使用到factory_id和plan_start_date。于是我就移动了索引顺序,这样遵守左…

若依前后端分离部署nginx

1、v.sj 2、生产环境修改 3、退出登录修改 4、路由改为hash模式 5、nginx配置 location /gldhtml/ {alias D:/java/tool/nginx-1.19.6/project/jxal/html/; } location /jxal/ {proxy_pass http://localhost:8081/; }

蓝牙连接手机播放音乐的同时传输少量数据,那些蓝牙芯片可以实现呢

简介 蓝牙连接手机播放音乐的同时连接另一蓝牙芯片传输少量数据,那些蓝牙芯片可以实现呢? 这个需求,其实就是双模的需求 简单描述就是:播放音乐的同时,还可以连接ble,进行数据的传输。二者同时进行,互不…