版本 7 中的新增内容

XL C/C++ Advanced Edition 现在支持下列操作系统:

XL C/C++ Advanced Edition 中的新功能和增强分为三个类别:性能和优化、符合业界标准以及易于使用。


性能和优化

许多新的功能部件和增强功能都可归入优化和性能调整类别。

机器体系结构和硬件

对选项 -qarch 和 -qtune 的改进

编译器选项 -qarch 控制为指定的机器体系结构生成的特定指令。选项 -qtune 调整指令、调度和其它优化方法以在指定的硬件上增强性能。这些选项共同起作用以生成对于指定的体系结构可获得最佳性能的应用程序代码。熟练使用这些选项的组合是充分利用 IBM 处理器和硬件的关键。在本发行版中已增强这些选项的协作 以增加对 POWER5 和 PowerPC 970 硬件平台的支持和使这些选项更易于使用。

对于 -qarch 指定的特定体系结构,用缺省 -qtune 子选项进行编译将生成对于该体系结构可获得最佳性能的代码。选项 -qarch 现在可指定一组体系结构;用 -qtune=auto 进行编译将生成可以在指定组中的所有体系结构上运行的代码,但指令序列将是在编译机器的体系结构上具有最佳性能的指令序列。

-qarch 的缺省设置取决于所使用的平台:

AltiVec(VMX)支持

XL C/C++ for Linux 支持 AltiVec 编程模型并提供了其它一些功能以确保与 GNU C 和 C++ 编译器达到最大程度的兼容性。只要体系结构支持 PowerPC SIMD 扩展(也称为 VMX 引擎),32 位和 64 位方式的 AltiVec 数据类型和相关的操作就可用。SIMD(单条指令,多个数据)指令集使得微处理器硬件利用率更高。编译器提供了在较高优化级别自动启用 SIMD 向量化的能力。

POWER5 处理器支持的内置函数

对于 POWER5 处理器,添加了对下列内置函数的支持。在 XL C/C++ Compiler Reference 中描述了所有受支持的内置函数。

POWER5 处理器的内置函数
函数 描述
int __popcnt4(unsigned int); 返回对 32 位整数设置的位数(=1)。
int __popcnt8 (unsigned long long); 返回对 64 位整数设置的位数(=1)。
unsigned long __popcntb (unsigned long); 对源代码操作数中的每个字节计 1 位并将该计数放入相应的字节的结果中。
int __poppar4(unsigned int); 如果对 32 位整数设置了奇数位,则返回 1。否则返回 0。
int __poppar8 (unsigned long long); 如果对 64 位整数设置了奇数位,则返回 1。否则返回 0。
double __fre(double); 返回浮点倒数运算的结果。结果为 1/x 的双精度估算值。
float __frsqrtes(float); 返回倒数平方根运算的结果。结果为 x 的平方根倒数的单精度估算值。
unsigned long __mfspr(const int); 返回指定的专用寄存器中的值。
void __mtspr(const int, unsigned long); 设置由 const int 指定的专用寄存器。
unsigned long __mfmsr(); 返回机器状态寄存器。
void __mtmsr(unsigned long); 设置机器状态寄存器。
void __protected_unlimited_stream_set_go(unsigned int direction, const void* addr, unsigned int ID); 建立使用标识 ID 的无限长度的受保护流。流标识应该在范围 0 至 15 之间。该流从 addr 处的高速缓冲行开始。该流按照 direction 的指定从递增内存地址或递减内存地址进行访存。对于递增内存地址(即正向),direction 的值为 1;对于递减内存地址,direction 的值为 3。该流受到保护而不会被任何硬件检测到的流所替换。
void __protected_stream_set(unsigned int direction, const void* addr, unsigned int ID); 建立使用标识 ID 的有限长度的受保护流。该流从 addr 处的高速缓冲行开始,然后按照 direction 的指定从递增内存地址或递减内存地址进行访存。该流受到保护而不会被任何硬件检测到的流所替换。
void __protected_stream_count(unsigned int unit_cnt, unsigned int ID); 设置 ID 所标识的有限长度受保护流的高速缓冲行数目。高速缓冲行的数目由参数 unit_cnt 指定并且应该在范围 0 至 1023 之间。
void __protected_stream_go(); 开始预取所有有限长度受保护流。
void __protected_stream_stop(unsigned int ID); 停止预取 ID 所标识的受保护流。
void __protected_stream_stop_all(); 停止预取所有受保护流。

