ksco 的工作日志
245 subscribers
168 photos
10 videos
4 files
84 links
内容主要取决于我正在做的东西,目前主要是模拟器 / DBT 之类的散乱话题。
Download Telegram
今天跟某个减肥成功并且保持体重两年的人学到了一个很厉害的减肥技巧,适应于会做饭但讨厌做饭的人(比如我):强迫自己只吃自己做的饭并且不使用任何预加工的食材。
新发现的 gdb 用法,好!
4
🤔 C 扩展好难啊
🥰1
想学习编译器优化,目前零基础,想达到能自己写个还不赖的中后端那种水平,有什么推荐的书、论文、课程或者代码可以钻研吗?(书的话最好能直球一点)🥹
https://dougallj.github.io/asil/

哇,RVV 也需要这个!
🤯2
不到两百页的手册,感觉到货前就能读完。

更新:扫了一遍,非特权集和 RV 相似度极高。
看 psABI 的时候发现龙架构有一堆很神奇的栈操作风格的重定位,似乎是在重定位过程中通过维护一个栈来保存中间信息(?)同时观测到还有一组和 RV 相似的重定位。看 mold 和 LLD 的代码发现都是只支持了后者,有点困惑。

后来发现栈操作风格的重定位是旧世界的东西。source
啊,干了一晚上脏活,还不一定能被 merge 😢
🤔️
🤔5
参照 A 架构的代码 porting R 架构的过程,也是在 review A 架构的实现细节,所以一般都能发现几个 A 架构的 bug。
点了一杯酱香拿铁准备提提神,越喝越困🥱
🥱2
背景:很多 32 位的 x86 程序都会用 FILD/FISTP 序列来实现快速 memcpy,box64 有个优化是检测这个序列然后跳过类型转换直接生成直球的整形 load/store 代码来提高性能,但这个优化似乎有 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