相信很多人都听说过:程序80%的运行时间用来执行20%的代码。循环几乎占一般应用程序运行时间的绝大部分。优化程序中有关循环尤其是关键循环的代码将会给程序的性能带来很大的提升。而且这种循环优化是目标机器无关的,任何对循环的一点点优化都会在所有编译器支持的目标机上带来性能提升。所以编译器上的循环优化一直是研究的热点。 Continue reading »
认识Native Client
Native Client (Nacl) 是Google提出的一种让浏览器直接运行机器码的技术,让Web应用可以从客户机上获得更多的性能,同时又不会引起安全问题。这个技术类似于微软的ActiveX。程序员可以使用C++或者其他语言编写web应用程序,再通过Nacl发布。程序中可以调用一些系统服务中安全的API,如声卡或者图形显示等。Nacl能使用的本地系统调用都是已经规定好的,所以安全性有保证。这篇文章介绍如何使用Native Client。 Continue reading »
因为之前的两篇博文前瞻-全时优化和LLVM-1和前瞻-全时优化和LLVM-2都是基于Chris Lattner 2004年发表在CGO的文章写的。所以需要介绍一下LLVM从2004到2010这六年的变化,LLVM的开发社区很活跃。
从2004年三月到2010年4月,LLVM共发布了1.2-1.9,2.0-2.7,16个版本,至少每年发布两个版本。详细的历史发布版本和release都能从这里找到。
距离GCC 4.4的发布一年之久,GNU终于发布GCC 4.5了。新版本带来了很多新特性,包括使用MPC库在编译时完成复杂的算术计算,C++0x支持增强,使用部分Graphite完成自动并行化,支持新的ARM处理器,Intel Atom优化和调优支持,以及AMD Orochi优化支持等。今年稍晚发布的Fedora 14,Ubuntu 10.10,OpenSUSE 11.3,都将有GCC4.5,估计Gentoo马上就会有支持了,磨拳擦掌准备试用喽:)详细支持如下:
总体说明:
- 编译GCC需要MPC库
- 故纸堆里的旧系统和很久没有更新和测试的系统在GCC4.5中被标记为待放弃,包括IRIX, Solaris 7, Tru64 UNIX V5.1.
- GCC4.4中标记为待放弃的支持被放弃
- 移除Itanium 1变种支持,但Itanium2编译的程序能在Itanium1上正确执行
- GCC生成的调试信息包括了更多DWARF 3的特性,甚至包含了DWARF4的一些特性.GDB7.0之前的版本将无法使用这些特性.所以调试GCC4.5编译的程序需要使用GDB7.0及以上版本.也可以使用选项 -gdwarf-s -gstrict-dwarf来禁止生成DWARF4信息,或者-gdwarf-2 -gstrict-dwarf让GCC严格执行DWARF2标准.
- X86上,浮点运算在GCC4.5上使用严格C99语法编译时,可能会运行变慢。这是为了和标准一致,可以通过选项-fexcess-precision=fast来避免严格的标准限制。
- noinline属性不再能阻止整个函数拷贝。但可以通过新的属性noclone做到。
读PLDI 04 Best Paper Award 《Automatically Proving the Correctness of Compiler Optimizations》
By Sorin Lerner.Todd Millstein and Craig Chambers in Washington U
本博自从接触编译器到现在,几乎都每天都能听到bug这个关键字,编译器中的bug很痛苦,首先,人写的程序很复杂,编译器设计者很难想出所有的情况并一并处理之;其次,编译器的bug很难调,要先排除程序本身的错,接着需要知道到底是分析时出错还是变换时出错;还有这些错都是在怎样的分析和变换中出了错;最后还要担心错误会不会越不越多,没有对编译器整体的理解,很难给编译器打上正确的补丁,从而有可能这个例子补对了,其他又错了一片.
作者在文章里就编译优化正确性的自动证明做了一些尝试,这些尝试在读完文章之后觉得很了不起,只是这里面提到的工作做下来,也是需要很大的积累和投入.作者的尝试我概括如下:将优化分为转换和具体优化两个部分.代码的转换是所有优化都要做的,而并非所有的转换都是优化,所以作者通过增加利益驱动模块来判断某个转换是否是优化,这样优化的自动证明问题,就变成了某个转换正确性的自动证明问题;正确性的定义:转换前后的语义保持不变.接着作者按照转换依据的信息来自转换语句之前还是之后,将转换分成两种模式,即前向转换模式和后向转换模式.然后分别对这两种模式进行讨论,而自动证明也分别针对这两种模式来论述. Continue reading »
传统的过程內分析,采用很保守的策略,假设所有对过程可见的变量都可能改变,并默认所有可能的操作都有副作用,因此过程內分析和优化非常简单。函数调用对于优化策略来说,隐藏了副作用的信息,虽然inline能够将副作用信息暴露给调用者,但这会大大增加代码量并降低指令局部性,而且并非所有的函数都能inline(如,对于不可预测副作用的函数)。过程间分析(InterProcedural Analysis)就应运而生,被用来作程序调用分析,能够处理inline不能处理的问题。删除不必要的函数调用,做指针和常数传播等。
IPA 提供了完全不同的策略,先分析过程內的信息,如别名和依赖关系,然后将这些信息在调用图(根据过程间的调用关系得到的图)中传播,然后就可以利用这些信息决定将函数特殊化,移除函数中的某些不可能经过的路径或者内联函数。通过这些分析,能降低编译器对存储依赖的不确定性。目前还很活跃的编译器都支持了过程间分析和优化,例如gcc -O3就能默认打开优化,open64可以使用-ipa打开,LLVM也有强大的链接时过程间优化,ICC也有。 Continue reading »
这是gcc maillist中某国际友人 laurent@guerby.net 做的2个小时报告的ppt,报告题目为GCC Toulibre 20091216。最近一直想深入了解gcc,而这个ppt基本包含本博想了解的内容,所以将其翻译并分享到这里。翻译过程中,很多地方可能有错,请大家不吝赐教。原版的ppt见文末。
- 什么是GCC
GCC–GNU Compiler Collection,即GNU 编译器集合。GCC即可作为本地编译器也能作为交叉编译器,它支持很多高级语言和多个编译和目标平台。GCC的网址 http://gcc.gnu.org.它是FSF基金会版权所有的自由软件. Continue reading »
不知不觉,一个多月的时间,Fred Chow的讲义就被翻译完了。感谢那些奉献代码的人,在编译器优化上所做的努力和探索永没有止境。
感谢忍住我蹩脚的英语和汉语,看了这些翻译的朋友们。在这个翻译的过程中,深深感到自己的水平很不足,很多翻译别说雅和达,连信这个简单的要求都很难达到。争取将这些资料进一步的完善,能够给更多的人一个可靠的参考。希望大家多提意见和建议.
单就我个人,还是在翻译的过程中,学到了很多,原先都是单纯的看ppt,但是发现那样的话,印象不顾深刻,所以就决定一点点的翻译。自这个博客创建以来,一直希望能将这里搞成编译爱好者们喜欢的网站,呵呵我将继续努力。
Fred Chow是Open64的几个元老级人物之一,高屋建瓴,统观全局的讲述,让我在翻译的过程中很是佩服,只有在这样的积累下,才能讲出这么详实概括的课程。 Continue reading »
此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页
- 软件开发指南
使用内部选项来开关每个优化–测试正常后的优化选项默认打开.尽量按照模块化原理开发,相关的模块定义尽量本地化。#ifdef Is_True_On宏来标记来断言和确认的使用。通过断言,确认程序和DevWarns协助debug。虽然包含debug信息的编译器速度慢很多,但是可以尽早的发现错误。
- Debug辅助工具
四类:抽取某个阶段内和不同阶段间的程序代码(使用选项 -tr???);抽取某个阶段内或不同阶段间的符号表(使用选项 -ts???);分析/优化过程中方便跟踪的工具(使用选项 -tt???);提供能在调试器中调用的打印程序。
- 存储管理
使用存储池机制(commom/util/memory.c)代替malloc/free.提供任意数量的独立操作的存储池,有类似栈的操作,pop是释放内存的唯一方式。使用基于临时特性的存储池–永久的、PU级的、阶段级的和基本块级的。 Continue reading »

近期评论