性能和优化

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

特定于体系结构和处理器的代码调整

-qarch 编译器选项控制为指定的机器体系结构生成的特定指令。-qtune 编译器选项调整指令、调度和其它优化方法以在指定的硬件上增强性能。这些选项共同起作用以生成对于指定的体系结构可获得最佳性能的应用程序代码。

XL C/C++ V8.0 增大了可用于 -qarch 编译器选项的子选项列表,以支持那些支持 VMX 指令集的处理器和新提供的 POWER5+ 处理器。提供了下列新的 -qarch 选项:

高性能库

XL C/C++ 包括已充分调整的数学函数,它们可以在很大程度上提高具有大量数学计算的应用程序的性能。这些函数是通过以下高性能库提供的:

Mathematical Acceleration Subsystem(MASS)
MASS 库提供高性能的标量和向量函数来执行普通的数学计算。XL C/C++ Advanced Edition V8.0 for Linux 附带提供的 MASS 库引入了新的标量和向量函数以及对 POWER5 处理器体系结构的新支持。

有关使用 MASS 库的更多信息,请参阅 Using the Mathematical Acceleration Subsystem

基本线性代数子程序(BLAS)
XL C/C++ Advanced Edition V8.0 for Linux 引入了高性能代数函数的 BLAS 集合。您可以使用这些函数执行以下操作:

有关使用 BLAS 函数的更多信息,请参阅 Using the Basic Linear Algebra Subprograms

其它与性能相关的编译器选项和伪指令

下表中的条目描述新增或已更改且在以上各节中尚未提及的编译器选项和伪指令。

此处提供的信息只是一个简短的概述。有关这些编译器选项的更多信息,请参阅 Options for performance optimization

表 2. 其它与性能相关的编译器选项和伪指令
选项/伪指令 描述
-qfloat -qfloat 添加了下列新的子选项:
-qfloat=relax
此子选项降低严格的 IEEE 符合性以换取更快的速度,通常是通过除去某些不重要的浮点算术运算(如涉及右边的零的加法和减法)来实现的。
-qfloat=norelax
这是缺省设置。将严格与 IEEE 保持一致。
-qipa -qipa 添加了下列新的子选项:
-qipa=clonearch=arch{,arch}
指定一个或多个将生成同一指令集的多个版本的处理器体系结构。

XL C/C++ 允许您指定多个将生成指令集的特定处理器体系结构。在运行时,应用程序将检测操作环境的特定体系结构并选择专门用于该体系结构的指令集。

-qipa=cloneproc=name{,name}
指定要为由 clonearch 子选项指定的处理器体系结构克隆的一个或多个函数的名称
-O 指定 -O3 编译器选项现在指示编译器也采用 -qhot=level=0 编译器选项设置。

指定 -O4-O5 编译器选项现在指示编译器也采用 -qhot=level=1 编译器选项设置。

本发行版新增的内置函数

下表列示了本发行版新增的内置函数。有关由 XL C/C++ 提供的内置函数的更多信息,请参阅 Built-in functions for POWER and PowerPC architectures

表 3. XL C/C++内置函数
函数 描述
void __builtin_return_address (unsigned int level); 返回当前函数或它的一个调用程序的返回地址,其中 level 是常量文字,指示要在调用堆栈中扫描的帧数。
void __builtin_frame_address (unsigned int level); 返回当前函数或它的一个调用程序的函数帧地址,其中 level 是常量文字,指示要在调用堆栈中扫描的帧数
int __compare_and_swap(volatile int* addr, int* old_val_addr, int new_val); 执行将单字变量的内容与存储的旧值进行比较的原子操作。
int __compare_and_swaplp(volatile long* addr, long* old_val_addr, long new_val); 执行将双字变量的内容与存储的旧值进行比较的原子操作。
int __fetch_and_add(volatile int* addr, int val); 在单个原子操作中将由 addr 指定的单字增加由 val 指定的数量。
long __fetch_and_addlp(volatile long* addr, long val); 在单个原子操作中将由 addr 指定的双字增加由 val 指定的数量。
unsigned int __fetch_and_and(volatile unsigned int* addr, unsigned int val); 在单个原子操作中,通过将该值与输入 val 参数进行“与”运算,清除由 addr 指定的单字中的位。
unsigned long __fetch_and_andlp(volatile unsigned long* addr, unsigned long val); 在单个原子操作中,通过将该值与输入 val 参数进行“与”运算,清除由 addr 指定的双字中的位。
unsigned int __fetch_and_or(volatile unsigned int* addr, unsigned int val); 在单个原子操作中,通过将该值与输入 val 参数进行“或”运算,设置由 addr 指定的单字中的位。
unsigned long __fetch_and_orlp(volatile unsigned long* addr, unsigned long val); 在单个原子操作中,通过将该值与输入 val 参数进行“或”运算,设置由 addr 指定的双字中的位。
unsigned int __fetch_and_swap(volatile unsigned int* addr, unsigned int val); 在单个原子操作中,将由 addr 指定的单字设置为该值或输入 val 参数并返回内存位置的原始内容。
double __frim(double val); 以双精度格式获取输入 val,将 val 向下舍入为下一个较小的整数值,并以双精度格式返回结果。仅对 POWER5+ 处理器有效。
float __frims(float val); 以浮点格式获取输入 val,将 val 向下舍入为下一个较小的整数值,并以浮点格式返回结果。仅对 POWER5+ 处理器有效。
double __frin(double val); 以双精度格式获取输入 val,将 val 四舍五入为最接近的整数值,并以双精度格式返回结果。仅对 POWER5+ 处理器有效。
float __frins(float val); 以浮点格式获取输入 val,将 val 四舍五入为最接近的整数值,并以浮点格式返回结果。仅对 POWER5+ 处理器有效。
double __frip(double val); 以双精度格式获取输入 val,将 val 向上舍入为下一个较大的整数值,并以双精度格式返回结果。仅对 POWER5+ 处理器有效。
float __frips(float val); 以浮点格式获取输入 val,将 val 向上舍入为下一个较大的整数值,并以浮点格式返回结果。仅对 POWER5+ 处理器有效。
double __friz(double val); 以双精度格式获取输入 val,将 val 舍入为最接近零的下一个整数值,并以双精度格式返回结果。仅对 POWER5+ 处理器有效。
float __frizs(float val); 以浮点格式获取输入 val,将 val 舍入为最接近零的下一个整数值,并以浮点格式返回结果。仅对 POWER5+ 处理器有效。
long __ldarx(volatile long* addr); 生成“装入双字并保留索引”(ldarx)指令。可以将此指令与随后的 stwcx. 指令配合使用以在指定的内存位置实施“读-修改-写”。
int __lwarx(volatile int* addr); 生成“装入单字并保留索引”(lwarx)指令。可以将此指令与随后的 stwcx. 指令配合使用以在指定的内存位置实施“读-修改-写”。
int __stdcx(volatile long* addr, long val); 生成“存储双字条件索引”(stdcx.)指令。可以将此指令与前面的 ldarx 指令配合使用以在指定的内存位置实施“读-修改-写”。
int __stwcx(volatile int* addr, int val); 生成“存储单字条件索引”(stwcx.)指令。可以将此指令与前面的 lwarx 指令配合使用以在指定的内存位置实施“读-修改-写”。
unsigned long __mftb(); 生成“从时基移动”(mftb)硬件指令。
unsigned int __mftbu(); 生成“从时基上面移动”(mftb)硬件指令。

相关信息