指定指令集体系结构 (instruction set architecture, ISA)。如果在进行优化时使用该选项,那么在指定体系结构上适当选择就可以提供高性能的可执行文件。如果选择不当,则会导致二进制程序在预定的目标平台上无法执行。
分别使用 -m64 或 -m32 选项来指定打算使用的内存模型 LP64(64 位)或 ILP32(32 位)。-xarch 选项不再指示内存模型,除非是为了与早期的发行版兼容,如下所示。
如果在不同的步骤中编译和链接,请确保在两个步骤中为 -xarch 指定了相同的值。有关在编译和链接时都必须指定的所有编译器选项的完整列表,请参见表 A–2。
虽然 -xarch 可单独使用,但它是 -xtarget 选项扩展的一部分,并可能会用于覆盖由特定的 -xtarget 选项设置的 -xarch 值。例如:
% cc -xtarget=ultra2 -xarch=v8plusb ... |
会覆盖 -xtarget=ultra2 设置的 -xarch=v8。
下表详细说明了使用指定的 -xarch 选项编译后由各种 SPARC 处理器执行的可执行程序的性能。此表的目的在于帮助您识别适合您的可执行程序在特定目标机器上运行的最佳 -xarch 选项。首先识别您关心的机器的范围,然后考虑维护多个二进制程序的成本与在较新的机器上获得最高性能的好处。
表 B–13 -xarch 矩阵
SPARC 机器指令集: |
||||||
---|---|---|---|---|---|---|
V8a |
V8 |
V9 (非 Sun 处理器) |
V9 (Sun 处理器) |
V9b |
||
v8a |
N |
S |
S |
S |
S |
|
-xarch 编译选项 |
v8 |
PD |
N |
S |
S |
S |
v8plus |
NE |
NE |
N |
S |
S |
|
v8plusa |
NE |
NE |
** |
N |
S |
|
v8plusb |
NE |
NE |
** |
NE |
N |
|
v9 |
NE |
NE |
N |
S |
S |
|
v9a |
NE |
NE |
** |
N |
S |
|
v9b |
NE |
NE |
NE |
N |
||
**注: 使用此指令集编译的可执行程序可能会在 V9 非 Sun 处理器芯片中在名义上执行,或者根本不执行。请咨询硬件供应商,以确保您的可执行程序可在其目标机器上运行。 |
N 反映标称性能。程序执行,并充分利用处理器的指令集。
S 反映满意性能。程序执行,但并不利用所有可用的处理器指令。
PD 反映性能降低。程序执行,但根据使用的指令可能会导致性能轻微或显著下降。当内核对处理器未实现的指令进行仿真时,出现性能下降。
NE 表示不可执行。程序因内核不对处理器未实现的指令进行仿真而不可执行。
如果要使用 v8plus 或 v8plusa 指令集编译可执行文件,请考虑改用 v9 或 v9a 进行编译。提供了 v8plus 和 v8plusa 选项,因此程序可在支持 64 位程序的 Solaris 8 软件可用之前利用一些 SPARC V9 和 UltraSPARC 功能。使用 v8plus 或 v8plusa 选项编译的程序不可移植到 SPARC V8 或更旧的机器上。您可以分别使用 v9 或 v9a 重新编译此类程序,以充分利用 SPARC V9 和 UltraSPARC 的所有功能。您可以从 Sun 代表那里获取《The V8+ Technical Specification》白皮书(文件号码 802-7447-10),该书说明了 v8plus 和 v8plusa 的限制。
SPARC 指令集体系结构 V8 和 V8a 均是二进制兼容的。
由 v8plus 和 v8plusa 编译的二进制目标文件 (.o) 可以进行链接并可一起执行,但只能在与 SPARC V8plusa 兼容的平台上运行。
由 v8plus、v8plusa 和 v8plusb 编译的二进制目标文件 (.o) 可以进行链接并可一起执行,但只能在与 SPARC V8plusb 兼容的平台上运行。
-xarch 值 v9、v9a 和 v9b 只能在 UltraSPARC 64 位 Solaris 操作系统中使用。
使用 v9 和 v9a 编译的二进制目标文件 (.o) 可以进行链接并可一起执行,但是只能在与 SPARC V9a 兼容的平台上运行。
使用 v9、v9a 和 v9b 编译的二进制目标文件 (.o) 可以进行链接并可一起执行,但是只能在与 SPARC V9b 兼容的平台上运行。
对于任何特定选择,生成的可执行文件在早期体系结构中运行时都会慢得多。此外,虽然在多数指令集体系结构中都可以使用四精度(REAL*16 和 long double)浮点指令,但编译器不在它生成的代码中使用这些指令。
下表提供了 SPARC 平台上每个 -xarch 关键字的详细信息。
表 B–14 用于 SPARC 平台的 -xarch 标志
下表列出了 x86 体系结构上的 -xarch 标志。
表 B–15 x86 上的 -xarch 标志
标志 |
含义 |
---|---|
amd64 |
等效于 -m64 -xarch=sse2(仅限 Solaris)。使用 -xarch=amd64 来获取 64 位内存模型的传统 makefile 和脚本仅需要使用 -m64。 |
amd64a |
等效于 -m64 -xarch=sse2a(仅限 Solaris)。 |
amdsse4a |
使用 AMD SSE4a 指令集。 |
generic |
使用大多数处理器通用的指令集。这是缺省设置。当使用 -m32 进行编译时,等效于 entium_pr ,当使用 -m64 进行编译时,等效于 sse2。 |
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 指令集中。 |
ssse3 |
使用 SSSE3 指令集补充 pentium_pro、SSE、SSE2 和 SSE3 指令集。 |
sse4_1 |
使用 SSE4.1 指令集补充 pentium_pro、SSE、SSE2、SSE3 和 SSSE3 指令集。 |
sse4_2 |
使用 SSE4.2 指令集补充 pentium_pro、SSE、SSE2、SSE3、SSSE3 和 SSE4.1 指令集。 |
针对 x86 Solaris 平台进行编译时,有一些重要问题值得注意。
传统的 Sun 样式的并行 pragma 在 x86 上不可用。而改用 OpenMP。有关将传统并行化指令转换为 OpenMP 的信息,请参见 《Sun Studio 12 Update 1:OpenMP API 用户指南》。
在 -xarch 设置为 sse、sse2、sse2a、sse3 或更高级别的情况下编译的程序只能在提供这些扩展和功能的平台上运行。
从 Solaris 9 4/04 开始的操作系统发行版在 Pentium 4 兼容的平台上支持 SSE/SSE2。早期版本的 Solaris OS 不支持 SSE/SSE2。如果正在运行的 Solaris OS 不支持 -xarch 选择的指令集,则编译器将无法为该指令集生成或链接代码。
如果在单独的步骤中编译和链接,请始终使用编译器以及相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
x86 上的数值结果可能与 SPARC 上的结果不同,这是由 x86 80 位浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
因为内部数学库(例如,sin(x))不同,所以 Solaris 和 Linux 之间的数值结果也会不同。
从 Sun Studio 11 和 Solaris 10 OS 开始,会对使用这些专用的 -xarch 硬件标志编译和生成的程序二进制文件进行验证,看其是否在适当的平台上运行。
在 Solaris 10 之前的系统中,不执行任何验证,用户负责确保使用这些标志生成的对象部署在合适的硬件上。
如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
这一警告也扩展到使用 .il 内联汇编语言功能或使用 SSE、SSE2、SSE2a 和 SSE3 指令和扩展的 __asm() 汇编程序代码。
现在,C 编译器为其生成代码的缺省体系结构是 v8plus (UltraSPARC)。以后的发行版中将不再支持 v7。
新的缺省设置几乎可为当前使用的所有计算机都产生更高的运行时性能。但是,在缺省情况下,设计用于在 UltraSPARC 之前的计算机上进行部署的应用程序将不再在那些计算机上执行。使用 -xarch=v8 编译可以确保这些应用程序在那些计算机上执行。
如果要在 v8 系统上部署,则必须在每个编译器命令行以及任何链接时命令中显式指定选项 -xarch=v8。提供的系统库将在 v8 体系结构上运行。
如果要在 v7 系统上部署,则必须在每个编译器命令行以及任何链接时命令上显式指定选项 -xarch=v7。提供的系统库将使用 v8 指令集。对于本发行版,唯一支持 v7 的操作系统是 Solaris 8 软件。遇到 v8 指令时,Solaris 8 操作系统会在软件中解释指令。程序会运行,但性能将下降。