用于浮点除法的新内置函数

在此发行版中附带了四个用于浮点除法的新内置函数。浮点除法算法的这些软件实现利用 PowerPC 体系结构,它们比在向量上下文中使用对应硬件指令明显要快。所有 PowerPC 处理器(包括 POWER5)都支持新的内置函数。

如果在源程序中编写了浮点除法,则在缺省情况下获取硬件除法指令,但是编译器可根据它认为哪种快一些来选择硬件或软件除法代码。新内置函数允许用户显式调用软件算法。当调用这些例程时,缺省舍入方式(舍入至最近似的数)必须生效。

用于浮点除法的内置函数
函数 描述
double __swdiv_nochk(double, double); double 类型的浮点除法;不进行范围检查。自变量限制:不允许分子为无穷大,也不允许分母为无穷大、零或反向规格化数;分子和分母的商也不能为正无穷大或负无穷大。
double __swdiv(double, double); double 类型的浮点除法。没有自变量限制。
float __swdivs_nochk(float, float); float 类型的浮点除法;不进行范围检查。自变量限制:不允许分子为无穷大,也不允许分母为无穷大、零或反向规格化数;分子和分母的商也不能为正无穷大或负无穷大。
float __swdivs(float, float); double 类型的浮点除法。没有自变量限制。

新增的 XL C/C++ 编译指示(pragma)

XL C/C++ Compiler Reference 中详细描述了编译指示伪指令。

编译指示 描述
#pragma novector 禁止编译器自动向量化紧随其后的循环。自动向量化指的是这样的操作:将在对数组连续元素的循环中执行的某些操作转换为对一次计算几个结果的例程的调用。
#pragma nosimd 禁止编译器在紧随其后的循环中自动生成 VMX 指令。
#pragma unrollandfuse 用于优化嵌套 for 循环的编译指示。指示编译器复制外部循环(它本身也是一个循环嵌套)的主体,并将副本融合成单个展开的循环嵌套。
#pragma stream_unroll 将包含在 for 循环中的一个流分成多个流。用于具有大量迭代计算和少量流的循环。
#pragma block_loop 指示编译器为循环嵌套中的特定 for 循环创建分块循环。将循环分块涉及将循环的迭代空间分成多个部分或块。将创建额外的外部循环,称为分块循环,它驱动每个块的原始循环。
#pragma loopid 用作用域唯一的标识来标记 for 循环。#pragma block_loop 和其它伪指令可使用该标识来控制此循环的转换,并通过使用 -qreport 选项提供有关循环转换的信息。
#pragma disjoint 增加的 C++ 实现。
#pragma unroll 的扩展 循环展开是指复制循环主体以便减少完成循环所需的迭代次数。#pragma unroll 伪指令指示编译器可展开紧跟在该伪指令后面的 for 循环。此编译指示的功能已经得到扩展,以允许将它应用于最里层和最外层的 for 循环。扩展的 #pragma 功能仍不能应用于具有备用入口点的 for 循环。

新的优化实用程序

此发行版包含与概要定向反馈(PDF)编译过程有关的两个新实用程序。通过使用概要定向反馈,编译器可以提供优化的反映了可执行文件如何在许多不同的方案中运行的可执行文件。作为运行该检测的可执行文件的副作用,将在其中一个方案中产生一个 PDF 记录。这些记录组成了通过对比来定义典型程序行为的数据。

showpdf 命令提供了显示在概要定向反馈练习运行中执行的所有过程的调用和块计数的能力。该实用程序要求用选项 -qpdf1-qshowpdf 编译。

