跳到主要内容

每周一龙:第 22 期

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

每周一都为大家报道 LoongArch 社区最前线的第一手新鲜资讯! 本期的主要内容有:LoongArch v1.10,工具链的进展,以及杂七杂八的上游活动。 详情点进来看!

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

要闻速递:千呼万唤始出来,龙架构上新了!

10 月 23 日,龙芯中科将《龙芯架构参考手册》更新到了 LoongArch v1.101 版本。 这一修订版主要是将 LA664 微架构(对应 3A6000 型号)的新增、变更特性落成文档了。

变更内容

为方便阅读,现摘录《龙芯架构参考手册》卷一 1.5.1 节(LoongArch V1.11 版本新增内容)如下:

  1. 新增近似求解浮点数开根和浮点数开根求倒数指令, 包括标量运算的 FRECIPE.SFRECIPE.DFRSQRTE.SFRSQRTE.D 指令,128 位 SIMD 运算的 VFRECIPE.SVFRECIPE.DVFRSQRTE.SVFRSQRTE.D 指令 和 256 位 SIMD 运算的 XVFRECIPE.SXVFRECIPE.DXVFRSQRTE.SXVFRSQRTE.D 指令。
  2. 新增 SC.Q 指令。
  3. 新增 LLACQ.WSCREL.WLLACQ.DSCREL.D 指令。
  4. 新增 AMCAS.BAMCAS.HAMCAS.WAMCAS.DAMCAS_DB.BAMCAS_DB.HAMCAS_DB.WAMCAS_DB.DAMSWAP.BAMSWAP.H 指令。
  5. 新增 AMADD.BAMADD.HAMSWAP_DB.BAMSWAP_DB.HAMADD_DB.BAMADD_DB.H 指令。
  6. 增加 dbar 指令部分非零 hint 值的功能定义。
  7. 新增 64 位机器上执行 32 位整数除法指令是否受源操作数寄存器高 32 位值影响的判定方式。
  8. 规范相同地址 load 访存操作顺序执行行为判定方式。
  9. 增加消息中断的定义。
  10. 允许实现硬件页表遍历。
版权内容合理使用声明

《手册》明确保留所有权利且禁止非经书面许可的转载。 但根据《中华人民共和国著作权法》第二十四条第一款第一项、第二项, 我们确信以上对《手册》内容的摘抄属于合理使用范畴,不受《手册》版权声明约束。

主编点评

按照原文列表编号看,说是 10 条变更,其实分类有点太过扁平了: 比方说其中 6 条都与原子操作有关,且 2、3 两条都属于 LL/SC 操作范畴,5 中的原子交换操作也不知为何没放入 4。 那么先抛开这些行文细节,宏观来看,大的变更主要有以下几个方面:

  • 同步/原子操作能力,得到了一轮相当的迭代、优化(第 2、3、4、5、6、8 条);
  • 以正式文字形式,变相承认了初代 LoongArch 硬件事实上的奇葩坑点,及如何方便判断该坑是否存在(第 7 条);
  • 在特权架构方面,做了更多性能优化的尝试(第 9、10 条);
  • 可能出于特定应用场景需要,新增了一套更快的开根号、开根号同时求倒数的操作(第 1 条)。

说到原子操作:当代软件已经深度依赖多核、并行操作, 而每个处理器核往往也深度乱序执行以保证单线程性能; 为在这样恶劣的环境下保持程序语义正确, 内存模型——可以简单理解为具体系统上所有处理器核访存副作用的精确描述——其重要性勿庸赘言。 这些优化当然是 LA664 相比前代微架构能够取得整体两位数百分比性能提升的重要基础: 印象中单纯上文第 6 条的细粒度 dbar 改进,在内核适配后,就达成了 10% 还是 20% 的提升。 实际上,目前这方面应该也只有第 6 条被实现了:因为只有它能够向下兼容较早的处理器型号。 如果在具体场景能够不考虑旧处理器型号而生成机器语言的话,优化程度只会更高。

说到第 7 条的坑:考虑到龙芯公司的团队规模、投入资金之可怜,以及初代 LoongArch 推出之仓促, 多少捏出几个 bugs 其实也无可厚非,没什么喷点:没 bug 才不对劲呢! 这 div.w 系列指令(卷一第 2.2.1.13 节),作为一套 32 位操作,却与整个 LoongArch 其余 32 位操作行为都不同: 居然仍然会看入参的高 32 位,不是符号扩展就输出垃圾结果——虽然不做 64 位运算,但还得照 64 位准备! 这估计是源自最早期 MIPS 乘除法器与流水线分离的历史包袱:MIPS 的 32 位乘除法指令都有相同限制。 龙架构的 32 位乘法未受影响,但除法、取余的具体实现不幸与 MIPS 行为一致了。 显然设计师们并不认为这很合理——要不然也不会在 LA664 就改掉了; 但旧的型号才发售没多久,还得继续支持,于是新版手册并没有修改第 2.2.1.13 节的内容, 而是在第 2.2.10.5 节 CPUCFG 数据的介绍中提了一嘴: 可以看 CPUCFG.0x2.DIV32[bit26] 来确定当前处理器是否受此坑影响。

笔者预计相当长的一段时间里,估计都只有 JIT 运行时能从中受益: 和上文的原子操作新指令一样,想要整个系统都用上这几个操作的正常、宽松语义, 就意味着失去前代产品的兼容性。 因为 32 位除法、取余操作是如此的基础,如果每用一次之前都要动态检查 CPU 特性, 那性能不堪设想。 但 JIT 编译器不一样:它动态生成的代码并不受它自身限制,因此完全可以做到动态探查一次 CPU 特性,后续据此生成、运行对当前系统最优化的机器语言,而自身则保持与最兼容的基线对齐。

