Oracle® Solaris Studio 12.4:数值计算指南

退出打印视图

更新时间: 2015 年 1 月
 
 

x86 行为和实现

本附录介绍与基于 x86/x64 系统中所使用的浮点单元相关的 x86/x64 和 SPARC 兼容性问题。

C.1 受支持的系统的代码生成

Oracle Solaris 支持 Oracle、Sun 和其他系统供应商提供的许多系统,这些系统包含 Intel、AMD 和其他芯片供应商提供的 x86 处理器。某个特定的 Oracle Solaris 版本支持包含此类芯片的一些特定系统。对于某个特定 Oracle Solaris 版本,请参见其相应的硬件兼容性列表。

Oracle Solaris 11 支持支持 64 位寻址的 x86 处理器。Oracle Solaris 10 Update 10 支持这些 64 位处理器,以及许多具有硬件浮点和 120 MHz 或更快时钟速度的仅限 32 位的 x86 处理器。

使用 –m32 –xarch=generic –xchip=generic 标志编译可生成适用于大多数系统的代码。下表列出了一些典型 Oracle 和 Sun x86 系统的某些特定代码生成选项:

系统
代码生成选项
Ultra 20
–xarch=sse2a –xchip=opteron
X2200
–xarch=amdsse4a –xchip=amdfam10
X6250
–xarch=sse3 –xchip=core2
X4170
–xarch=aes –xchip=westmere
X2-4
–xarch=sse4_2 –xchip=nehalem
X3-2
–xarch=avx –xchip=sandybridge
X4-2 X4-4
–xarch=avx_i –xchip=ivybridge
?
–xarch=avx2 –xchip=haswell

有上百个不同的 x86 芯片,每个芯片都有复杂的命名规则。

使用 cc –dryrun –native 是了解编译器采取什么操作来优化特定系统的最好方法。生成适合一些不同 x86 系统所需的代码时,使用适合最旧系统的选项通常适用于所有系统。

C.2 与 SPARC 的区别

Oracle Solaris Studio 编译器生成的代码在 SPARC 和 x86 上的行为方式通常是相同的。但是,请注意在基于 x86 的系统上有以下重要区别:

  • x87 浮点寄存器的宽度为 80 位。因为使用 x87 浮点寄存器栈时算术计算的中间结果可能采用双扩展(80 位)精度,所以计算结果可能会有所不同。–fstore 标志将最小化这些差异。但是,使用 –fstore 标志会导致性能下降。虽然 Oracle Solaris Studio 12.4 在缺省情况下不使用 x87 寄存器进行单精度和双精度表达式求值,但如果指定了 –xarch=386,或使用了 x87 硬件超越指令,或使用了双精度扩展变量,就会使用这些寄存器。

  • 每次将单精度或双精度浮点数加载到 x87 浮点寄存器栈或存储到内存中时,都会转换到双扩展(80 位)精度或从双扩展精度进行转换。因此,加载和存储浮点数可能导致异常。使用 –m32 时,浮点子例程操作数和结果将在 x87 寄存器中传递。

  • 在使用 x87 浮点寄存器栈时,将通过微码协助在硬件中实现渐进下溢;没有非标准模式。

  • 不提供 fpversion 实用程序。

  • 双扩展(80 位)格式接受某些不表示任何浮点值的位模式(请参见Table 2–8)。硬件通常将这些“不受支持的格式”视为信号 NaN,但是数学库在处理这样的表示形式时存在不一致。由于这些位模式不会由硬件生成,因此它们只能产生于无效的内存引用(例如在读取数组时发生越界),或者产生于显式将内存中的数据从一种类型强制转换为另一种类型(例如,通过 C 语言中的 union 数据结构)。因此,在大多数数值程序中,不出现这些位模式。