如何在 POWER 上安装使用 IBM XL C.docx
《如何在 POWER 上安装使用 IBM XL C.docx》由会员分享,可在线阅读,更多相关《如何在 POWER 上安装使用 IBM XL C.docx(39页珍藏版)》请在冰豆网上搜索。
如何在POWER上安装使用IBMXLC
如何在POWER上使用IBMXLC/C++AdvancedEditionV7.0forLinux:
GCC用户指南
窗体顶端
窗体底端
内容:
简介
XLC/C++概述
版本7中的新功能
编译器模式
XLC/C++文档
安装和配置XLC/C++
XLC/C++中的优化选项
检查对GNUgcc和gcc-c++语言扩展的依赖
在32位和64位编译器模式之间切换
模板实例化
运行时链接
XLC/C++支持的GCC功能
可重新发布的库
链接顺序
运行时错误诊断
编译器选项
结束语
词汇
参考资料
作者简介
对本文的评价
订阅:
developerWorks时事通讯
级别:
初级
ChakaratSkawratananond,技术顾问,IBM
NamKeung,高级程序员,IBM
CalvinSze,Linux顾问,IBM
2005年1月10日
本文旨在帮助研究基于IBM®POWER™处理器的系统的Linux™开发人员快速从GNUgcc和gcc-c++编译器(称为GCC)迁移到IBMXLC/C++AdvancedEditionV7.0。
本文是对2003年7月首次出版的“HowtoUseIBMVisualAgeC++Version6.0forLinuxonIBMpSeriesandiSeries”一文的更新。
简介
XLC/C++AdvancedEditionforLinux是基于标准的命令行编译器,用于在基于POWER处理器的系统上运行的Linux。
它是VisualAge®C++V6.0forLinux的后续版本。
XLC/C++不仅使用IBMPOWER、POWER3™和POWER4™的功能,而且还添加了对新的POWER5™和POWER970处理器的支持。
本文介绍了XLC/C++V7.0forLinux编译器中添加的新功能并着重讲述了GCC和XLC/C++之间的各种区别。
在本文中,我们用XLC/C++表示IBMXLC/C++V7.0forLinux。
术语LinuxonPOWER是指在基于IBMPOWER处理器的系统上运行的Linux操作系统。
本文要说明的主题包括:
1.版本7.0中的新功能。
2.如何设置XLC/C++的编译环境。
3.优化选项。
4.检查对GNUgcc和gcc-c++扩展的依赖。
5.32/64位编译器模式。
6.模板实例化。
7.运行时链接。
8.XLC/C++支持的GCC功能。
9.可重新分布的库。
10.链接顺序。
11.对运行时错误的诊断。
XLC/C++提供了大量为POWERArchitecture量身定做的优化选项,其中包括POWER5和POWER970处理器。
在许多情况下,对于POWER基于处理器的系统,使用XLC/C++构建的应用程序显示了比使用GCConLinux构建的那些应用程序更显著的性能提高。
如果您想充分利用POWERArchitecture的潜能,我们建议您使用XLC/C++。
XLC/C++forLinux现在可以在SUSELinuxEnterpriseServer9forPOWER(SLES9)和RedHatEnterpriseLinuxASV3(RHEL3)Update3上使用。
在IBMXLC/C++AdvancedEditionforLinux站点中,可以发现更多信息。
XLC/C++概述
XLC/C++是LinuxonPOWER的优化的、基于标准的命令行编译器。
可以将XLC/C++用作后缀为.c(小写c)的文件的C编译器,或用作后缀为.C(大写C)、.cc、.cpp或.cxx的文件的C++编译器。
XLC/C++支持C的两种ISO编程语言规范:
C89和C99。
该编译器还支持两种C++标准:
StandardC++和C++98。
另外,编译器还支持许多语言扩展,包括GNUgcc和gcc-c++语言扩展的子集。
XLC/C++创建二进制或对象文件,这些文件与由GCC生成的文件相兼容。
为了获得这种兼容性,在同一系统上,使用XLC/C++编译的程序与GCC使用的那些程序包含相同的头文件。
XLC/C++使用GNUgcc和gcc-c++头文件,生成的应用程序与通过GCC提供的C和C++运行时库链接。
因此,应用程序的一部分可以使用XLC/C++构建获得优化,然后将其与使用GCC构建的那部分组合来生成应用程序,该应用程序运行性能就好像是由GCC或XLC/C++单独构建的。
LinuxonPOWER的XLC/C++和GCC之间的关系可以概括如下:
1.编译使用Linux分布的GNUgcc和gcc-c++头文件。
2.编译使用GUN汇编程序。
3.链接使用GUN链接程序。
4.编译的程序使用GNUgcc和gcc-c++运行时库。
5.调试使用GNU编译器,gdb。
6.POWER处理器的IBM内置功能与GNUgcc/gcc-c++内置功能共存。
版本7中的新功能
这一节将重点介绍XLC/C++forLinux新增功能中的一小部分。
有关新功能的完整列表,请参阅安装XLC/C++时提供的GettingStartedwithXLC/C++。
性能与优化
1.对选项-qarch和-qtune的优化。
把对POWER5和POWER970架构的支持添加到选项-qarch和-qtune中。
例如:
-qarch=pwr5,-qarch=ppc970,-qtune=pwr5,-qtune=ppc970
2.通过–qaltivec(仅POWER970)和–qenablevmx支持VectorMultimediaExtensions(VMX)。
3.随编译器提供了IBMMathematicsAccelerationSubsystem(MASS)向量库。
向量库是线程安全的,通过相应的libm例程提供改善的性能。
符合行业标准
1.对于C、C++和Fortran,XLC/C++支持OpenMPAPIV2.0。
2.在版本7中,用XLC/C++实现了更多的GNUgcc和gcc++扩展。
(有关的完整列表,请参见GettingStartedwithXLC/C++中的表。
)
3.增强的Unicode和NLS支持。
添加了新数据类型以支持UTF-16和UTF-32。
新功能
1.gxlc和gxlc++Utilities。
它们是一些调用方法,将GNUgcc或gcc-c++调用命令转换为相应xlc或xlc++命令以调用XLC/C++编译器。
要使用gcc–ansi选项来编译HelloWorld程序的C版本,可以使用:
gxlc-ansihello.c
其转换为:
xlc–F:
c89hello.c
然后使用此命令来调用XLC编译器。
gxlc和gxlc++有助于最大程度地减少对使用GNU编译器构建的现有应用程序的makefile的更改。
它们支持GCC选项的主要部分,配置文件gxlc.cfg控制它们的操作。
对于未转换的输入选项,gxlc和gxlc++将返回警告。
虽然gxlc和gxlc++方便了到XLC/C++的转换,从而可以充分使用XLC/C++的功能,但我们建议您使用XLC/C++调用方法及其相关选项。
2.XLC/C++将版本信息添加到创建的模板注册文件中。
编译器在内部使用这条信息来跟踪应该使用的模板注册文件格式的版本。
3.为编译器调用命令和每个命令行实用程序都提供了手册页。
编译器模式
XLC/C++的默认位置是/opt/ibmcmp。
XLC/C++包含各种调用命令。
每个命令都有相应的线程安全版本。
构建多线程应用程序时,要使用线程安全版本(除了gxlc和gxlc++)。
下表显示了可用调用命令。
表1.可用调用命令
调用命令
线程安全变量
描述
xlC或xlc++
xlC_r或xlc++_r
源文件作为C++代码进行编译
xlc
xlc_r
源文件作为C代码进行编译。
该模式包含下列编译器选项:
-qlanglvl=extc89、-qalias=ansi、-qcpluscmt、-qkeyword=inline
c89
c89_r
编译器执行ISOC89标准。
此调用包含下列编译器选项:
-qlanglvl=stdc89,-qalias=ansi、-qstrict_induction、-qnolonglong、-D_ANSI_C_SOURCE、-D__STRICT_ANSI__
c99
c99_r
编译器执行ISOC99标准。
此调用包含下列编译器选项:
-qlanglvl=stdc99、-qalias=ansi、-qstrict_induction、-D_ANSI_C_SOURCE、-D_ISOC99_SOURCE、-D__STRICT_ANSI__
cc
cc_r
用于不需要遵守C89和C99的遗留C代码。
此调用包含下列编译器选项:
-qlanglvl=extended、-qnoro、-qnoroconst
xlCcore或xlc++core
XlCcore_r或xlc++core_r
与xlC和xlc++相同,但是编译器将仅链接到运行时库的内核。
如果想将应用程序链接到其他运行时库,而不是链接到随XLC/C++一起提供的运行时库,那么可以使用这个调用
gxlc或gxlc++
转换方法,该方法将GNUgcc或gcc-c++调用命令转换为相应xlC或xlc++命令并调用XLC/C++编译器
在大多数情况下,应该使用xlC命令来编译C++源文件,使用xlc命令来编译C源文件。
如果既拥有C文件又拥有C++对象文件,那么可以使用xlC进行链接。
注意,在VisualAgeV6.0中,调用xlc意味着使用的是选项-qlanglvl=stdc89,而不是在XLC/C++V7.0中的-qlanglvl=extc89。
XLC/C++文档
安装XLC/C++时提供下列PDF文档:
1.XLC/C++forLinuxGettingStarted(getstart.pdf)。
2.XLC/C++forLinuxInstallationGuide(install.pdf)包含有关安装编译器和启用手册页的说明。
3.XLC/C++forLinuxC/C++LanguageReference(language.pdf)包含关于IBM支持的C和C++语言的信息。
4.XLC/C++forLinuxCompilerReference(compiler.pdf)包含关于各种编译器选项、编译指令、宏和内置函数信息,这些信息包括那些用于并行处理的信息。
5.XLC/C++forLinuxProgrammingGuide(proguide.pdf)包含其他出版物中尚未涉及的关于使用XLC/C++编程的信息。
在下列位置可以找到这些文档:
1.安装CD的/docs/LANG/pdf目录,其中LANG表示语言和位置代码。
2.安装编译器后的/opt/ibmcmp/vacpp/7.0/doc/LANG/pdf目录。
产品文档的HTML版本安装在/opt/ibmcmp/vacpp/7.0/doc/LANG/html目录。
在这个目录中打开index.html文件可以查看HTML文件。
安装和配置XLC/C++
为了获得与GNUgcc和gcc-c++编译器的二进制兼容,必须首先安装下列包:
表2.RHEL3
GCC先决条件
版本要求
gcc
3.2.3
gcc-c++
3.2.3
glibc-devel(32和64位)
2.3.2
libstdc++-devel(32和64位)
3.2.3
表3.SLES9
GCC先决条件
版本要求
gcc
3.3.3
gcc-c++
3.3.3
gcc-64bit
9
glibc-devel-64bit
9
libstdc++-devel-64bit)
9
SLES9还需要java2和java2-jre包版本1.3.1。
有关安装编译器的详细信息,请参阅XLC/C++forLinuxInstallationGuide。
安装XLC/C++后,我们建议您在开始使用编译器之前,先运行名为new_install的工具(默认情况下,这个工具位于/opt/ibmcmp/vac/7.0/bin)。
然后,这个工具会执行vac_configure脚本并创建适当的配置文件。
配置文件保存XLC/C++应该使用的32位和64位GCC编译器的位置。
该文件是必需的,因为系统中可能会安装多个GCC,XLC/C++需要知道应该使用哪个GCC。
XLC/C++提供名为vac_configure的实用程序(默认情况下,该程序位于/opt/ibmcmp/vac/7.0/bin),帮助创建和更新配置文件。
默认配置文件是/etc/opt/ibmcmp/vac/7.0/vac.cfg。
XLC/C++CompilerReference文档中有vac_configure的语法。
还可以使用下列编译器选项指定标准包含路径:
表4.编译器选项
选项名称
描述
-qgcc_c_stdinc=
指定GNUgcc头文件的新目录搜索路径
-qgcc_cpp_stdinc=
指定GNUgcc-c++头文件的新目录搜索路径
-qc_stdinc=
指定IBMC头文件的新目录搜索路径
-qcpp_stdinc=
指定IBMC++头文件的新目录搜索路径
XLC/C++中的优化选项
XLC/C++提供了适合IBM硬件的优化选项组合。
在许多情况下,对于LinuxonPOWER,使用XLC/C++编译的应用程序显示了比那些使用GCC编译的应用程序更显著的性能提高。
应该注意的是,对于所有应用程序,并不是所有优化都是有利的。
通常必须在编译器进行的优化与编译时间增加(伴随着调试能力减低)的程度之间进行平衡。
优化级别
优化级别由编译器选项指定。
下表汇总了每一优化级别上的编译器行为。
表5.编译器行为
选项
行为
-qnoopt
快速编译,完全调试支持
-O2(与-O相同)
执行编译器开发人员认为是编译速度和运行时性能最佳组合的优化。
如果没有使用-qnostrict_induction或-qnostrict明确否定,那么这个设置中将包含-qstrict和–qstrict_induction
-O3
执行内存占用大、编译时间长或两者都有的其他优化。
当运行时改善比最大程度地减少编译资源使用重要时,建议使用这些优化
-O4和-O5
执行过程间优化、循环优化和自动计算机调整
特定处理器架构的优化
目标计算机选项是指示编译器为给定微处理器或架构系列上的最佳执行生成代码的那些选项。
您可以通过优化,来满足目标处理器、给定处理器架构系列内的一系列处理器或特定处理器的最大范围的可能选择。
下列选项将控制影响目标计算机的单独某些方面的优化。
表6.优化选项
选项
行为
-qarch
选择应该为其生成指令代码的处理器架构系列。
默认值是-qarch=ppc64grsq。
还可以使用以下子选项:
auto、pwr3、pwr4、pwr5、ppc970、ppc64、ppcgr、rs64b、rs64c
-qtune
偏向于对给定微处理器上的执行操作进行优化,但这并不意味着将与指令集合架构有关的任何操作作为目标。
Linux上的默认值是-qtune=pwr3。
可用的子选项包括:
auto、pwr3、pwr4、pwr5、ppc970、rs64b、rs64c
-qcache
定义特定缓存或内存几何。
如果使用了–qcache,则将-qhot或-qsmp与其一起使用
-qhot
High-OrderTransformations:
该优化可以通过诸如交换、合并及展开等方法特别地提高循环性能。
指定-qhot时,默认值为选项-qhot=vector。
尝试将-qhot与-O2和-O3一起使用。
如果不可能存在转换,该选项的影响是中性的。
-qsmp
生成共享内存并行处理所需的线程代码。
指定-qsmp时,默认值为选项-qsmp=auto。
如果在OpenMP程序中编译且不想进行自动并行化,则使用-qsmp=omp:
noauto。
使用-qsmp时,总是使用_r编译器调用
为了最有效地使用目标计算机选项,应该尝试使用–qarch指定可能的最小计算机系列,它将很好地运行代码。
尝试使用–qtune为实际上指定性能最好的地方。
例如,如果仅POWER5系统中支持应用程序,则使用-O3-qarch=pwr5-qtune=pwr5。
当系统具有可配置的L2或L3缓存选项时,或者当执行模式减少了缓存的共享级别的有效大小时(例如,POWER5中的单片双核的SMP执行),修改缓存配置可能会有用。
POWER平台支持其他平台上无法使用的机器指令。
XLC/C++提供了一组内置函数,直接映射到特定POWER指令。
通过使用这些函数,可以消除函数调用返回成本、参数传递、堆栈调整及所有与函数调用相关的其他成本。
有关支持的内置函数的完整列表,请参阅XLC/C++C++forLinuxonpSeriesCompilerReference文档。
检查对GNUgcc和gcc-c++语言扩展的依赖
严格遵从ISO语言规范的应用程序将具有最大程度的可移植性。
IBMXLC/C++支持一部分GNUgcc和gcc-c++到C和C++的扩展。
可能需要重新看一下依赖不受支持的扩展的代码。
如果使用了任何扩展,GCC选项–pedantic会将引导它打印警告消息。
http:
//gcc.gnu.org中有GNUgcc/gcc-c++扩展的完整列表。
在32位和64位编译器模式之间切换
通过指定编译器选项-q32或-q64,或通过设置环境变量OBJECT_MODE,可以设置XLC/C++生成32位或64位对象。
-q32和-q64选项会覆盖OBJECT_MODE变量设置的值。
如果没有指定-q32和-q64,并且没有设置OBJECT_MODE,那么编译器的默认模式为32位输出模式。
在64位模式中,定义了__64BIT__预处理器宏。
32位和64位对象不能绑定在一起,所以需要确保全部在同一模式中编译所有对象。
链接选项还必须反映要链接到的对象类型。
如果具有64位对象,必须使用64位模式链接这些对象。
模板实例化
模板实例化是到C++语言的扩展之一,GCC和XLC/C++对其进行不同处理。
编译器和链接程序需要确保每个模板实例在可执行程序中确实仅出现一次。
这一节先讨论GCC如何处理模板实例化,然后讨论XLC/C++中的可用选项。
GCC3.2不支持模板储存库的概念,模板储存库是存储模板实例的自动维护的位置。
然而,GCC3.2提供了下列选项:
-frepo
如果使用此选项,那么对于将模板实例化了的每个.cc文件,编译器将生成扩展名为.rpo的文件。
这个.rpo文件包含相应对象文件中使用的模板实例化的清单。
链接时,一些对象文件可能会重新编译和重新链接,以避免符号重复。
-fno-implicit-templates
使用这个选项,开发人员可以确定必须对哪些实例进行实例化。
还有其他几个选项,如-fexternal-templates和-falt-external-templates,但是GCC3.2中不支持这些选项。
XLC/C++中可以使用下列编译器选项:
-qtempinc
使用这个选项,XLC/C++可以确定要实例化的模板代码,作为编译和链接过程的最后一步。
这样做可以防止在最终的可执行程序或库中有重复的模板实例。
该选项要求以特定方式组织源代码。
也就是说,模板的声明和定义必须在单独的文件中。
模板定义需要位于与头文件相同的目录中,并且拥有相同名称,但是具有.cc(小写字母c)后缀。
否则,头文件必须使用#pragmaimplementation("...")语句来标识相应的定义文件。
例如,模板类List的声明和定义文件分别为List.h和List.cc。
在List.h文件中,必须包含语句#pragmaimplementation("List.cc")。
如果没有使用-qtempinc指定目录,那么编译器将在当前目录中创建名为tempinc的目录,用它来保存将在模板中生成的信息。
可以为这个目录选择自己的名称和位置,这样,当创建包含在不同目录中编译的对象文件的可执行程序时,可以使用相同目录。
例如:
xlC-cfoo.cc-qtempinc=../mytemplates
cd..
xlC-oappapp.ccsrc/foo.oqtempinc=mytemplates
因为模板代码实际由编译器在链接时创建,所以当使用具有共享库的模板时(其中没有链接发生),就会出现问题。
在XLC/C++Version5中,引入了选项-qmkshrobj,当创建使用模板的共享对象时,