优化入门

简单编译是将源代码转换或变换为可执行目标或共享目标。优化转换可以在运行时给予应用程序更好的整体性能。XL C/C++ 提供了一些针对 PowerPC 体系结构的优化转换的组合。这些转换能够:

它们的目的是使应用程序运行更快。

如果您了解存在哪些控制因素会影响写得好的代码的转换,则较少的开发工作便可获得显著的性能改善。编程模型(如 OpenMP)使得您能编写高性能代码。本节描述了一些优化方法,编译器可执行这些优化方法来帮助您在源代码的运行时性能、手工编码的宏优化、一般可读性和整体可移植性的折衷之间进行平衡。

此讨论假定您已使用概要分析程序来标识代码中可能适合优化的区域。

经常在应用程序开发周期的后面几个阶段(如产品发行版构建)尝试优化。可能的话,在尝试对代码进行优化之前,应在没有优化的情况下测试并调试代码。开始进行优化应该表示您已选择对程序最有效的算法并已正确实现它们。在很大程度上,符合语言标准与代码可以优化到的程度直接有关。优化器是最终一致性测试!

优化由编译器选项、伪指令和编译指示控制。然而,编译器友好编程习惯语法与任何选项或伪指令一样对于提高性能很有用。不再需要也不建议过多用手工来优化代码(例如,手工展开循环)。不常见的构造会使编译器(和其它程序员)产生困惑,并会妨碍针对新机器进行的应用程序优化。

应注意并非所有优化对所有应用程序都有益。通常必须在增加编译时间(伴随着降低调试能力)与编译器执行的优化程度之间进行折衷。

相关参考


选择的用于优化的编译器选项

下表描述了用于优化程序性能的基本编译器选项选择的特征。有关详尽的列表,请参阅 XL C/C++ Programming Guide。有关可用子选项的文档,请参阅 XL C/C++ Compiler Reference 或选项手册页。

表 1. 用于优化的基本编译器选项

选项 描述
-qnoopt 编译器执行非常有限的优化。这是缺省选项。在开始优化应用程序之前,请用 -qnoopt 确保已成功编译了它。
-O2 编译器执行广泛的低级优化,包括图着色、公共子表达式清除、死代码清除、代数简化、常量传播、目标机器的指令调度、循环展开和软件流水线操作。
-qarch
-qtune
-qcache
编译器利用应用程序运行的特定硬件和指令集的特征。使用 -qarch 命令来指定应对其生成应用程序代码的处理器体系结构系列。使用 -qtune 来使优化偏向在给定微处理器上的执行。使用 -qcache 来指定特定高速缓存或内存几何结构。
-qpdf1
-qpdf2
当指定了优化级别 -O 或更高时,根据通常执行代码不同部分的频率的分析,编译器使用面向概要的反馈来优化应用程序。PDF 过程对于包含没有特定结构的分支的应用程序最有用。
-O3 -O2 相比,编译器执行更主动的优化:循环展开程度更深并消除了对隐式内存使用的限制。
-qhot 编译器执行高阶转换,这提供了其它循环优化并有选择地执行数组填充。此选项对于执行大量数字处理的科学应用程序最有用。
-qipa 编译器执行过程间分析以将整个应用程序作为一个单元来进行优化(整个程序分析)。此选项对于包含大量经常使用的例程的商业应用程序最有用。它对于具有高级抽象的 C++ 程序也很有用。在许多情况下,此选项明显增大编译时间。
-O4 此选项等价于 -O3 -qipa -qhot -qarch=auto -qtune=auto -qcache=auto。如果编译用时太长,则尝试使用 -O4 -qnoipa 来进行编译。
-O5 此选项等价于 -O4 -qipa=level=2。在 Linux 平台上,如果处理器是 PowerPC 970 并且操作系统支持 AltiVec 数据类型,此选项也打开 -qhot=vector -qhot=simd
IBM Copyright 2003