mergepdf 命令允许用户指定两个或多个 PDF 记录的相对重要性并将它们合并为一个记录。这允许用户用更高的执行计数(即,更长的运行时间)来补偿练习运行,否则练习运行就会支配概要数据。

对 MASS 向量库的支持

编译器分别添加对 32 位和 64 位方式版本的 IBM Mathematics Acceleration Subsystem(MASS)向量库 libmassvp4.alibmassvp4_64.a 的支持。这些库包含用于单精度和双精度倒数和平方根函数的向量例程。向量库都是线程安全的度通过相应的 libm 例程提高了性能。

从版本 7.0 开始,MASS 库附带编译器。


遵循业界标准

C、C++ 和 Fortran 的 OpenMP API V2.0 支持

OpenMP 应用程序接口(API)是可移植且可伸缩的编程模型,它为用 C、C++ 和 Fortran 开发多平台的共享内存并行应用程序提供标准接口。该规范由 OpenMP 组织定义,该组织由主要的计算机硬件和软件供应商组成,其中包括 IBM。XL C/C++ Advanced Edition 符合“OpenMP 规范 2.0”,该编译器能识别并保持下列 OpenMP V2.0 元素的语义:

增强的 Unicode 和 NLS 支持

按照“C 标准”委员会的最新报告中的建议,C 编译器扩展了 C99 以添加新的数据类型来支持 UTF-16 和 UTF-32 文字。C++ 编译器也支持这些新的数据类型以与 C 兼容。

对 Boost 库的支持

XL C++ 编译器提供了与 1.30.2 Boost 库的高度兼容性。创建这些库是为了提供一组可再用的开放式源代码 C++ 库,这些库适合标准化。有关更多信息,请参阅 Boost Web 站点,网址为 http://www.boost.org

与 GNU C 和 C++ 相关的语言扩展

C99 的 GNU C 扩展和标准 C++ 的 GNU 扩展不是业界标准。但是,这些来自开放式源代码(Open Source)社团的非专有语言功能,在一定程度上已获得普遍使用。XL C/C++ 实现 GNU C 和 C++ 扩展的一部分。本发行版中添加了对下列 GNU C 功能的支持。

功能 注释
标号作为值 包括已计算的 goto 语句。此功能现在与 GNU C 实现完全兼容。
类型属性 属性 aligned、packed 和 transparent_union。
函数属性 属性 format、format_arg、always_inline 和 noinline。
变量属性 对属性 section 添加了 C++ 支持。
备用关键字 __extension__ 的实现的内部更改。
嵌套函数 仅用于 C仅 C 支持。
强制类型转型为联合类型 仅用于 C仅 C 支持。
带有可变数目的自变量的宏 当未指定 __VA_ARGS__ 自变量时,使用一个代替 __VA_ARGS__ 的标识,并除去尾部逗号。
带有 C 表达式操作数的 gcc 内联汇编程序指令 仅部分支持。
GNU C 复杂类型 添加了 C++ 支持。
GNU C 十六进制浮点常数 添加了 C++ 支持。
C99 组合文字 添加了 C++ 支持。
长度为零的数组 添加了 C++ 支持。
可变长度数组 添加了 C++ 支持。

易于使用

新增的 C++ 编译器调用

为了实现在所有受支持平台之间的可移植性,添加了编译器调用 xlc++。该调用等价于所有平台上的 xlC 调用,建议采用。然而,xlC 仍完全受支持。

文档

为编译器调用命令和每个命令行实用程序提供了手册页。编译器调用的手册页替换了在先前发行版中提供的文本帮助文件。

模板注册表增强

C++ 编译器使用批处理模板实例化模式,该模式涉及模板实例化注册表。在本发行版中,编译器将版本化信息添加至所创建的模板注册表文件。编译器内部使用此信息来跟踪应该使用哪个版本的模板注册表文件格式。

新增的 XL C/C++ 选项

