mesa LLVMpipe ORCJIT 上游化:一场历时两年的后端合并马拉松,幕后英雄竟是 TA!

news/2024/9/8 7:52:22

内容来源:deepin(深度)社区


近日,mesa 开源图形驱动合并了 llvmpipe 的 ORCJIT 后端的 Merge Request (MR),并实现了对 riscv64 架构的支持。

LLVMpipe 是什么?

LLVMpipe 是 mesa 驱动中的一种软件渲染器,它不使用 GPU 硬件,而是利用 LLVM 中的 JIT 编译器,动态地将待渲染的图形相关代码转译为栅格化的数据用于显示,相对于 softpipe 而言性能更优。

饱受诟病的闭源驱动从始至终都是阻碍 riscv64 架构桌面生态的一大原罪,导致大部分 riscv64 架构的开发板的内置 GPU 完全或部分不可用,桌面发行版只能使用软件渲染作为替代方案。

然而,在很长一段时间,mesa 的 LLVMpipe 使用的 JIT 后端是老旧的、缺乏架构支持的 MCJIT,而非更新的、架构支持更加广泛的 ORCJIT。由于前者已经明确由后者替代接续,不再接受新的架构更新,这使得 mesa 在 riscv64 等架构上使用软件渲染时只能使用性能更加低下的 softpipe,最终导致桌面环境几乎无法使用,使得桌面生态遭受毁灭性的打击。

正因如此,开源社区急切地渴望在 riscv64 架构上拥有一个更快的软件渲染器。

ORCJIT 的首次尝试

时间推进到了 2022 年 7 月。一位 Alex Fan (@alexfanqi) 的开发者提交了 MR 17801,为 mesa 引入了新的 ORCJIT 后端,同时还为其加上了 riscv64 支持,这使得在 riscv64 上使用 LLVMpipe 软件渲染成为了可能。

这个 MR 并没有第一时间被合并,因为有开发者指出它没有一个开关用以在编译时切换后端、代码不够简洁需要优化、缺少着色器缓存等问题,还需要进一步优化。

从此开始,长达两年的 LLVMpipe ORCJIT 后端合并的长跑开始了。

2022 年 7 月,openEuler 社区的 RISC-V SIG 发现了这个 PR 并将其并集成,发布了一篇文章介绍了它的性能提升效果。

然而,就在 riscv64 平台的开源桌面生态即将迎来曙光的时候,世事难料,随着 mesa 开发分支的高速推进,原来的 Merge Request 缺乏维护,与主线的差异和冲突越来越大,渐渐的被淹没在冗长的 MR 列表中,逐渐被人淡忘。

社区的接力:开源软件不灭的火种

2023 年 11 月,一位名为 Yukari Chiba (@YukariChiba) 的开发者在维护自己的发行版时,遇到了同样的问题。她受够了大部分主线发行版在遇到这个问题时切换到 softpipe 的忍让态度,决定着手解决这个问题。

被尘封在 MR 列表中的 patch,再一次化作荧幕上的光芒。

11 月 1 日,@YukariChiba 在某个群组里发布了一张在飞腾派上以开启了 ORCJIT 的主线 mesa 使用 LLVMpipe 运行 glxinfo 的截图,并在次日发布了一张在 PineTab-V 上使用 LLVMpipe 运行 glmark 的截图。

11 月 8 日,@YukariChiba 以相同的 ID,在 mesa 主线中重新提交了 MR 26018,旨在为主线版本 mesa 提供参考 patch 的同时,推进 mesa 主线的合并。

很快,deepin、ArchLinux RISC-V、AOSC OS 等发行版也先后使用了这一版 MR 的补丁,RISC-V 主线化的桌面体验再一次达到了可用的状态。

2024 年 4 月,Icenowy Zheng (@icenowy) 在 ORCJIT MR 的基础上增加了着色器缓存和 loongarch 架构的支持,这意味着 ORCJIT 后端一旦合入,所有的主流桌面架构都能实现性能优异的 LLVMpipe 支持。

众人拾柴火焰高,长风破浪会有时,LLVMpipe ORCJIT 这一突破性进展受到越来越多开发者的关注,合并进入主线逐渐被提上了日程。

MR 的接力冲刺和最终合并

6 月 19 日,有开发者评论:

Is there anything outstanding that is preventing this from being merged into the main mesa branch?

而这打破了 MR 评论区的宁静。在后续的 1 个月里,社区贡献者们对该 MR 提出了数十条修改意见;Dave Airlie (@airlied) 为帮助 ORCJIT 最终落地提交了数个前序修改和代码结构优化;MR 提交者 @YukariChiba 根据修改意见对 MR 提交内容修改了数十个版本,并最终在 6 月 28 日提交了最终版本。

