今天跟某个减肥成功并且保持体重两年的人学到了一个很厉害的减肥技巧,适应于会做饭但讨厌做饭的人(比如我):强迫自己只吃自己做的饭并且不使用任何预加工的食材。
想学习编译器优化,目前零基础,想达到能自己写个还不赖的中后端那种水平,有什么推荐的书、论文、课程或者代码可以钻研吗?(书的话最好能直球一点)🥹
看 psABI 的时候发现龙架构有一堆很神奇的栈操作风格的重定位,似乎是在重定位过程中通过维护一个栈来保存中间信息(?)同时观测到还有一组和 RV 相似的重定位。看 mold 和 LLD 的代码发现都是只支持了后者,有点困惑。
后来发现栈操作风格的重定位是旧世界的东西。source
后来发现栈操作风格的重定位是旧世界的东西。source
参照 A 架构的代码 porting R 架构的过程,也是在 review A 架构的实现细节,所以一般都能发现几个 A 架构的 bug。
在 DynamoRIO 和 box64 之间切换割裂感好重:一边是 DR 干净的代码、干净的设计、完善的文档还有严格的开发流程;另一边是 box64 到处塞满了能用就行的 hack,为了性能各种不择手段以及 IOCCC 风格的 C 代码...... 这俩项目唯一的共同点大概就是都挺有意思的。
在龙芯群看到说小米 14 上装了一个名为 Tango[1] 的二进制翻译器,可以把 AArch32 的代码翻译成 AArch64,用来跑 32 位的程序。
于是好奇就去看了看 Tango 前身的论文[2],发现在同时支持 AArch32 和 AArch64 的机器上使用 Tango vs. native 做 benchmark,测得的性能损失很小(~7.5%),某些 OoO CPU 上甚至有一定的性能提升。
他们的设计和 DynamoRIO 有很多相似之处:
1. 基于 basic block 和 linked fragment 的 thread-shared code cache;
2. indirect branch linking 用的是一个段内的开放寻址哈希表做映射;
3. 用了 NET 算法做 trace building;
4. 精确的 signal handling。
也有一些和 DynamoRIO 不同的地方:
> 不同之处主要来自于 DynamoRIO 是同架构模拟,Tango 则是异架构模拟。
1. 地址空间映射,直接把 AArch32 的程序映射到低 4G 的区间,host 跑在高位区间;
2. 需要做 Linux syscall 的转译,因为 32 位的 syscall 和 64 位并不相同;但是据说 AArch64 内核中有一个兼容层,所以这个东西是内核帮忙做的;
3. 因为是同架构模拟,DynamoRIO 只需要转译少数指令即可,大部分指令都是原样放到 code cache;但 Tango 是异架构模拟,需要做二进制翻译;
4. 因为 AArch32 只有 16 个 GPR,所以 GPR 可以直接做一一映射,且还剩下一堆 scratch 寄存器可以用,这方面比 DynamoRIO 更简单;但是 AArch32 最多可以有 48 个浮点寄存器,AArch64 只有 32 个,所以需要做寄存器分配来减少 spill 的次数提高性能。
[1] https://www.amanieusystems.com/technology
[2] https://pure.manchester.ac.uk/ws/portalfiles/portal/56078084/pldi_16.pdf
于是好奇就去看了看 Tango 前身的论文[2],发现在同时支持 AArch32 和 AArch64 的机器上使用 Tango vs. native 做 benchmark,测得的性能损失很小(~7.5%),某些 OoO CPU 上甚至有一定的性能提升。
他们的设计和 DynamoRIO 有很多相似之处:
1. 基于 basic block 和 linked fragment 的 thread-shared code cache;
2. indirect branch linking 用的是一个段内的开放寻址哈希表做映射;
3. 用了 NET 算法做 trace building;
4. 精确的 signal handling。
也有一些和 DynamoRIO 不同的地方:
> 不同之处主要来自于 DynamoRIO 是同架构模拟,Tango 则是异架构模拟。
1. 地址空间映射,直接把 AArch32 的程序映射到低 4G 的区间,host 跑在高位区间;
2. 需要做 Linux syscall 的转译,因为 32 位的 syscall 和 64 位并不相同;但是据说 AArch64 内核中有一个兼容层,所以这个东西是内核帮忙做的;
3. 因为是同架构模拟,DynamoRIO 只需要转译少数指令即可,大部分指令都是原样放到 code cache;但 Tango 是异架构模拟,需要做二进制翻译;
4. 因为 AArch32 只有 16 个 GPR,所以 GPR 可以直接做一一映射,且还剩下一堆 scratch 寄存器可以用,这方面比 DynamoRIO 更简单;但是 AArch32 最多可以有 48 个浮点寄存器,AArch64 只有 32 个,所以需要做寄存器分配来减少 spill 的次数提高性能。
[1] https://www.amanieusystems.com/technology
[2] https://pure.manchester.ac.uk/ws/portalfiles/portal/56078084/pldi_16.pdf