龙蜥与玄铁共建 RISC-V 编译器生态:五大 GCC 优化实践解法 编者按RISC-V 生态繁荣离不开编译器工具链演进。玄铁团队持续推进 RISC-V 后端在上游社区及龙蜥、如意等主流操作系统社区的功能支持与性能优化。在近期举办的 RISC-V 编译器生态和性能优化 MeetUp上阿里巴巴达摩院高级技术专家、玄铁 RISC-V 开发工具负责人尚云海分享了《RISC- V 编译器的优化进展》。他围绕指令集功能支持与性能优化两大方向剖析当前支持状态及与其他架构的差距并分享了玄铁最新成果后端层面开启高效指令 fusion 优化中端层面通过循环变换、自动向量化决策提升编译质量为 RISC-V 生态发展提供坚实的工具链支撑助力产业落地。以下为本次分享全文玄铁团队自 2001 年起深耕处理器领域2017 年全面转向 RISC-V同年加入 RISC-V 国际基金会并成为董事会成员随后快速发布首款处理器核 E902。2018 年推出当时性能最强的 C9102019 年实现全球首个 RISC-V 安卓系统。2021 年团队与龙蜥社区合作曳影 1520 首次兼容龙蜥操作系统并成功运行此后国内 RISC-V 生态迅速升温钉钉等多款 OS 和应用相继完成适配。今年推出的高性能旗舰处理器 C950 单核性能提升超 70%标志着 RISC-V 正式进入服务器市场。经过多年发展玄铁已形成完整的处理器产品系列。目前累计出货超 45 亿颗服务 900 余家客户。编译器生态建设思路在编译器生态建设方面尚云海阐述了三条核心思路。Follow RISC-V 指令集标准做强生态团队在 RISC-V 基金会及工作组上投入了大量精力。今天看到的很多RISC-V标准扩展指令的设计思路与早期玄铁扩展指令有着异曲同之妙团队希望通过自身对行业的实践把指令集标准不断做强。同时指令集不是凭空想象出来的必须以当代典型应用负载驱动。RISC-V 原来的基础指令集只有四十多条要适配、搞定各种各样的场景理论上就存在困难。因此近些年的发展中在精简指令集的基础上面向各类场景领域加入各类扩展指令集。在面向高性能的 DataCenter 计算和智能计算场景团队也发现了很多问题并在积极解决中同时也不断向上游贡献中。基于主流编程语言、主流框架优化方便业务落地尚云海表示团队坚决地把主流编译器做好包括 LLVM、GCC、C/C、Rust、Go 等主要目标是让 RISC-V 编译器及相关工具开发者用起来便利在产业应用落地上受欢迎。团队不断更新版本到最新同时把优化内容反馈回上游。操作系统生态以实践检验编译器编译器优化做得再多真正的检验还是要看实践。团队秉承这一理念将编译器推到龙蜥、如意等社区中去由真实的应用来检验编译器的优化点RISC-V 指令集的优化点。从两大编译器GCC 和 LLVM在 OS 中的落地情况来看功能支持基本完善但在很多新的业务场景上仍有很多改进空间。GCC 后端技术问题与解决方案尚云海结合近期在 GCC 上的实践重点分享了五个技术问题及其解决思路。指令融合Instruction Fusion框架GCC 的 RISC-V 后端目前缺少一个通用的指令融合框架。和大家一样出发点是想把自家的硬件玄铁 950性能提上去。但与社区交流后发现应该做一套通用的指令融合框架。具体做法包括把常见的 Fusion 优化机制做成一个通用库方便开发者调用新处理器加入时只需通过简单的 config 配置就能实现优化功能同时把寄存器依赖分析、地址依赖相关分析等写成通用函数供各个硬件后端复用。这套框架内部已基本完成预计 GCC 17 版本中合入。RISC-V 自动向量化决策优化当前 GCC 对 RISC-V 的自动向量化决策不够精细。实测发现自动向量化后性能可能与手动优化差不多甚至更差某些情况下还会出现劣化。主要原因在于整个向量化的代价决策模型还很粗糙。团队的解决方案是加入更细致的代价判断包括向量寄存器压力、指令调度压力等因素同时排除不适合向量化的场景如存在复杂依赖关系的代码对于大循环而言向量化通常有正向收益但对小循环特别是 Vector的头部尾部处理等需要更精细的代价模型。向量配置 vsetvl 消除优化与传统 SIMD 编程不同在编程中向量长度是在编译期固定的转换相对直接。RISC-V Vector 编程的向量长度在运行时动态配置具有高度灵活性但这种灵活性也给编译器带来了优化难题。在自动向量化过程中编译器需要反复插入 vsetvl 指令来调整向量长度和计算方式。由于每次向量化操作都涉及向量基本单元的重新配置生成的代码中往往出现大量 vsetvl 指令。仔细审视便会发现有很大一部分是冗余的前面已经完成的配置在后续代码中又会被重复设置。传统的编译器优化基本局限于单个 block 块对跨函数的 vsetvl 冗余并未涉及。团队的思路是将优化范围从单 block 到整个函数使整个函数的冗余 vsetvl 得以有效消除对于相邻的重复 vsetvl 设置则通过死代码消除DCE等手段予以合并或去除。TLS 变量访问性能问题在多线程场景中TLSThread-Local Storage变量的使用非常常见。传统做法下每次访问 TLS 变量都需要通过标准函数调用来获得变量地址这会导致caller save 寄存器被破坏并产生 Spill 行为一来一回产生较大的性能开销。目前更优的做法是 TLS Description在 RISC-V ABI 规范中已有定义但实现机制尚有缺失包括在静态库、动态链接器和编译器中都还支持不完善。团队实现了从编译器到动态链接器的完整 TLS Description 机制支持具体到真实应用测试下来大概有 10% 的性能提升。循环优化缺少后端接口循环优化特别是循环展开对性能影响较大。原来的循环优化机制只是简单地决定展开或不展开没有很好的后端接口。但展开次数太多会导致代码膨胀对小 Cache 的处理器反而带来性能负增长。团队给循环展开加了一个后端接口由后端根据目标处理器的流水线深度、Cache 大小、预取行为等硬件特性来具体决定循环展开策略比如展开 4 次、5 次还是 8 次。实测下来在该框架下的循环展开性能收益趋于稳定。上游贡献总览团队在开源生态建设方面成果显著累计向 GCC、LLVM、glibc、Binutils 等 6 个核心上游仓库提交 Patch 超 200 个并拥有 3 位仓库 Maintainer。团队率先将二进制优化工具 BOLT 支持 RISC-V 后端实现了全流程跑通。BOLT 属于后链接优化器而非传统静态编译器其能够基于运行时动态分析进行精确优化对未来高性能处理器至关重要。目前该工具在 x86 和 ARM 平台上均已验证可带来显著的性能收益RISC-V 通过该工具预计也能得到较好收益。在 OS 社区方面团队在龙蜥、如意等社区做了大量贡献包括 GCC、Binutils、Linux Kernel 等关键组建并得到了社区的认可。2022 年达摩院、阿里云协同 PLCT 实验室、统信软件发布 Anolis OS 8 for RISC-V 预览版行业首个支持玄铁 C910 的 RISC-V 开源操作系统版本。2025 年达摩院牵头完成 2000 RISC-V 系统软件包构建并发布 Anolis OS 23.3 for RISC-V 预览版。2026 年达摩院、阿里云等共建支持 RVA23 Profile 的 Anolis OS 23.4 RISC-V 正式版本。未来探索方向尚云海在演讲最后分享了几个正在探索的方向第一商业编译器的优化特性引入。很多商业编译器里已经实现的优秀优化机制但在开源社区中缺少实现。团队希望把这些好的优化机制吸收到开源编译器中特别是数据布局优化、局部性优化等对高性能处理器非常有效。第二代价模型的 ML 化探索。传统代价模型对于复杂流水线如六发射、超大发射窗口、乱序执行往往不准确。团队尝试用 AI 模型来取代传统的代价模型通过在真实硬件上跑数据让模型自动学习指令代价取代人工定义的代价模型。第三BOLT 优化能力的进一步增强。团队认为 BOLT 对未来高性能处理器非常重要计划继续加强其优化能力。第四向量化的深入探索。各家都在把向量单元做得越来越宽如何充分利用这些向量指令是值得研究的问题。市面上看到 1024bit、2048bit、4098bit 位宽的硬件不断被推出相对于标量有 32 倍(1024/32的计算位宽提升。因此软件层面的向量化优化空间巨大。最后希望玄铁与业界保持更紧密的交流与协作共同推动 RISC-V 软件生态走向成熟。本次 MeetUp PPT 、视频回放已上线龙蜥官网欢迎点击查看PPT 下载链接龙蜥社区MeetUp - OpenAnolis 龙蜥操作系统开源社区文档中心视频回放Video - OpenAnolis code repository—— 完 ——