Sun Studio 12:C 用户指南

B.2.68 -xarch=isa

指定指令集体系结构 (instruction set architecture, ISA)。如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。如果选择不当,则会导致二进制程序在预定的目标平台上无法执行。


注 –

使用 -m64-m32 选项可分别指定预定的内存模型:LP64(64 位)或 ILP32(32 位)。-xarch 选项不再指明内存模型,但为了与以前发行版兼容的情况除外,如下所示。


虽然 -xarch 可单独使用,但它是 -xtarget 选项扩展的一部分,并可能会用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。例如:


% cc -xtarget=ultra2 -xarch=v8plusb ...

会覆盖 -xtarget=ultra2 设置的 -xarch=v8

B.2.68.1 用于 SPARC 的 -xarch 标志

下表详细说明了使用指定的 -xarch 选项编译后由各种 SPARC 处理器执行的可执行程序的性能。此表的目的在于帮助您识别适合您的可执行程序在特定目标机器上运行的最佳 -xarch 选项。首先识别您关心的机器的范围,然后考虑维护多个二进制程序的成本与在较新的机器上获得最高性能的好处。

表 B–12 -xarch 矩阵
 

SPARC 机器指令集: 

   

V8a 

V8 

V9 

(非 Sun 处理器) 

V9 

(Sun 处理器) 

V9b 

 

v8a 

-xarch 编译选项 

v8 

PD 

 

v8plus 

NE 

NE 

 

v8plusa 

NE 

NE 

** 

 

v8plusb 

NE 

NE 

** 

NE 

 

v9 

NE 

NE 

 

v9a 

NE 

NE 

** 

 

v9b 

NE 

NE 

[**]

NE 

**注:使用此指令集编译的可执行程序可能会在 V9 非 Sun 处理器芯片中在名义上执行,或者根本不执行。请咨询硬件供应商,以确保您的可执行程序可在其目标机器上运行。 

如果要使用 v8plus v8plusa 指令集编译可执行文件,请考虑改用 v9 v9a 进行编译。提供了 v8plusv8plusa 选项,因此程序可在支持 64 位程序的 Solaris 8 软件可用之前利用一些 SPARC V9 和 UltraSPARC 功能。使用 v8plusv8plusa 选项编译的程序不可移植到 SPARC V8 或更旧的机器上。可以分别使用 v9v9a 重新编译此类程序,以充分利用 SPARC V9 和 UltraSPARC 的所有功能。可通过 Sun 代表获得《The V8+ Technical Specification》白皮书,文件号码为 8027447-10,此书解释了 v8plusv8plusa 的限制。

对于任何特定选择,生成的可执行文件在早期体系结构中运行时都会慢得多。此外,虽然在多数指令集体系结构中都可以使用四精度(REAL*16long double)浮点指令,但编译器不在它生成的代码中使用这些指令。

下表提供了 SPARC 平台上每个 -xarch 关键字的详细信息。

表 B–13 用于 SPARC 平台的 -xarch 标志

标志 

含义 

generic

使用大多数处理器通用的指令集。这是缺省设置。 

generic64

为了在大多数 64 位平台上获得良好性能而进行编译。(仅适用于 Solaris)。 

该选项与 -m64 -xarch=generic 等效,之所以提供它是为了与早期发行版兼容。可使用 -m64 指定 64 位编译,来取代 -xarch=generic64

native

为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。 

native64

为了在此系统上获得良好性能而进行编译(仅适用于 Solaris)。该选项与 -m64 -xarch=native 等效,之所以提供它是为了与早期发行版兼容。

sparc

针对 SPARC-V9 ISA(但不包括可视化指令集 (Visual Instruction Set, VIS) 和其他实现特定的 ISA 扩展)进行编译。该选项使编译器能够生成可在 V9 ISA 上获得良好性能的代码。 

sparcvis

针对 SPARC-V9(外加可视化指令集 (Visual Instruction Set, VIS) 版本 1.0 和 UltraSPARC 扩展)进行编译。该选项使编译器能够生成可在 UltraSPARC 体系结构上获得良好性能的代码。 

sparcvis2

此选项允许编译器为带有 UltraSPARC III 扩展和可视化指令集 ( Visual Instruction Set, VIS) 2.0 版的 UltraSPARC 体系结构生成目标代码。 