最终,7 月 16 日,Merge Request 26018 完成了合并前 CI 检查,被 mesa 主线合入,标志这这一场由全球无数开发者参与、持续两年的开源马拉松圆满落幕。

deepin的持续跟踪与维护:幕后故事

在 mesa 提交 MR 的这位 ID 称作 @YukariChiba 的开发者还有另外的身份:deepin(深度)开源社区的研发工程师,deepin-ports SIG 开发者,deepin RISC-V port 的维护者之一。

deepin-ports SIG 在 2023 年成功将 RISC-V 的支持合并到了主线,同时也对主流的开发板进行了适配。与其它开源社区一样,deepin 也饱受无法主线化、依赖闭源驱动组件的 GPU 图形驱动的困扰,mesa 的 ORCJIT 后端支持此时无异于雪中送炭。

deepin 在 2023 年 12 月 6 日便对这一份更新的 patch 做了内部的打包验证,并在 VisionFive2、LicheePi4A、SG2042 EVB 等开发板上做了实机验证和性能测试。

次日,deepin 合并了此 MR 的 patch 到 mesa 主线仓库,为 riscv64 架构默认打开了 ORCJIT 支持,并在后续所有的 riscv64 设备镜像中启用。

从 2023 年 11 月的初版补丁,直到 2024 年 7 月 16 日的最终合并,deepin 的 mesa 版本也相应的从 23.1.2 一路升级到了 24.1.0。在这过程中,deepin-ports SIG 积极适配新版 mesa 并刷新补丁,做到了在版本迭代的过程中补丁持续有效,助力了此特性的测试和维护,客观上为 mesa 上游的最终合并提供了社区支持。

在此期间,deepin 同时也超前引入了尚未合并、基于 ORCJIT 提交的 loongarch 支持补丁和着色器缓存补丁,为 deepin-ports 两大架构 riscv64 和 loong64 提供了更高性能的软件渲染,完善了 deepin 的桌面生态。

未来,deepin 还将继续跟进 mesa 等开源软件的上游更新和后续的性能优化,为完善 amd64/arm64/riscv64/loong64 四大架构的开源桌面体验而不懈努力。

附录:

(1)deepin 全版本镜像(含 deepin V15):https://distrowatch.com/index.php?distribution=deepin

(2)deepin RISC-V 架构镜像(LicheePi 4A、VisionFive 等):最新版本 – 深度科技社区

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

短视频矩阵系统,一键智能成片

在信息爆炸的时代,短视频以其短平快的特点迅速崛起,成为人们获取信息、娱乐消遣的重要渠道。然而,如何在这个竞争激烈的领域中脱颖而出,制作出吸引眼球的爆款视频呢?今天,我们就来揭秘一款神奇的短视频矩阵…

灰色关联分析【系统分析+综合评价】

系统分析: 判断哪个因素影响最大 基本思想:根据序列曲线几何形状的相似程度来判断其练习是否紧密 绘制统计图并进行分析 确定子序列和母序列 对变量进行预处理(去量纲、缩小变量范围) 熟练使用excel与其公式和固定&#xff08…

熟悉set/map了解KV模型和pair结构

set基本介绍 set是key模型,本质是确定一个 元素在不在此容器中,也就是说 set中存储的是一个单一数据 1. set是按照一定次序存储元素的容器 2. 在set中,元素的value也标识它(value就是key,类型为T), 并且每个value必须是唯一的。set中的元素不…

vue3前端架构---打包配置

最近看到几篇vue3配置项的文章,转载记录一下 Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案-CSDN博客文章浏览阅读2k次,点赞8次,收藏9次。Vue3.2 vue/cli-service 打包 chunk-vendors.js 文件过大导致页…

个性化音频生成GPT-SoVits部署使用和API调用

一、训练自己的音色模型步骤 1、准备好要训练的数据,放在Data文件夹中,按照文件模板中的结构进行存放数据 2、双击打开go-webui.bat文件,等待页面跳转 3、页面打开后,开始训练自己的模型 (1)、人声伴奏分…

【C++】初识C++基础篇·一(命名空间,函数重载,缺省参数,引用);

文章目录 前言1.输入与输出输出输入cin和scanf的对比 2.命名空间2.1namespace存在的意义2.2namespace的使用3.缺省参数4.函数重载重载函数的调用规则 5.引用 前言 我们先通过一段简单的代码来拉开C的序幕&#xff1b; //text.cpp #include<iostream> #include<stdio…