2019.12.25

前言

张福新老师在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%