跳到主要内容

每周一龙:第 30 期

· 阅读需 13 分钟
WANG Xuerui
🐲龙门客栈打杂的

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 上周的进展主要有 LoongArch ABI v2.30、工具链,以及 AOSC 研发的新旧世界兼容方案。 详情点进来看!

如无特别说明,文中提及的日期、时间都为北京时间(UTC+8)。

本期周报的实际发稿时间是周二凌晨,因为这个点才写完——白天都在忙别的。 网页上显示的发稿时间仍然是 12 月 25 日: 这是 Docusaurus 早期为了修复一个时区 bug 而导致的又一个时区 bug。

先「马」再看

本栏目的内容具有一定延续性,将持续追踪报道 LoongArch 领域的重要或长期项目(坑)。

Linux

Huacai Chen 发出了 Linux v6.8 开发周期的龙架构 KVM 变更 PR。 其中,Bibo Mao 修复了定时器的模拟;Tianrui Zhao 让虚拟机内部可以使用 LSX、LASX 指令。

Huacai Chen 修复了单节点的逻辑处理器数量大于 64 时,系统引导过程会写坏一些内存内容的问题。

龙芯 QEMU 开发者 Song Gao 为方便用户以 FDT(flattened device tree,拍平设备树)协议启动主线内核, 预备为主线内核的默认配置开启通用 PCIe 宿主支持。

Xi Ruoyao 尝试微调了 LoongArch 上下文切换代码中保存、恢复 8 个浮点条件码的片段, 因为先前的简单写法在 LA464 上性能很差。 然而 Huacai Chen 还是喜欢简单的代码, 因此估计在谁掏出这么改可以提升上下文切换性能的客观证据,例如跑分对比之前,这个补丁是不会被收了 😕

究竟有多差?

根据 Xi Ruoyao 的实验结果,LA464 上每次 movcf2gr 花的时间是 movcf2fr + movfr2gr 的 7 倍, 而 movgr2cf 更是 movgr2fr + movfr2cf 的 15 倍! 想在浮点条件码和整数寄存器之间搬运多达 1 比特的数据,多经过浮点寄存器倒一手,居然能快几倍甚至十几倍,简直离谱。 还好 LA664 把这坑填掉了。

工具链

ABI

今(25)日下班前,龙芯工具链团队合并了 LoongArch ABI 规范文档的 v2.30 更新(整体版本号;文档版本号为 v20231219)。 本次更新的主要内容有:

  • 明确了基础 ABI 下,函数的向量参数的传递方式。基础 ABI 不保证 SIMD 扩展一定存在,因此只能将向量参数视作基本类型量的数组处理。
  • 修复了一些重定位操作的算术描述。
  • 增加了代码模型(code model)章节。主要是明确定义了 normalmediumextreme 三种代码模型,以及要求 extreme 代码模型的四条拼接地址指令必须相邻。 后者是先前针对该问题的社区讨论所提到的简单方案。 周报第 26 期的猜测出了些偏差: 可能出于工作量和兼容性考虑,本次并未「一步到位」,直接实现那个通过提供完整关联信息而解决问题的复杂方案。 本站的基线参考文档也已同步更新了
  • 正式加入了周报第 27 期提及的 TLS 描述符(TLSDESC)相关定义。

binutils

mengqinggang 修复了先前会给不是函数类型的符号也生成 PLT(procedure linkage table,过程链接表)记录的问题。

mengqinggang 还按照本次的 ELF psABI 更新,实现了 R_LARCH_ALIGN 对汇编器 .align 第三位置的表达式参数的支持。

GCC

Xi Ruoyao 修复了杰哥发现的编译 LSX 的循环移位操作会崩溃(ICE)的问题:补丁甲补丁乙

Xi Ruoyao 还修复了同样由杰哥发现的 __m128 类型的「不等于」比较操作会被错误编译的问题。

Xi Ruoyao 还节约了每次 32 位循环移位操作先前都附带的一次多余符号扩展。

Xi Ruoyao 还尝试解决了先前在 -mexplicit-relocs=auto 时,有些适合合并的符号地址装载操作没被识别出来、予以合并的问题; 目前还有小坑,正在调整。

Xi Ruoyao 还改善了对于浮点条件码的处理:清理了 LoongArch 后端定义中一处不会被用到的情况, 又实现了浮点条件码(FCCmode) 的重新装载(reload)。 后者有利于在某处浮点比较操作的结果无法预测时,提升此处结果向目标位置的保存性能。

