Oracle® Solaris Studio 12.4: 数値計算ガイド

印刷ビューの終了

更新: 2015 年 1 月
 
 

x86 の動作と実装

この付録では、x86/x64 ベースのシステムで使用される浮動小数点ユニットに関連した x86/x64 と SPARC の互換性の問題について説明します。

C.1 サポートされているシステムのコード生成

Oracle Solaris は、Intel、AMD、その他チップベンダーの x86 プロセッサを備えた、Oracle、Sun、その他システムベンダーの多くのシステムをサポートしています。特定の Oracle Solaris リリースでは、これらのチップを含む特定のシステムを多数サポートしています。特定の Oracle Solaris リリースについては、対応するハードウェア互換性リストを参照してください。

Oracle Solaris 11 は、64 ビットのアドレス指定をサポートする x86 プロセッサをサポートしています。Oracle Solaris 10 Update 10 は、ハードウェア浮動小数点および 120 MHz 以上のクロック周波数を備えた 64 ビットプロセッサと多数の 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 レジスタが使用されます。

  • 単精度または倍精度浮動小数点数が x87 浮動小数点レジスタスタックにロードされるか、メモリーに格納されるたびに、拡張倍精度 (80 ビット) に対する双方向の変換が行われます。このため、浮動小数点数のロードと格納によって例外が発生することがあります。–m32 を使用すると、浮動小数点サブルーチンのオペランドと結果は、x87 レジスタで渡されます。

  • x87 浮動小数点レジスタスタックが使用中の場合は、マイクロコードによって段階的アンダーフローがハードウェアに実装されます。非標準モードはありません。

  • fpversion ユーティリティーはありません。

  • 拡張倍精度 (80 ビット) 形式では、浮動小数点値を表現しない特定のビットパターンが認められています (Table 2–8 参照)。ハードウェアは通常、これらの「未サポート形式」をシグナルを発生する NaN として扱いますが、数学ライブラリではこのような表現の処理に一貫性がありません。これらのビットパターンはハードウェアによって生成されることはないため、配列の末尾を超えた読み取りなどの無効なメモリー参照、または C の union 構造体を介した、メモリー内のデータのある型から別の型への明示的な強制型変換が行われる場合のみ作成されます。このため、ほとんどの数値プログラムでは、これらのビットパターンは生じません。