既然提到了硬件的坑,那么其实也不得不吐槽下第 10 条这个硬件页表遍历机构: 至少在笔者拿到的第一批 3A6000 板子上,这个功能估计被固件禁用了; 相应的 CPUCFG 标志位读出来是 0,内核实际也没用上。 不清楚前几天发售的量产批次还有没有这问题: 如果这些板子上这标志位也是 0, 那估计 3A6000 这个机构就是有什么坑,导致用不起来了。 不过也无伤大雅:其他方面的改进实在太大了,瑕不掩瑜——等下个批次或者下一代产品吧!

说回第 9 条,这个应该没坑了——也不一定;因为目前 Linux 内核并没有加入相关支持。 不过手册既然放出了,内核层面这个特性也能做到向后兼容,那么就期待接下来一两个周期它能得到支持吧。

最后是第 1 条这一套浮点运算优化: 笔者实测了 frsqrte.s 指令比著名的 Quake III Arena《雷神之锤 3 竞技场》 快速平方倒数算法精确, 且不是单纯将这个经典算法最后一步的 Newton 迭代多跑一两轮那么简单。 具体用的啥算法目前不知道,毕竟笔者没精力对处理器设计领域的前沿论文保持关注; 快就完事了! 这些操作虽然不如 IEEE 754 规范上要求的那么精确,但胜在执行快:这对 3D 渲染、 物理引擎、粗浅的数值模拟,之类精度要求不那么高的场景都是好事。 不过龙架构这个发明比较有开创性,以至于从目前的编程语言都不太容易调用它们, 非得手写点汇编不可; 有兴趣的同学可以看看能不能给你爱用的数学、图形学软件提 PR 加支持了!

总之,这次更新对性能提升行之有效,对群众折腾十分友好,相信它能成为众发烧友多年后的美好回忆(也可能不 😈)。

先「马」再看

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

Linux

Linux 6.6 正式版已经发布。 本周和下周是 Linux 6.7 的合并窗口; 目前龙架构分支仍然保持在只有 KVM 补丁的状态,等待 KVM 维护者的拉取。 不用急:有两周时间,并且本身龙芯也习惯在第二周的周五发出 PR,争取多点完善代码的时间。

工具链

binutils

Jiajie Chen 研究完 3A6000 彼时尚未公开的指令之后, 一看到 LoongArch v1.10 正式公布, 两天后的 10 月 25 号就掏出了给 binutils 新增这些指令汇编、反汇编支持的补丁(当然只做了正式见诸文档的那部分)。 杰哥威武! 感谢 xry111 提供新闻线索。

gcc

正在笔者龟速赶稿之际,Xi Ruoyao 修复了交叉汇编器就绪前, 构建交叉编译器会失败的问题。

LLVM

上期报道过的 FCC 搬运支持补丁, 10 月 27 日被移植回了 LLVM 17 分支。

花絮

看评论区,这个 bug 是下游有人编译 UE4(大名鼎鼎的虚幻四游戏引擎)发现的; 而 LLVM 17 系列的发版管理员在 Ubisoft(育碧)的工具链部门工作。 游戏推动先进生产力!

杂闻播报

应微信「龙芯读者俱乐部」群的「啊哈哈」群友反馈,从本期《每周一龙》开始, 略微扩充了前言部分。感谢这位读者的建议!

来自安同开源社区(AOSC)的朋友王江津为 Google 的 OpenSSL fork BoringSSL 提交了适配任意非官方支持的小端 (little-endian)32 位或 64 位平台的补丁。

xen0n 在给 Debian loong64 port 监工的过程中,发现 buildd.debian.org 的统计图表页面一直缺龙架构, 于是顺手帮忙加上了。 虽然历史数据没法补,但也无伤大雅——这 port 出生都没几天哪!

花絮

xen0n 选取了 R 语言的番茄色 tomato 为龙架构配色,原因写在了提交说明:

  • 跟龙芯的 logo 配色差不多,都红不溜秋的,以及
  • 番茄 🍅 基本上也好吃!

(其实当然首要考虑是区分度;这点倒是忘记在提交说明写上了。😂

张贴栏

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

  • 友情扩散:安同开源社区(AOSC)的龙架构移植主线化工作「合龙」仍在如火如荼进行中, 此工作完成后龙架构将升格为 AOSC OS 的 Tier 1 架构。 欢迎同学们试用、反馈,也欢迎有志之士一同加入(沟通渠道详见 AOSC 网站相关栏目)。
  • 站务公告:应广大沉默读者群体的需求(你们的沉默震耳欲聋;lóng 没有双关), 我们已为本站取得了中国大陆 ICP 备案, 以便为中国大陆地区读者提供其境内的 CDN 加速: 您打开本站应该不卡了。 详见本站动态
  • 本周报持续接受网友投稿。欢迎来上游坐坐!

Footnotes

  1. 目前这一版手册对 LoongArch 版本号的称呼较为混乱:手册文件名、PDF 封面均采用 r1p10v1.10 的写法,但正文中却常作 v1.1。考虑到这手册曾经出过 v1.0x 的修订版,且龙芯中科在文档版本号上从未采用过语义化版本Semantic Versioning日历化版本Calendar Versioning等等精确定义的方案,我们还是将其称作 v1.10:这样至少次版本号(minor version)字段的宽度都一致,因而能够明确是以 ASCII 排序来确定版本先后次序了。至于未来,可能还是转向精确的版本号方案会节省些理解沟通成本! 2