Lulu Cheng 实现了 TLS LE (local-exec) relaxation(线程本地存储的本地执行模型的松弛)优化的编译器一侧。 搭配周报第 27 期提到的汇编器一侧支持, 预计能在某些多线程场景下提升性能。

Li Wei 修复了启用链接时优化(LTO)时, 可能导致个别位域装载操作被错误编译的问题;原因是 *bstrins_<mode>_for_ior_mask 这条规则写错了。 该问题至少波及了 SPEC 2006 的 400.perlbench 用例。

本期的 GCC 新闻都是 Xi Ruoyao 帮忙整理的,让我们感谢 的奉献!

LLVM

紧随 LoongArch ELF psABI v20231219(整体版本号 v2.30)的发布,SixWeining 更新了先前对 LLD extreme 代码模型的立即数处理的重制。 按照目前的实现方式,这会让一些先前错误的边界情况变正确,但也会让一些先前正确的边界情况变错误: 还好目前几乎没有软件用到 extreme 代码模型,剩下的就只有祈祷!

MQ-mengqing 给 linker relaxation 做准备:仿照 RISC-V,推迟了 LLVM MC 的 LoongArch 后端决策是否产生「加、减」类型重定位记录的时机。 然而在该补丁合并之后,发现一些软件开始链接失败: 这是由于 DWARF v5 调试信息用到了 ULEB128 类型的加减操作, 而 LoongArch 暂未如 RISC-V 一样实现了这些操作。 目前 MQ-mengqing 写了一版修复, 正在补充测试用例。

SixWeining 为 LLD 新增了 R_LARCH_CALL36 支持。

杂闻播报

欧洲时间 12 月 20 日晚间,首度包含了龙架构支持的 GRUB 2.12 正式发布了。 久等了! 知名科技媒体 Phoronix 也报道了此事。 感谢 xry111 提供新闻线索。

社区整活

本栏目接受任何网友的投稿,只要内容与 LoongArch 有关,并可以为读者带来价值, 无论严肃贡献(整的大活)或是博君一笑都一概欢迎!

libLoL: AOSC 为您在新旧世界之间架起桥梁!

众所周知,LoongArch 的新旧世界生态割裂问题已经困扰了社区发行版用户许久: 虽然许多闭源软件都陆续支持了 LoongArch,但都是在采用旧世界 ABI 的商业发行版上, 从而与基于新世界 ABI 的社区发行版和用户群体「绝缘」。 虽然在早先上证路演的投资者互动环节、11 月 28 日的产品发布会上, 龙芯公司都表态将开发新旧世界应用的兼容方案, 但截至目前,关于龙芯方案的技术细节,满怀热忱的同学们仍未在公开渠道得到正面回应。 考虑到性能喜人的 3A6000 板卡已经陆续上市,不难作出合理推测: 总有群众等不及两年后(无论实际更早或更晚)这些软件的官方新世界版本,而现在就要用

安同开源社区(AOSC)作为「牢记服务用户需求这一宗旨」的一群人,此刻便站了出来。 们给出的答案是 libLoL: LoongArch on LoongArch。

AOSC 开发者王邈刘子兴, 在内核层面实现了以外挂模块(亦可理解为「驱动」)方式,动态载入的旧世界系统调用支持。 王邈也设计、实现了位于用户态的运行时部分:打包了旧世界参考发行版 Loongnix 的核心运行时库, 使旧世界应用能够有「回家的感觉」从而正常启动。 目前 AOSC OS 已经能够运行 WPS Office 与龙芯浏览器等标志性的旧世界应用, 如图所示(点击即看高清大图):

启用了 libLoL 的 AOSC 系统上成功运行旧世界 WPS 与龙芯浏览器的截图

后续,在完成配套内核模块的载入向导后,使用龙架构设备的 AOSC OS 用户便可按需启用此兼容方案了。AOSC 同仁们也欢迎其他新世界发行版维护者考察 libLoL,并视自身情况和需求集成此项目的成果。

12 月 23 日发布的 AOSC 双周报《安记冰室・十二月下》记载了这项工作的更多信息,推荐阅读。

张贴栏

本栏目可供张贴公益性质的各种信息。

  • 友情扩散:安同开源社区(AOSC)的龙架构移植主线化工作「合龙」仍在如火如荼进行中, 此工作完成后龙架构将升格为 AOSC OS 的 Tier 1 架构。 欢迎同学们试用、反馈,也欢迎有志之士一同加入(沟通渠道详见 AOSC 网站相关栏目)。
  • 本周报持续接受网友投稿。欢迎来上游坐坐!