2008年(91)
分类:
2008-07-07 13:21:55
虽然PathScale和Portland Group公司等几个开发工具提供商推出了支持AMD64架构的编译器产品,但对于大多数Windows和Linux下的开发者来说,Microsoft和gcc编译器仍旧是不二的选择。这里主要讲:GCC编译器
GCC编译器
在Linux平台上,GNU gcc C/C++编译器存在着许多种不同的版本。
对于在Linux平台下的AMD64应用程序二进制层面上,ILP是32位、64位和64位。正如前面所说的,在移植代码到新平台之前,要充分考虑这些数据的位宽。AMD推荐以下可以使用AMD64技术的操作系统版本,它们是:
Red Hat Enterprise-gcc-ssa (从3.5开始的一个分枝)-package: gcc-ssa 安装于 /usr/bin
SuSE Linux-gcc 3.3.3 (Hammer版)-package: gcc-33 安装于 /opt/gcc33
以上两个版本的gcc通过使用下述选项,都可以生成更快的代码,这对gcc来说,终归是一场挑战,因为相对于优化,它最初的设计目标是创建可具移植性的代码。
-O3打开几个通用的优化
-ffast打开浮点数学运算的更快方法,与之前提过的Microsoft的选项类似
-funroll-all-loops将把所有的循环解开成代码。这个开关选项使可执行文件的体积变大,但能改善执行效率,然而,测试一下此选项所带来的改变是非常重要的。举例来说,如果因为循环被展开后,不再适合放入缓存,那实际上将降低性能,因此,有些循环最好还是不要管它。多试几次,将会有助于判断此选项带来的价值。
64位GCC编译器同样也提供了配置向导优化(profile-guided optimization PGO)。想了解PGO是如何运作的更多信息,参考前面所提及的Microsoft编译器部分。对以上提及的gcc编译来说,要想使用PGO,第一步是带上-fprofile-arcs选项,接下来在重新编译中打开-fbranch-probabilities选项。
还有一件更重要的事,如果程序中有许多数学运算,就像计算FFT、调用触发器函数,或者解算线性代数,可能此时就要考虑使用AMD核心数学库(ACML),它提供了针对于含有AMD64技术芯片的高度优化的函数。在这些数学函数被经常调用的密集循环中,ACML能带来实质上的性能改变。