首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GCC POWER 架构标记

GCC POWER 架构标记

架构标记
GCC 对于 POWER 架构可以使用两类扩展指令。第一个集合是为早期的 RS/6000                架构设计的,可以使用 -mpower 标记启用。最近的 POWER 或 PowerPC                硬件不能使用这个标记。相反,它们使用 -mpowerpc 选项,或者它们的 64 位对应的选项                -mpowerpc64,来使用现代 POWER 和 PowerPC 硬件所通用的指令。对于那些希望仍然对传统的 POWER                硬件提供支持的开发人员来说,要么同时使用 -mpower 和 -mpowerpc                标记,要么一个标记也不使用,这是因为这两个标记每个都只启用了针对每一个处理器系列的扩展。如果这两个标记一个都不使用,那么就只会使用那些这两种架构所通用的那些指令。然而,要想对性能进行优化,我们建议您使用                CPU 特有的标记。
CPU 特有的架构标记
CPU                特有的优化标记比处理器系列标记更能提高程序的性能。这些标记会通知编译器为某个特定的 CPU                生成最优化的代码,不过这些代码可能并不能在其他平台上运行。-mtune= 标记用来为一种给定的 CPU                指定调度参数,但是它并不会设置架构的类型、寄存器的用法以及记忆变量。这些是通过 -mcpu= 标记进行控制的。
-mtune= 标记的用法如下:
1
$ gcc -O3 -mtune=power5 -o foo foo.c foo2.c




这个例子引导编译器将源文件 foo.c 和 foo2.c 编译成一个可执行文件,使用优化级别 3,并使用为 POWER5 CPU                定制的调度参数。
-mcpu= 标记的用法如下:
1
$ gcc -O3 -mcpu=power5 -o foo foo.c foo2.c




这个例子引导编译器将源文件 foo.c 和 foo2.c 编译成一个可执行文件,使用优化级别 3,并使用为 POWER5 CPU                定制的调度参数、记忆变量、架构类型以及寄存器的用法。
熟悉 IBM XL C/C++ 的开发人员可能会注意到此处的一个差别。使用 XL C/C++ 时,对应的标记是                -qtune= 和 -qarch=,分别对应 -mtune= 和                -mcpu=。
-mtune= 和 -mcpu= 都可以使用 common 选项,这样会选择 Power 和                PowerPC 架构处理器通用的一个指令集。例如:
1
$ gcc -O3 -mtune=common -mcpu=common -o foo foo.c foo2.c




这个例子会从源文件 foo.c 和 foo2.c 生成一个使用级别 3 进行优化的二进制文件,它可以在任何 POWER 和 PowerPC                处理器上运行,只使用了这两个架构所通用的一些指令。然而,这个二进制文件的性能可能不如使用 CPU                特有的标记进行优化所得到的二进制文件的性能好。另外,powerpc、powerpc64 和                power 选项都可以用来指定自己的 CPU 属性。
这两个选项的全部合法范围包括对旧集合和新机器的支持。然而,POWER 架构上的企业级 Linux 发行版只支持常见的                power3、power4、power5、970、powerpc                和 powerpc64 选项,因为它们都有为企业级硬件所设计的相关指令集。请参阅 GCC                手册中对所支持的指令集和处理器的详细清单。
Vector Multimedia                eXtension,简称 VMX,是 POWER 处理器的单指令多数据(SIMD)架构的扩展。VMX 是由 Apple、IBM、Motorola                PowerPC 联合开发的,每个成员都使用一个不同的名字在市场上进行销售。IBM 称之为 VMX,这是这种技术最原始的代号;而 Apple 称之为                Velocity Engine®;Motorola 使用的名字是 AltiVec®。GCC                并不能识别这种技术的商标名,但是它实现了对这些处理器指令的支持,它使用 AltiVec 作为相关标记的名字。
VMX 提供了 32 个附加 128 位的寄存器来保存向量数据,这可以提供 16 个 8 位的值、8 个 16 位的值或者 4 个 32                位的值。(注意 VMX 寄存器不能操作 64 位的值。)这些寄存器和对其进行操作的 162 条处理器指令就是为什么在处理特殊类型数据时 VMX                可以极大提高性能的原因。例如,我们可以使用向量来并行处理 4 个整数,这需要为此目的而特殊编写代码。
虽然 VMX 为某些算法提供了巨大的优点,但是代码的编写必须实现向量化。不幸的是,对于编译器来说,没有什么魔力可以在后台实现                "自动向量化(autovectorization)"。C 语言中有一些指令可以对底层寄存器的选择提供控制。这些指令、原型以及宏都是在 GNU 的                altivec.h 文件中定义的,可以用来帮助实现这个任务。注意在使用 IBM XL C/C++ 时,并不用显式地在源程序中包含                altivec.h,而在使用 GCC 时,则必须显式地包含这个文件。GCC 为 AltiVec 的内置函数在 GCC 手册的 5.4                节中进行了介绍。
向量通常需要采用新颖的方法才能形成一个好的算法,只有程序员仔细规划代码才可以实现这种功能。实际上,编写得不好的向量代码的运行速度通常比普通的代码都慢,因为它进行对齐的效率很低。VMX                寄存器中处理的数据必须按照 4 个字进行对齐(128                位),程序员要负责确保这些指令所处理的数据缓冲区都是对适当的地址进行对齐的。这需要特别注意通过在 32                位模式中动态内存分配所创建的缓冲区,因为它们只能保证是按照双字进行对齐的。然而,在 64 位模式中,malloc 子系统返回的是按照 4                个字进行对齐的地址。
在线教程“Introduction to Altivec - Ten Easy Ways to Vectorize Your                Code”(PDF)对代码的向量化详尽地进行了介绍。 这篇文章讨论了向量化编码对循环展开和像素操作等所带来的巨大好处。
在 GCC 中,VMX 的功能是使用 -maltivec 和 -mabi=altivec                标记来启用的。
值得注意的是,Apple 的 Mac OS X 操作系统上的 GCC 也支持了它们自己的 AltiVec                扩展的实现,但是稍有区别。区别之一是向量声明的语法,这会影响代码在这些平台之间的迁移。在 GCC for Linux on POWER                中,向量位于花括号 { } 中,而在 GCC for OS X 中,向量则是位于圆括号 ( ) 中。IBM XL C/C++                可以同时支持这两种方法。有关这个问题以及 VMX 实现之间的差异的更多信息,请参阅 “About Compilers with VMX                Support” 的 Web 主页。
表 3. 向量的语法VMX 向量语法GCC for LinuxIBM XLC C/C++GCC for Mac OS X花括号 {...}支持支持不支持圆括号 (...) 不支持支持支持
返回列表