前言:
张福新老师在slack讨论组里发的一条消息,
这个印度人的工作有点意思,大家有空可以看看。http://www.cse.iitd.ac.in/~sbansal/。他们曾经有一篇二进制翻译的文章,思路很不一样,大体是通过暴力搜索小代码片段的等价片段,然后查表实现翻译,居然实现了很多程序能静态翻译,spec CPU 2000 60%以上本地性能
我一直在考虑有没有一个比较好的方法能够从基本块都基本块翻译,而不是现在这样逐条翻译
也许superoptimizer是一个可能的解决方案
从上面提到的这个印度人的主页里找到了superoptimizer project的主页,其中介绍性的论文Automatic Generation of Peephole Superoptimizers,阅读笔记。
Automatic Generation of Peephole Superoptimizers
peephole optimizer本来是一项编译技术(在编译时进行),就是模式识别然后替换;这篇文章在此基础上添加了
🤔为什么不去模式匹配CFG而是要去要去模式匹配指令序列?
整个生成优化器的模式匹配数据库的流程分成3个部分,
设计思路
1.寻找指令序列
正则化指令序列
为了减少模式匹配的数据库的大小,作者提出了正则化(动词,canonicalization)表达式的方法,即重命名寄存器,内存地址和常数。例子:在有8个通用寄存器的处理器中mov reg1 reg2
会有8*7个版本,正则化后这56个版本都将成为相同的一条指令。
令$\theta()$表示正则化操作,$\theta^{-1}()$表示正则化的逆操作,由此,优化一条指令$I$的运行流程如下:
- 正则化$I$为$\theta(I)$
- 在模式匹配数据库里寻找等价于$\theta(I)$的$R$
- 用$\theta^{-1}(R)$替换$I$
指令序列的指纹
哈希指令序列的结果
2.穷举可能的优化序列,寻找最优
降低搜索空间
3.建立模式匹配数据库
等价性验证
性能
- peephole大小(窗口大小)3条指令
- 对比的编译器gcc 3.2.3版本,采用-o2优化选项
优化数组计算程序
1.7~10倍的性能的提升,原因:gcc不擅长运用inter的SIMD指令。
优化SEPC CINT2000
优化gcc编译的程序:性能提升1~5%,程序大小降低1~6%
优化某个版本的icc编译的程序:性能提升<1%,程序大小降低2.5~4%