将 Linux on x86 应用程序移植到 Linux on Power 的指南(4)
- UID
- 1066743
|
将 Linux on x86 应用程序移植到 Linux on Power 的指南(4)
数据类型和对齐方式应用程序二进制接口 (ABI) 中重要的 有符号/无符号字符 细微差异。
在 x86/x86_64 下,“char” 的默认值为 “signed char”,而 Power Systems 上的默认值为 “unsigned char”。在 Power Systems 上,可以使用 GCC 指令 -fsigned-char 覆盖该默认值。等效的 IBM XL 指令为 -qchars=signed。
Linux 操作系统上的 GCC 和 XL C/C++ 编译器都提供了两种不同的编程模型:ILP32 和 LP64。ILP32 表示 Integer Long Pointer 32,是 Linux 上原生的 32 位编程环境。ILP32 数据模型提供了一个 32 位地址空间,它的理论内存被限制为 4 GB。LP64 表示 Long Pointer 64,是 Linux 上的 64 位编程环境。
表 1 显示了 POWER 和 x86 平台上的 ILP32 和 LP64 模型中的基础数据类型中的位宽。
表 1. POWER 和 x86 平台上的 ILP32 和 LP64 模型中的基础数据类型(位)
基础数据类型POWERx86
ILP32ILP64ILP32ILP64char
默认值:x86 上为 signed - POWER 上为 unsigned8888Short16161616Int32323232Float32323232Long32643264Long long64646464Double64646464Long double64/128*64/128*96128指针32643264*Linux on Power 上的 long double 的默认大小现在为 128 位。如果使用编译器选项 -qnoldb128 和 XL C/C++ 编译器,那么它们可以减少到 64 位。
在 Power 和 x86 平台上的 /usr/include/limits.h 中,可以找到数字值的所有定义。
许多遗留 Linux x86 应用程序在 32 位下运行。对于最新的 x86 架构(支持并鼓励采用 64 位应用程序),更多的 x86 应用程序是在 64 位模式下原生地更新或编写的。在将 x86 应用程序移植到 Power Systems 的练习中,可采用 Linux on Power 环境作为目标来匹配您的来源环境。换句话说,我们推荐首先完成初始移植,然后再考虑移植到 64 位编程模型。如果希望将 32 位 x86 应用程序移植到 64 位 Power Systems 编程模型,那么可以将迁移分为两步:
- 移植到 Linux on Power 32 位环境(包括测试和验证它)。
- 然后迁移到 64 位环境。
如果应用程序满足以下条件:那么工程师应考虑将应用程序移植到 64 位:
- 能从超过 4GB 的虚拟地址空间受益
- 能够从更多物理内存(大于 4GB)受益,以及用户可能将它部署在具有超过 4GB 物理内存的系统上
- 能够从 64 位大小的长整数受益
- 能够使用完整的 64 位寄存器来执行高效的 64 位算法
- 使用大于 2GB 的文件
一些可通过迁移到 64 位而受益的应用程序示例包括:
- 数据库应用程序,尤其是执行数据挖掘的应用程序
- Web 缓存和 Web 搜索引擎
- 计算机辅助设计 (CAD)/计算机辅助工程 (CAE) 模拟和建模工具的组件
- 科学和技术计算应用程序,比如计算流体动力学、遗传模拟等
应用程序可保留 32 位并仍在 64 位 Linux on Power 内核上运行,无需任何代码更改。基于 IBM Power 处理器的服务器支持 32 位和 64 位应用程序同时在 64 位架构上运行
在不同平台(从 x86 到 Power)或编程模型(从 ILP32 到 LP64)之间移植应用程序时,需要考虑不同环境中提供的数据宽度和对齐设置之间的差异,以避免可能的性能降级和数据损坏。
在从 x86 ILP32 移植到 POWER ILP32 或从 x86 LP64 移植到 POWER LP64 时,您可能注意到,在表 1 中,所有基本数据类型的宽度都保持相同,除了 long double 96 位变为 IPL32 上的 64/128 位,128 位变为 LP64 上的 64/128 位。这意味着您应该检查与 long double 数据类型相关的代码部分。如果计划使用 XL C/C++ 编译器,那么可以使用 -qlongdouble 编译标志在 long double 数据类型上实现最高的兼容性。
表 3. 每个优化级别上的编译器行为
选项行为-qnoopt提供快速编译和完全调试支持。-O2(与 -O 相同)执行被编译器开发人员视为编译速度和运行时性能的最佳组合的优化。此设置会暗中使用 -qstrict 和 -qstrict_induction,除非使用
-qnostrict_induction 和 -qnostrict 进行明确否定。-O3执行更多内存密集型和/或编译时间密集型的优化。在运行时改进比最小化编译资源的利用更重要时,推荐执行这些优化。-O4 和 -O5执行过程间优化、循环优化和自动机器调优。
应避免的旧 Power 选项从 x86 移植到 Linux on Power 时,来自旧 Power Architecture 的一些选项应避免使用且有害。
- 使用 -mminimal-toc 或 -mfull-toc 的 PPC64 构建版本应替换为 -mcmodel=medium(这是默认值)
- -ffloat-store,不会在 Power 上使用
目标机器选项告知编译器生成能够在给定微处理器或架构家族上最优地执行的代码。通过选择合适的目标机器选项,可通过优化来适应最广泛的目标处理器、给定处理器架构家族的许多处理器,或者一个特定的处理器。以下选项会控制影响目标机器的各个方面的优化:
表 4. 影响目标机器的各个方面的优化选项
选项行为-qarch选择应针对其生成指令代码的一个处理器架构家族。默认值为 -qarch=auto。还提供了以下子选项:ppc64grsq、pwr3、pwr4、pwr5、ppc970、ppc64、ppcgr、rs64b 和 rs64c。-qtune针对在给定微处理器上执行而进行的基础优化,没有暗示要用作目标的指令集架构的任何信息。Linux 上的默认值为 -qtune=auto。可用的子选项包括:pwr3、pwr4、pwr5、pwr6、pwr7、pwr8、ppc970、rs64b 和 rs64c。但是,在许多情况下,此设置会基于 –qarch 的设置而自动设置。-qcache定义一种特定的缓存或内存几何结构。如果使用了 -qcache,则与它一起使用 -qhot 或 -qsmp。-qhot高阶转换属于专门通过交换 (interchange)、熔合 (fusion) 和展开 (unroll) 等技术来改善循环性能的优化。指定 -qhot 时,-qhot=vector 是默认选项。您可以尝试将 -qhot 与 -O2 和 -O3 结合使用。它的设计目标是在没有转换机会时产生一种中立效果。-qsmp生成共享内存并行处理所需的多线程代码。指定 -qsmp 时,-qsmp=auto 是默认选项。如果您在编译一个 OpenMP 程序且不想要自动并行化,那么可以使用 -qsmp=omp:noauto。使用 -qsmp 时始终使用 _r 编译器调用。
要最充分地利用目标机器选项,您应该:
- 使用 -qarch,指定您希望代码能在其上良好运行的最小的机器系列。
- 使用 -qtune,指定应具有最佳性能的机器。例如,如果将在基于 POWER8 处理器的系统及更高版本的系统的 Power 服务器上运行应用程序,那么可以使用 -O3 -qarch=pwr8 -qtune=pwr8。
IBM Power 平台支持其他平台上所没有的机器指令。XL C/C++ 提供了一组内置的函数,它们直接对应于某些 POWER 处理器指令。使用这些函数能消除函数调用-返回成本、参数传递、堆栈调整和所有其他与函数调用相关的成本。
但是,在使用 IBM XL C/C++ 编译器重新编译时,最初打算使用 GCC 编译器编译的软件可能需要更多地进行关注。您需要编辑 makefile 来反映 XL C/C++ 编译器的正确路径,该路径默认为 /opt/ibmcmp/。还需要设置针对特定架构的正确的优化标志(比如 -03 -qarch=pwr8 -qtune=pwr8 用于 IBM POWER8 处理器)。
除了针对各种 Power Architecture 衍生产品的优化模式,还可以告诉 XL C/C++ 编译器在通用模式下编译软件。这可以确保跨所有 Power Architecture 衍生产品的兼容性,但会牺牲通过特定于架构的优化所获得的性能优势。在编译 64 位代码时,必须为编译器提供针对 64 位构建版本的标志(即 -q64),因为它在默认情况下为 32 位模式。
下面列出了使用 XL C/C++ 编译器编译面向 GCC 的代码的一些技巧:
- 在默认情况下,GCC 允许在 C 文件中使用 C++ 风格的注释,但这不适合 XL C 编译器 XLC。因为更改一组源文件中的所有注释来遵守 C 风格的注释格式不太合算,所以 XLC 提供了一个 -q 参数来允许使用这些注释:-q cpluscmt。在使用此标志编译 C 代码时,会解释 C 和 C++ 风格的注释。
- 环境变量常常是配置构建脚本的最简单的方式。无需手动编辑配置脚本和 makefile,您应该设置相关的环境变量,比如 $CC 和 $CFLAGS,以便允许通过配置脚本来生成 makefile,而无需手动编辑。
- 配置脚本还需要知道正确的平台类型。平台类型将为 linux-powerpc-unknown-gnu 或 linux-powerpc64-unknown-gnu。您应该通过将 -target= 标志被附加到配置脚本中,为使用 GCC 或 XL C/C++ 的编译设置此平台类型。
- 尽管 IBM XL C/C++ 编译器有许多文档,您仍然可以运行该编译器而不使用参数在控制台显示参数列表,例如 $COMPILER_PATH/bin/cc。
|
|
|
|
|
|