关于编译器优化方面的知识

    通常编译器可以分成前端(FrontEnd/FE)和后端(BackEnd/BE)两个部分,其中前端负责将用户的源代码翻译成一种编译器的内部表示(Intermedium Representation/IR),我们简称IR. 这个就是通常词法分析,语法分析所做的事情。对于不同的源代码语言,我们需要不同的前端,但是我们可以通过使用公共的IR,使得对于不同的语言,可以使用相同编译器的后端。而编译器的后端,现在通常分成两个部分,一部分负责同平台无关的优化工作,我们通常称为中间端(MiddleEnd/ME),另外部分负责同平台相同的优化工作和代码生成(通常指生成汇编语言或直接二进制机器代码),我们通常称为代码生成部分(Code Generation/CG).

    同样,对于不同的平台(不同的CPU,不同的操作系统),我们需要不同的代码生成部分,但是整个编译器的中间端可以在不同的源代码,不同的平台之间共享。

    有一点需要注意的是,这里说的不同语言,是指像C/C++/Fortran/Pascal之类的静态编译的语言,而不包含像Java/C#之类需要在运行时间再编译的语言(这是因为这两种编译器的实现方法完全不同),而对于Java/C#之类的语言,所用的编译器就是另外一个话题了,不过其中用到的大部分技术还是类似的。而我将会把介绍的重点放在编译器的中间端(ME).

    关于介绍编译器优化的书,我推荐大家可以看一下美国的Steven S. Muchnick写的Advanced Compiler Design and Implementation. 国内有影印版,中文名字叫《高级编译器设计和实现》。但是有没有翻译成中文的版本我就不知道了。

    而现成的比较好的编译器源代码,我推荐open64,这个可以在http://www.open64.net/上找到,这个编译器的前身是sgi的编译器pro64,后来移植到Itanium芯片上。根据open64网站上的信息,现在可以用于Itanium (IA64), i386 (32位x86通用芯片)和X86_64(64位x86通用芯片)。不过好像只支持Linux (Windows可以试着安装一下cygwin看看).对于语言,它可以同时编译C/C++/Fortran. 在我印象中,这个编译器的前端用的是gcc的前端,也就是说必须安装了gcc才能够使用open64,但是据说编译出来代码的性能比gcc要好很多。

   刚才又想到一个问题,到底编译器的定义是什么?什么样的软件才能够称为编译器呢?

   通常,编译器应该是一个将一种面向用户的"高级语言"翻译成面向机器的"目标语言"的软件。但是实际上,现在的编译器范畴要远远大于上面的定义。

  比如现在的编译器可以支持源代码到源代码的编译。比如open64里面,印象中提供了一个叫ir2c和ir2f的工具,也就是可以将open64中经过优化的IR重新翻译成C语言或fortran语言(当然翻译过程可能会有错误)。那么将编译器同这个ir2c或ir2f功能相结合,就可以看成一个从源代码到源代码的编译过程(中间可以有优化)。上面过程可以是同一种语言之间的等价变化,也可以是不同语言之间的等价变换(不同语言之间的变化更难,通常由于语言特性的不同,甚至于有些语句可能无法翻译回去)。

   而实际上,很多编译器(特别是用于研究的编译器)都是只支持源代码到源代码的编译过程的,我们称这种编译器为Source to Source Compiler.

  在另外一方面,比如Intel推出Itanium的时候,就遇上一个问题。虽然Itanium提供了许多理论上非常优秀的功能,可是实际上,虽然Itanium硬件直接提供了对x86的支持,但是性能很差,而实际上存在的大部分软件都是编译成x86代码,所以Itanium平台上运行软件的速度非常慢。Intel就提供了一种可以在运行时将x86代码重新编译成Itanium代码的软件,这个软件也可以看成是编译器的一种,通常称为Binary Translation.

这里我想先讨论下一类关于循环语句的一种优化,可以统称为么模变换。

这种循环变换理论上结果非常漂亮,可惜我认为很多C/C++写的代码由于指针的存在,

编译器无法准确分析数据依赖关系,很多这样的机会编译器都无法真正做掉。

而这种优化往往可以提高代码对缓存的使用,提高指令级并发度,以及提高线程级并行度。

我们先分析一个最简单的情况。

1.  int a[N][M];

2. 

3.  for(i=0;i<M;i++)

4.    for(j=0;j<N;j++)

5.      a[j]=...;

复制代码

转载于:https://my.oschina.net/u/218425/blog/51948

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值