sparcfmaf

允许编译器使用 SPARC-V9 指令集和 UltraSPARC 扩展(包括可视化指令集 (Visual Instruction Set, VIS) 版本 1.0 和 UltraSPARC-III 扩展以及可视化指令集 (Visual Instruction Set, VIS) 版本 2.0 和用于浮点乘加的 SPARC64 VI 扩展)中的指令。 

必须结合使用 -xarch=sparcfmaffma=fused 以及一些优化级别,使编译器尝试寻找机会来自动使用乘加指令。

v7

针对 SPARC-V7 ISA 进行编译。(已废弃)

当前的 Solaris 操作系统不再支持 SPARC V7 体系结构,并且使用此选项编译的程序在当前平台上的运行速度较慢。 

缺省值为 -xarch=v8plus

示例:SPARCstation 1, SPARCstation 2. 

v8a

针对 SPARC-V8 ISA 的 V8a 版本进行编译。按照定义,V8a 是指 V8 ISA,但不包含 fsmuld 指令。

该选项使编译器能够生成可在 V8a ISA 上获得良好性能的代码。 

示例:基于 microSPARC I 芯片架构的任何系统 

v8

针对 SPARC-V8 ISA 进行编译。使编译器能够生成可在 V8 体系结构上获得良好性能的代码。示例:SPARCstation 10 

v8plus

针对 SPARC-V9 ISA 的 V8plus 版本进行编译。根据定义,V8plus 是指 V9 ISA,但只限于由 V8plus ISA 规范定义的 32 位子集,不包括可视化指令集 (Visual Instruction Set, VIS) 和其他实现特定的 ISA 扩展。

  • 该选项使编译器能够生成可在 V8plus ISA 上获得良好性能的代码。

  • 生成的目标代码采用 SPARC-V8+ ELF32 格式,只能在 Solaris UltraSPARC 环境下执行(不能在 V7 和 V8 处理器上运行)。

    示例:基于 UltraSPARC 芯片体系结构的任何系统

v8plusa

针对 SPARC-V9 ISA 的 V8plusa 版本进行编译。根据定义,V8plusa 是指 V8plus 体系结构,外加可视化指令集 (Visual Instruction Set, VIS) 版本 1.0 和 UltraSPARC 扩展。

  • 该选项使编译器能够生成可在 UltraSPARC 体系结构上获得良好性能的代码,但只限于 V8plus 规范定义的 32 位子集。

  • 生成的目标代码采用 SPARC-V8+ ELF32 格式,只能在 Solaris UltraSPARC 环境下执行(不能在 V8 处理器上运行)。

    示例:基于 UltraSPARC 芯片体系结构的任何系统

v8plusb

针对带有 UltraSPARC III 扩展的 SPARC-V8plus ISA 的 V8plusb 版本进行编译。 

此选项允许编译器为带有 UltraSPARC III 扩展和可视化指令集 ( Visual Instruction Set, VIS) 2.0 版的 UltraSPARC 体系结构生成目标代码。 

  • 生成的目标代码采用 SPARC-V8+ ELF32 格式,只能在 Solaris UltraSPARC-III 环境中执行。

  • 使用此选项进行编译将使用最佳指令集,以便在 UltraSPARC III 体系结构上获得良好性能。

v9

-m64 -xarch=sparc 等效。使用 -xarch=v9 获取 64 位内存模型的传统 make 程序描述文件和脚本只需使用 -m64

v9a

-m64 -xarch=sparcvis 等效,之所以提供它是为了与早期发行版兼容。

v9b

-m64 -xarch=sparcvis2 等效,之所以提供它是为了与早期发行版兼容。

B.2.68.2 用于 x86 的 -xarch 标志

下表列出了 x86 体系结构上的 -xarch 标志。

表 B–14 x86 上的 -xarch 标志

标志 

含义 

386

使指令集限制于 386/486 体系结构。 

amd64 

-m64 -xarch=sse2 等效(仅适用于 Solaris)。使用 -xarch=amd64 获取 64 位内存模型的传统 make 程序描述文件和脚本只需使用 -m64

amd64a 

