作者记录了自己第四次参加 PLDI 会议的旅程。文章以日记形式详细描述了在博尔德期间与众多研究者、开发者的交流,包括关于 e-graphs、Knuth-Bendix 算法、寄存器分配、Datalog 等多种技术话题的深入讨论。作者还参与了多项活动,如 BYOEG 教程和与 Yannis Smaragdakis 合作用 Datalog 实现线性扫描寄存器分配,以及跟随 Slava Pestov 学习 Knuth-Bendix 补全算法的实现。文章不仅展现了技术会议的学术交流氛围,也记录了因编程语言(Ruby)切片语义导致的调试趣事。
bernsteinbear-com
16 条来自 bernsteinbear-com 的内容
使用 Z3 验证汇编代码
2.0本文展示了如何利用 Z3 SMT 求解器来验证汇编级别的代码优化。作者以 Ruby ZJIT 中修复 fixnum 除法溢出 bug 的 PR 为例,通过 Z3 证明了一个无分支条件测试(使用 xor、or 和 test 指令)与原始 C 语言中的显式条件检查等价。文章详细介绍了如何通过否定条件让 Z3 搜索反例来验证等价性,这是一种将 SMT 求解器用作"证明引擎"的标准技巧。
内联启发式方法综述
1.5本文深入探讨了编译器(特别是即时编译器)中内联(inlining)技术的核心挑战与启发式策略。内联虽能显著提升优化效果,但错误的内联会导致代码膨胀、缓存抖动,甚至阻碍其他优化。作者调查了Cinder、YJIT、SpiderMonkey、JavaScriptCore、HotSpot等主流JIT编译器的内联启发式方法,分析了它们如何权衡代码大小、调用深度、性能剖析等因素。文章还介绍了调用上下文(call context)和性能剖析(profile)对内联决策的影响,并探讨了一些前沿研究,如用神经网络训练内联决策、将内联作为搜索启发式驱动整个优化管线等。
作者记录了一次为期三周半的日本长途旅行,行程涵盖东京、富山、金泽、奈良、伊东、函馆、日光、益子、轻井泽等地。旅行分为三部分:与家人共度时光、参加 RubyKaigi 技术会议,以及与伴侣一起游览。文中详细介绍了各地的素食推荐、地震经历、会议演讲体验,以及丰富的文化活动和美食探索。
部分静态单一信息形式
2.0在编译器领域,静态单一信息形式(SSI)是静态单一赋值形式(SSA)的一种常见扩展,通过在现有程序中挖掘事实并将其具体化为路径相关的IR节点来实现优化。本文提出了一种"部分SSI"的实用捷径——在SSA构建阶段同时插入类型细化节点,而非实现完整的SSI算法。文章还讨论了在优化过程中(如全局值编号后)进一步插入细化指令的方法,并列举了Cinder、TruffleRuby、Luau等编译器中的实际应用案例。
本文探讨了优化编译器如何跟踪中间表示指令的副作用,并对比了Cinder和JavaScriptCore等编译器采用的位集与抽象堆两种主要表示方法。作者通过分析不同编译器的实现细节,展示了副作用跟踪在指令重排、死代码消除等优化中的关键作用。
本文介绍了如何通过perf map接口为JIT编译的代码添加性能分析注解,使得YJIT/ZJIT等JIT编译器生成的代码能够在Linux perf和samply工具中正确显示函数名称。只需在生成函数时向/tmp/perf-{PID}.map文件写入一行包含起始地址、大小和符号名的记录即可。
ZJIT 是 Ruby 参考实现 YARV 中内置的全新即时编译器,现已随 Ruby 4.0 默认编译(需手动启用)。虽然目前性能尚未超越 YJIT,但已显著快于解释器,并支持更多代码优化和侧向退出等关键功能。
本文介绍了Toy优化器中加载/存储转发的实现,通过编译时对堆进行抽象解释,消除冗余的加载和存储操作。作者展示了如何缓存加载结果,并在存储操作发生时正确使缓存失效,从而优化程序性能。
GDB JIT 接口
2.5GDB 的 JIT 接口允许运行时在编译函数时注册调试信息,使 GDB 能够显示 JIT 编译代码的符号和堆栈跟踪。文章介绍了传统接口需要生成内存中的 ELF/Mach-O 对象,以及新的自定义调试信息接口,并探讨了适配 Linux perf 映射接口的可能性。
多入口CFG设计难题
2.0本文探讨了ZJIT编译器在处理Ruby默认参数时面临的多入口控制流图设计困境,分析了三种可能的解决方案:特殊处理入口块、创建超级入口块或复制整个CFG,最终选择了超级入口块方案。
本文介绍了如何在Toy优化器中实现基于类型的别名分析(TBAA),通过类型层次结构将堆划分为不相交的区域,从而更精确地判断内存访问是否可能别名,提升负载-存储转发的优化效果。
本文介绍了一个为Toy Optimizer编写的模糊测试工具,通过生成随机程序并验证优化前后的堆状态一致性来检测优化器中的正确性错误。该工具能快速发现因忽略别名写入等常见优化缺陷。
本文介绍了如何在ZJIT即时编译器中集成Perfetto追踪系统,通过可视化分析侧向退出事件来优化性能。作者展示了如何利用Perfetto的SQL查询功能识别热点方法,并分享了实现追踪的技术细节。
值编号是一种编译器优化技术,用于识别在编译时已知会在运行时产生相同值的指令,从而消除重复计算。它类似于静态单赋值形式,但能更有效地跨基本块进行公共子表达式消除。
抱歉将所有帖子标记为未读
0.5作者因修复URL中的双斜杠问题导致所有RSS帖子被标记为未读而致歉。这是一个仅通过RSS可见的特殊帖子,不会在网站上显示。