HPC 领域常用编译器编译优化手册 曙光解决方案中心 2006 年 12 月
目 录 目 录... 2 1 GNU 编译器 (GCC)... 3 1.1. 简介... 3 1.2. 常用 Linux 系统上 GCC 编译器的版本... 3 1.3. 编译优化快速入门... 4 1.4. 一些编译优化选项说明... 4 2 PGI 编译器... 5 2.1. 简介... 5 2.2. 编译优化快速入门... 6 2.3. 一些编译优化选项说明... 6 3 Intel 编译器... 7 3.1. 简介... 7 3.2. 编译优化快速入门... 7 4 Pathscale 编译器... 7 4.1. 简介... 7 4.2. 编译优化快速入门... 8
1 GNU 编译器 (GCC) 1.1. 简介 作为自由软件的旗舰项目,Richard Stallman 在刚开始编写 GCC 的时候, 还只是把它当作仅仅一个 C 程序语言的编译器,GCC 的最初意思也只是 GNU C Compiler(GNU C 语言编译器 ) 经过多年的发展,GCC 已经不仅仅能支持 C 语言 ; 它现在还支持 Ada C++ Java Objective C Pascal COBOL Fortran 等语言 而 GCC 也不再单只是 GNU C 语言编译器的意思了, 而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了 GCC 支持硬件平台的种类特别广泛, 几乎所有有点实际用途的硬件平台,GCC 都提供了完善的支持 在目前的几乎所有的 Linux 操作系统中, 都带有 GCC 软件包 对于 HPC 领域来说, 常用的语言为 C/C++ Fortran 77/90/95 GCC 一直能很好的支持 C/C++ 和 Fortran 77 语言 在 06 年发布的 GCC 4 中, 有增加了对 Fortran 90/95 语言支持的 gfortran (GNU Fortran) GCC 编译器包括 : gcc:c 编译器 (gcc 4.1 gcc 3.3.3/3.3.4/3.4.1/3.4) gcc-ssa:c 编译器 (gcc-ssa) g++:c++ 编译器 (gcc 4.1 gcc 3.3.3/3.3.4/3.4.1/3.4) g++-ssa:c++ 编译器 (gcc-ssa) g77:fortran 77 编译器 (gcc 4.1 gcc 3.3.3/3.3.4/3.4.1/3.4) g77-ssa:fortran 77 编译器 (gcc-ssa) gfrotran:fortran 90/95 编译器 (gcc 4.1) 1.2. 常用 Linux 系统上 GCC 编译器的版本 操作系统 GCC 缺省版本性能优化推荐版本
Red Hat Enterprise Linux 3 3.4 gcc-ssa Red Hat Enterprise Linux 4 3.4.1 系统缺省版本 SuSE Linux Enterprise Server 8 3.2 3.3.3 SuSE Linux Enterprise Server 9 3.3.3 系统缺省版本 SuSE Linux 10.1 4.1.0 系统缺省版本 1.3. 编译优化快速入门 为了使大家在不了解 GCC 编译器细节的条件下, 就能更好的使用编译选项实现编译优化, 在这里给出了在 AMD64 平台上三种不同编译优化级别的编译选项 不做任何优化编译选项 : -O1 中级别优化编译选项 : -O2 mtune=generic 这一优化选项可以提高程序性能, 同时它也是一个可靠的编译选项 最高级别优化 : 编译选项 : -O3 -ffast-math -funroll-all-loops -fpeel-loops -ftracer -funswitch-loops ftree-vectorize mtune=k8 1.4. 一些编译优化选项说明 -funroll-all-loops : 做循环展开, 这有可能使得可执行文件变大, 执行速度可能变快也可能变慢 ( 主要是看代码的特点, 一般计算密集型代码会提高执行速度 ) -ffast-math : 违反 IEEE/ANSI 标准以提高浮点数计算速度, 但这是个危险的选项, 仅在编译不需要严格遵守 IEEE 规范且浮点计算密集的程序考虑采用 -ftracer : 执行尾部复制以扩大超级块的尺寸, 它简化了函数控制流, 从而允许其它的优化措施做的更好, 据说挺有效 -finline-functions : 允许编译器选择某些简单的函数在其被调用处展开, 比较安全的选项, 特别是在 CPU 二级缓存较大时建议使用
-funswitch-loops : 将循环体中不改变值的变量移动到循环体之外 -fgcse-after-reload : 为了清除多余的溢出, 在重载之后执行一个额外的载入消除步骤 -fivopts : 在 trees 上执行归纳变量优化 -ftree-vectorize : 在 trees 上执行循环向量化 mtune=xxxx 选项是做针对 XXXX 平台的优化, 如 : mtune=k8 选项是做针对 Opteron/Athlon 平台的优化 pentium4 或 pentium4m : 对 Intel P4 CPU( 支持 MMX SSE 和 SSE2) 平台的优化 prescott : 对 Intel P4 CPU( 支持 MMX SSE SSE2 和 SSE3) 平台的优化 nocona : 对 64 位 Intel P4 CPU( 支持 MMX SSE SSE2 和 SSE3) 平台的优化 k8 或 opteron : 对 AMD k8 核心的 CPU(X86_64 指令集 ) 平台的优化 2 PGI 编译器 2.1. 简介 PGI 编译器是 HPC 领域经典的编译器, 是由 Portland Group 公司为基于 32 位和 64 位 AMD64 IA32/EM64T 平台提供的编译器和开发工具, 支持 C/C++ Fortran 77/90/95 和 HPF, 支持 Linux 操作系统和 Windows 操作系统 PGI 服务器级的编译器和工具适用于基于下列处理器的服务器 :32 位 X86(AMD Athlon XP/MP Intel Pentium 4 and Xeon) 64 位 AMD64 技术 (AMD Opteron Athlon 64) 以及 64 位 IA (Intel Pentium Xeon EM64T) 处理器, 支持多达 16 个运行在 Linux/x86 操作系统上的 CPU 或线程 PGI 编译器包括 : pgcc:c 编译器 pgcc:c++ 编译器 pgf77:fortran 77 编译器 pgf90:fortran 90 编译器
2.2. 编译优化快速入门 解决方案中心 为了使大家在不了解 PGI 编译器细节的条件下, 就能更好的使用编译选项实现编译优化, 在这里给出了在 AMD64 平台上三种不同编译优化级别的编译选项 不做任何优化编译选项 : -tp k8-64 -O0 (or -O1) 中级别优化编译选项 : -tp k8-64 -fast -Mscalarsse 这组编译选项将会采用除了生成向量代码之外所有的优化 ( 生成向量代码有可能变换指令执行顺序, 且有可能会对最终运算结果产生影响 ) 最高级别优化 : 编译选项 : -tp k8-64 -fastsse -Mipa=fast 这组编译优化选项包括了针对 AMD64 平台的优化 sse 代码生成 向量化 代码分析 LRE 优化和循环展开 在上面三组优化中, -tp k8-64 是对 AMD Opteron 和 Athlon64(64 位 OS) 平台的优化 ; 若是在其他平台, 则可以修改此选项 如 : -tp k8-32 : 对 AMD Opteron 和 Athlon64(32 位 OS) 平台的优化 -tp p7 : 对 32 位 Intel P4 CPU 平台的优化 -tp p7-64 : 对 64 位 Intel P4 CPU(64 位 OS) 平台的优化 2.3. 一些编译优化选项说明 -mcmodel=medium : 编译的可执行程序的数据断可以超过 2GB 的内存 -mp : 支持 OpenMP -fast : 等同于 -O2 -Munroll=c:1 -Mnoframe -Mlre -fastsse : 等同于 -fast -Mvect=sse -Mscalarsse -Mcache_align -Mflushz -Munroll=?? : 执行循环展开
3 Intel 编译器 解决方案中心 3.1. 简介 Intel 编译器是 Intel 公司针对其硬件平台开发的编译环境 它包括 Intel C++ 编译器 ( 支持 C 和 C++ 语言 ) 和 Intel Fortran 编译器 ( 支持语言 Fortran 77/90/95 以及混合 C/Fortran 语言支持 ), 支持 Linux 操作系统和 Windows 操作系统 Intel 编译器在 Intel CPU 平台上, 包括 Pentium Xeon 和 Itanium 系列, 具有非常好的性能 Intel 编译器包括 : icc:c 编译器 icpc:c++ 编译器 ifort:fortran 编译器 3.2. 编译优化快速入门 不做任何优化编译选项 : -O0 中级别优化编译选项 : -O3 最高级别优化 : 编译选项 : -xw ipo O3t 4 Pathscale 编译器 4.1. 简介 Pathscale 编译器是针对 AMD 64 平台开发的编译器, 它针对 AMD 64 平台做了很多的优化,
具有很好的性能, 特别适合于基于 AMD 64 平台的 HPC 应用 它包括 C/C++ 编译器和 Fortran 77/90/95 编译器, 支持 Linux 操作系统 在基于 AMD 64 平台的 Linux 环境下, 通过实际测试,Pathscale 是性能最好的编译 在 SPEC PolyHedron EuroBen Stream 和很多其他实际应用的 Benchmark 测试中,Pathscale 的性能最优 Pathscale 编译器包括 : pathcc:c 编译器 pathcc:c++ 编译器 pathf95:fortran 编译器 4.2. 编译优化快速入门 为了使大家在不了解 Pathscale 编译器细节的条件下, 就能更好的使用编译选项实现编译优化, 在这里给出了在 AMD64 平台上三种不同编译优化级别的编译选项 不做任何优化编译选项 : -O2 -O2 选项在编译优化方面比较保守, 但是它会提高程序编译的时间, 同时保证浮点运算的精度 中级别优化编译选项 : -O3 -O3 选项比 -O2 选项会延长编译时间, 但加大代码的编译优化 最高级别优化 : 编译选项 : -Ofast -Ofast 选项等同于 -O3 -ipa -OPT:Ofast -fno-math-errno