联机文档 中详细描述了新增的和已更改的编辑器选项。

选项 描述和注释
-qabi_version=n 指示编译器使用 C++ ABI 的版本 n,其中 n 可以是:
  • 1,它使用户获得与在 G++3.2 中引入并在 G++3.3 中提供的行为相同的 C++ ABI 行为。
  • 2,它使用户获得与在 G++3.4 中引入的行为相同的 C++ ABI 行为。

缺省值取决于操作系统:

  • 在 SLES 9、RHEL 3 U3 和 Y-HPC 上是 1
  • 在 RHEL 4 上是 2
-qaltivec 启用对 AltiVec 数据类型的编译器支持。缺省选项是 -qnoaltivec
-qasm=gcc 允许部分支持带 C 表达式操作数的汇编程序指令。指示编译器识别 asm 关键字及其备用拼写并将 gcc 语法和语义用于该关键字。缺省选项是 -qnoasm
-qasm_as 指定用于调用备用汇编程序的路径和标志以便处理 asm 伪指令中的代码。此选项覆盖在编译器配置文件中定义的 as 命令的缺省设置。
-qdirectstorage 声明可在给定的编译单元中引用启用直写或禁止高速缓存的存储器。此选项的目的是为了避免由于 PowerPC 体系结构允许的不同存储器控制属性而引起的意外行为。缺省选项是 -qnodirectstorage
-qenablevmx 指示编译器在任何编译器阶段中生成 VMX(AltiVec)代码。此选项确保开发环境中操作系统的 -qaltivec 缺省设置正确。对于 RHEL 3 U3 和 Y-HPC,缺省选项是 -qnoenablevmx。对于 RHEL 4 和 SLES 9,缺省选项是 -qenablevmx
-qkeepparm 确保在寄存器中传递的函数参数将保存至堆栈,而不是可能移至不同内存位置来提高性能。缺省选项是 -qnokeepparm
-qipa=threads[=N] | nothreads 指示优化器创建 N 个线程并且最多并行运行 N 个后端,其中 N 是一个整数,范围为 1-MAXINT。缺省选项为 nothreads 子选项,它等价于运行单个串行进程。可使用此功能来在多处理器计算机上减少 IPA 链接时间。
-qnoprefetch 指示编译器不自动插入软件预取指令,从而允许用户关闭这方面的优化。缺省选项是 -qprefetch
-qnotrigraph 指示编译器不解释三字母词序列,而无论指定的语言级别如何。在 Linux 上,缺省选项是 -qtrigraph
-qsaveopt 指示编译器保存将源文件编译成相应的目标文件所使用的命令行选项。如果编译未产生 .o 文件,则该选项无效。缺省选项是 -qnosaveopt
-qshowpdf 当与 -qpdf1 一起指定,且优化级别为 -O 或更高时,编译器将额外的概要分析信息插入已编译的应用程序中以收集应用程序中所有过程的调用和块计数。运行已编译的应用程序会将调用和块计数记录到文件 ._pdf 中。然后可使用 showpdf 实用程序来检索 ._pdf 的内容。缺省选项是 -qnoshowpdf
-qsourcetype 控制输入文件名的解释。缺省行为是源文件的编程语言暗含在其文件名的后缀中。缺省选项是 -qsourcetype
-qutf 启用对 UTF 文字语法的识别,该语法提供针对 Unicode 编码格式的 16 位和 32 位的字符串文字。
-qflttrap=nanq 指示编译器在代码中生成额外的指令以捕获 NaNQ(Not a Number Quiet)。目的是检测由浮点指令处理或生成的所有 NaNQ,包括有效操作所创建的那些 NaNQ。
-qhot=simd 指示编译器尝试自动 SIMD 向量化。缺省选项是 -qhot=nosimd
-qipa=infrequentlabel 指定在一般程序运行期间可能很少被调用的一组标号。通过减少对这些标号调用的优化,编译器可使程序的其它部分运行更快。此选项仅适用于用户定义的标号。
IBM Copyright 2003