将Linux C/C++应用程序从x86平台移植到IBM PowerLinux
- UID
- 852722
|
将Linux C/C++应用程序从x86平台移植到IBM PowerLinux
在大多数情况下,将 Linux 应用程序从 x86 平台移植到 Linux on Power 很简单,因为两个平台都基于来自 Novell SUSE 或 Red Hat 的同一个 Linux 版本。移植常常只需要执行一次 GNU Compiler Collection (GCC) 再编译,对一些编译器和链接器开关稍作更改。
但是,为解决突然出现的未知问题做好准备是拥有一个成功端口的重要优势。通常,如果重点关注的是移植,将优化放在以后进行,那么本文中介绍的指南、技术和工具可以最大程度地降低(甚至可能消除)移植到 Linux on Power 的难度。
在某些情况下,当您单独在一种特定硬件架构(比如 x86)上设计应用程序时,有时可能需要做一些额外的修改。本文会重点介绍与将 x86 系统上运行的 LInux 应用程序移植到基于 IBM POWER® 处理器的系统相关的一些差异,本文还提供了让 x86 代码为移植到 Linux on Power 做好准备的一些建议。
- 您应用程序的字节顺序
- 32 位和 64 位数据类型(长度和对齐方式)
- 理解可用的编译器选择 - GCC(分发和 Advance Toolchain)和 IBM XL C/C++ 编译器。
- 使用 IBM SDK for Linux 和 IBM Rational Developer for Power Systems - 使用 GNU C/C++ 编译器构建大型程序。
应用程序开发人员可以在 Power Linux 上使用一些高级工具和技术,其中包括 IBM Software Development Kit for PowerLinux (SDK),这是一个免费、基于 Eclipse 的集成开发环境 (IDE)。该 SDK 集成了 C/C++ 源代码开发与 Advance Toolchain、链接后优化和经典的 LInux 性能分析工具(包括 OProfile、Perf 和 Valgrind)。
计划移植
将应用程序移植到一个新平台时,恰当的计划不可或缺。要为移植做好充足的准备,您应该:
- 以可视方式扫描代码,尤其需要注意那些可能错误匹配的赋值运算,以及位操作和比较。
- 理解 IBM Power® 平台架构要点,以及 x86 与 IBM POWER 处理器架构之间的差异 - 特别是您应用程序的字节顺序。
- 确定使用哪个 Linux on Power 发行版:Red Hat Enterprise Linux 或 Novell SUSE Linux、CentOS 还是 Ubuntu。
- 考虑使用 GNU Make 构建系统。
- 确定要使用哪个编译器:GCC 或 IBM XL C/C++ for Linux。
- 获取一个用于开发的 IBM Power 服务器。下面列出了一些选择:
- 查看下面的程序,确定是否有个程序可以帮助加快移植并取得成功。
Power Development Cloud
这个完全自动化的 IBM Power Development Cloud 是一个免费的平台即服务 (PaaS),可用于使用 IBM 平台开发和演示软件解决方案。您可以利用 IBM Linux on Power 开发堆栈,它已预先配置和安装了针对从 x86 移植到 Linux on Power 的开发工具。
IBM Hardware Mall – 租赁和折扣
Hardware Mall 旨在激励独立软件供应商 (ISV) 在 IBM 平台上开发软件解决方案,为他们提供了系统硬件和适用软件的重要购买折扣和低租赁费率。
IBM Systems Application Advantage for Linux (Chiphopper)
IBM Chiphopper™ 产品是一个应用程序移植或重新托管程序,旨在免费帮助 IBM 业务合作伙伴启动、测试和支持其在竞争平台上运行的现有 Linux 应用程序向运行 LInux 和中间件平台的 IBM Power Systems™ 的移植。
IBM Innovation Center
IBM Innovation Center 提供了培训和一对一指导,涉及从构建到营销和销售解决方案的方方面面。IBM Innovation Center 团队随时准备帮助您实现开发目标
您可以在 解决方案开发硬件 网站上找到并利用所有这些服务。
理解 Power 平台的差异
您要移植到的 Power 硬件平台,确定了您在编译应用程序时想要使用的优化选项。您应考虑以哪个处理器版本为基础,例如 IBM POWER5、IBM POWER6®、IBM POWER7® 或 IBM POWER8™。为基于 POWER 处理器的系统开发一般性的代码非常容易,最终的应用程序将在多个系统上正常运行。针对 IBM 较新的几代 POWER 产品开发应用程序也很容易。一个重要的选择是选择使用 GCC 编译器还是 XL C/C++ 编译器。更多细节将在本文后面讨论。
编译器:
多年来,GCC 技术已得到显著改进,能够为基于 IBM POWER7 和 POWER8 处理器的服务器提供经过调优的应用程序。此外,如果性能是终极目标,那么 IBM XL 编译器可以实现更高的性能。
- 如果在 Linux on x86 上使用 GCC,推荐使用 GCC 完成初始移植。Linux on Power 上的 GCC 技术已显著改进,熟悉 GCC 会使得以它为基础进行移植变得更轻松。
- 如果需要的话,您还可以使用 IBM XL C/C++ 编译器。
- 如果在 Linux on x86 上使用 Java™,那么推荐从 IBM 网站下载并使用合适的 IBM Java 工具包。
编译器标志:
移植到基于 POWER 处理器的服务器时,可以在 XL C/C++ 编译器中对 -qarch 和 -qtune 使用不同标志,或者在 GCC 编译器编译器中对 -mcpu 和 -mtune 使用不同标志来优化应用程序。但是,对于初始移植,为了最大限度降低难度,最好使用基于 Power 的最常见的 –qtune=ppc和 –mcpu=power。具体的标志和使用它们的时机将在本文后面讨论。
确定使用哪个 Linux on Power 发行版
来自 Novell 和 Red Hat 的最新的操作系统产品(本文发表时)提供了完成企业级部署所需的技术、支持和可靠性。首选产品的选择通常在一个公司或组织内要考虑的事项。
- SUSE Linux Enterprise Server (SLES)。
- Red Hat Enterprise Linux (RHEL)。
使用 SLES 还是 RHEL 的决定不会对移植过程产生直接影响。但是,SUSE 和 Red Hat 拥有不同的发布和更新周期,在二进制兼容性上具有不同的策略,从长远角度讲,这些可能影响您的应用程序更新决策。此外,Red Hat 和 SUSE 发行版按相同的时间表发布对 Intel® 和 Power 的支持。
迁移到 GNU Make
如果目前尚未使用 GNU Make 构建应用程序,那么您可以考虑迁移到该应用程序。一种不错的编程实践是:使用一个能控制可执行文件的生成的工具,而不依赖于脚本或直接调用编译器来生成可执行文件。大多数 C 和 C++ 编程人员都使用 Make 作为这样的工具。切换到 GNU Make,这样您就能通过同一个构建控件 makefile 在多个平台上执行一致的构建操作。GNU Make 同时具有 SLES11 和 RHEL6 版本。有关 GNU Make 的更多信息,请参阅 “参考资料” 部分。
假设您的 Linux on x86 应用程序是使用 GCC 构建的,那么我们推荐首先使用 GCC 在 Power 上重新编译的简单方法。后续步骤将会添加简单的调优和优化选项供考虑。如果需要的话,接下来的一个步骤将是考虑 IBM XL 编译器,以便实现针对特定 IBM Power Architecture® 级别调优的更高性能。
理解 x86 与 Power Architecture 衍生产品之间的差异
在将 x86 Linux 应用程序移植到 Power Systems 之前,您应该知道一些特定于架构的差异。在接下来的两节中,我们将详细介绍一些特别值得注意的架构差异:
- 字节顺序
- 32 位和 64 位应用程序环境中的数据类型长度
- 架构中的数据对齐方式差异
我们稍后将会介绍对比 x86 和 Power 应用程序时的一些额外的考虑因素。优化考虑因素示例包括使用多个线程优化吞吐量,评估简单锁定模式的使用,等等。
字节顺序
尽管 POWER 处理器可同时支持高位优先和低位优先(字节排序模式),但最新的实现都使用一种高位优先架构,而 x86 处理器使用了一种低位优先架构。本节介绍字节顺序问题,以及处理它们的技术。在将低级 应用程序、设备驱动程序或数据文件从 x86 架构移植到 Power Architecture 期间,开发人员通常会遇到一些字节排序问题。高级 应用程序在移植时很少遇到字节顺序问题,但在从 x86 移植到 Power 时需要解决此问题。
字节排序会影响整数和浮点数据,但不会影响字符串,因为它们会保持编程人员看到和想要的字符串顺序。所以,原始 ASCII 文本文件可正常使用,但与机器独立的数据文件可能受到硬件字节顺序问题的影响。例如,JPEG 文件被存储为高位优先格式,而 GIF 和 BMP 文件被存储为低位优先格式。
高位优先和低位优先
字节顺序指数据元素和它的各个字节在内存中存储和寻址的方式。在多位数中,具有更高数量级的位被视为更重要的位。例如,在 4 位数 8472 中,4 比 7 更重要。类似地,在多字节数字数据中,字节持有的值越大,它就越重要。例如,十六进制值 0x89ABCDEF 可拆分为 4 个字节:0x89、0xAB、0xCD 和 0xEF,分别具有算术值 0x89000000、0xAB0000、0xCD00 和 0xEF。显然,字节 0x89 是最大的值;因此它是最重要的字节,而字节 0xEF 是最小的部分,因此是最不重要的字节。
将一个数字放在内存中时,从最低的地址开始,只有两个有意义的选项:
- 首先放置最不重要的字节(低位优先)。
- 首先放置最重要的字节(高位优先)。
下图显示了高位优先和低位优先处理器如何将 32 位十六进制值(比如 0x89ABCDEF)放入内存中:
图 1. 存储十六进制值的高位优先和低位优先处理器
0x89 是最重要的字节,而 0xEF 是最不重要的字节。在高位优先系统上,最重要的字节放在最低的内存地址上。在低位优先系统上,最不重要的字节放在最低的内存地址上。
如果程序将一个单词写入内存中,然后读取相同位置作为一个单词,那么字节排序不存在问题,因为在采用一致的方式引用某个变量时,看到的会是同一个值。如果程序尝试一次读取同一个值的一个字节(在写入一个单词时),根据处理器采用低位优先还是高位优先格式,它可能获得不同的结果。
IBM POWER 处理器系列是使用高位优先数据布局的系统示例,而 x86 处理器系列是使用低位优先数据布局的系统示例。识别依赖于字节顺序的代码段,并将它们转换为等效的高位优先格式,这在将 x86 应用程序迁移到 Power 平台期间很重要。 |
|
|
|
|
|