-m64 -xarch=sse2a 等效(仅适用于 Solaris)。

generic

使用大多数处理器通用的指令集。这是缺省设置。 

generic64

为了在大多数 64 位平台上获得良好性能而进行编译。(仅适用于 Solaris)。 

该选项与 -m64 -xarch=generic 等效,之所以提供它是为了与早期发行版兼容。可使用 -m64 指定 64 位编译,来取代 -xarch=generic64

native

为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。 

native64

为了在此系统上获得良好性能而进行编译(仅适用于 Solaris)。该选项与 -m64 -xarch=native 等效,之所以提供它是为了与早期发行版兼容。

pentium_pro

使指令集限于 32 位 pentium_pro 体系结构。 

pentium_proa

将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 pentium_pro 体系结构中。 

sse

SSE 指令集添加到 pentium_pro 体系结构。

ssea

将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。 

sse2

SSE2 指令集添加到 pentium_pro 体系结构。

sse2a

将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。 

sse3

将 SSE3 指令集添加到 SSE2 指令集中。 

x86 特别注意事项

下面列出了针对 x86 Solaris 平台进行编译时需注意的一些重要问题。

传统的 Sun 样式的并行化 pragma 在 x86 上不可用。应改用 OpenMP。有关将传统并行化指令转换为 OpenMP 的信息,请参见《Sun Studio 12: OpenMP API User’s Guide》

使用设置为 ssesse2sse2asse3-xarch 编译的程序只能在提供这些扩展和功能的平台上运行。

从 Solaris 9 4/04 开始的 OS 发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris 操作系统不支持 SSE/SSE2。如果正在运行的 Solaris OS 不支持 -xarch 选择的指令集,则编译器将无法为该指令集生成或链接代码。

如果在单独的步骤中编译和链接,请始终使用编译器以及相同的 -xarch 设置进行链接,以确保链接正确的启动例程。

x86 上的数值结果可能与 SPARC 上的结果不同,这是由 x86 80 位浮点寄存器造成的。要最大限度地减少这些差异,请使用 -fstore 选项,或者使用 -xarch=sse2 进行编译(如果硬件支持 SSE2 的话)。

Solaris 和 Linux 之间的数值结果也可能不同,这是因为它们的内在数学库(例如,sin(x))不同。

二进制兼容性验证

从 Sun Studio 11 和 Solaris 10 OS 开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看它们是否在适当的平台上运行。

在 Solaris 10 之前的系统中,不执行任何验证,用户负责确保使用这些标志生成的对象部署在合适的硬件上。

如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。

此警告还适用于使用利用了 SSE、SSE2、SSE2a 和 SSE3 指令及扩展的 .il 内联汇编语言函数或 __asm() 汇编程序代码的程序。

B.2.68.3 SPARC 缺省设置

现在,C 编译器为其生成代码的缺省体系结构是 v8plus (UltraSPARC)。以后的发行版将取消对 v7 的支持。

新的缺省设置几乎可为当前使用的所有计算机都产生更高的运行时性能。但是,在缺省情况下,设计用于在 UltraSPARC 之前的计算机上进行部署的应用程序将不再在那些计算机上执行。使用 -xarch=v8 编译可以确保这些应用程序在那些计算机上执行。

如果要在 v8 系统上部署,则必须在每个编译器命令行以及任何链接时命令中显式指定选项 -xarch=v8。提供的系统库将在 v8 体系结构上运行。

如果要在 v7 系统上部署,则必须在每个编译器命令行以及任何链接时命令上显式指定选项 -xarch=v7。提供的系统库将使用 v8 指令集。对于本发行版,唯一支持 v7 的操作系统是 Solaris 8 软件。遇到 v8 指令时,Solaris 8 操作系统会在软件中解释指令。程序会运行,但性能将下降。

B.2.68.4 x86 缺省设置

对于 x86,-xarch 缺省值为 generic。请注意,x86 上的 -fast 扩展为 -xarch=native。该选项将编译器生成的代码限制为特定指令集体系结构的指令。该选项不保证使用任何目标特定的指令。不过,使用该选项会影响二进制程序的可移植性。

如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。有关在编译时和链接时都必须指定的所有编译器选项的完整列表,请参见表 A–2