标题: 将 Linux on x86 应用程序移植到 Linux on Power 的指南(4) [打印本页] 作者: look_w 时间: 2017-11-18 21:50 标题: 将 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 的一些选项应避免使用且有害。
使用 -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++ 风格的注释。