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-xarch=v8plusb によって上書きされます。

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 

** 注: この命令セットでコンパイルされる実行可能ファイルは、Sun 以外の V9 プロセッサチップ上で仕様どおり機能するか、あるいはまったく機能しません。実行可能ファイルがその対象マシンで動作するかどうかについては、ハードウェアベンダーに問い合わせてください。 

v8plus または v8plusa 命令セットを使用して実行可能ファイルをコンパイルしようと考えている場合は、代わりに v9 または v9a によるコンパイルを考慮してください。v8plusv8plusa オプションは、64 ビットプログラム対応の Solaris 8 がリリースされる以前に、プログラムで SPARC V9 と UltraSPARC 機能の一部が利用できるように提供されたものです。v8plus または v8plusa オプションでコンパイルされたプログラムは、SPARC V8 以前のマシンには移植できません。これらのプログラムは、v9 または v9a でそれぞれコンパイルし直すと、SPARC V9 と UltraSPARC の全機能を十分利用できるようになります。v8plusv8plusa の制限については、ホワイトペーパー『 The V8+ Technical Specification』(Part No.: 802-7447-10。購入先から入手可能) で説明されています。

いずれの場合でも、初期のアーキテクチャーでは、生成された実行可能ファイルの実行速度がかなり遅くなる可能性があります。また、これらの命令セットアーキテクチャーの多くで 4 倍精度 (REAL*16 および long double) 浮動小数点命令を使用できますが、コンパイラは、それらの命令を生成したコードで使用しません。

次の表に、SPARC プラットフォームでの各 -xarch キーワードの詳細を示します。

表 B–13 SPARC プラットフォームでの -xarch のフラグ

フラグ 

意味 

generic

ほとんどのプロセッサに共通の命令セットを使用します。これはデフォルト値です。 

generic64

多くのシステムで良好な 64 ビットパフォーマンスを得るためのコンパイルをします (Solaris のみ)。 

このオプションは -m64 -xarch=generic と同等で、以前のリリースとの互換性のために提供されています。64 ビットのコンパイルを指定するには、 -xarch=generic64 の代わりに -m64 を使用します。

native

現在のシステムで良好なパフォーマンスを得られるようにコンパイルを実行します。コンパイラは、コンパイルが実行されている現在のシステムプロセッサに適した設定を選択します。 

native64

現在のシステムで良好なパフォーマンスを得られるようにコンパイルを実行します (Solaris のみ)。このオプションは -m64 -xarch=native と同等で、以前のリリースとの互換性のために提供されています。

sparc

SPARC-V9 ISA 用にコンパイルします。ただし、VIS (Visual Instruction Set) と実装に固有の ISA 拡張機能は含まれていません。V9 ISA 上で良好なパフォーマンスを得るためのコードを生成します。 

sparcvis

VIS (Visual Instruction Set) 版の SPARC-V9 用にコンパイルします。VIS のバージョンは 1.0 で、UltraSPARC 拡張機能を含みます。このオプションを使用すると、コンパイラは、UltraSPARC アーキテクチャー上で良好なパフォーマンスが得られるようにコードを生成することができます。 

sparcvis2

UltraSPARC アーキテクチャー + VIS (Visual Instruction Set) version 2.0 + UltraSPARC-III 拡張機能用のオブジェクトコードを生成します。 

sparcfmaf

コンパイラが、SPARC-V9 命令セットに加えて、VIS (Visual Instruction Set) version 1.0 を含む UltraSPARC 拡張機能、VIS (Visual Instruction Set) version 2.0 を含む UltraSPARC-III 拡張機能、および浮動小数点の乗加算用の SPARC64 VI 拡張機能からの命令を使用できるようにします。 

コンパイラが乗加算命令を自動的に使用する機会を得られるようにするには fma=fused と一部の最適化レベルと一緒に -xarch=sparcfmaf を使用する必要があります。

v7

SPARC-V7 ISA 用にコンパイルします。(廃止)

最新の Solaris オペレーティングシステムは、SPARC V7 アーキテクチャーをサポートしていません。このオプションを付けてコンパイルしたプログラムは、最新のプラットフォームで実行速度が低下します。 

デフォルトは -xarch=v8plus です。

例: SPARCstation 1、SPARCstation 2 

v8a

V8a 版の SPARC-V8 ISA 用にコンパイルします。定義上、V8a は V8 ISA を意味します。ただし、fsmuld 命令は含まれていません。

V8a ISA 上で良好なパフォーマンスを得るためのコードを生成します。 

例: microSPARC I チップアーキテクチャーに基づく任意のシステム 

v8

SPARC-V8 ISA 用にコンパイルします。V8 アーキテクチャー上で良好なパフォーマンスを得るためのコードを生成します。例: SPARCstation 10 

v8plus

V8plus 版の SPARC-V9 ISA 用にコンパイルします。定義上、V8plus は V9 ISA を意味します。 ただし、V8plus ISA 仕様で定義されている 32 ビットサブセットに限定されます。 さらに、VIS (Visual Instruction Set) と実装に固有な ISA 拡張機能は含まれていません。

  • V8plus ISA 上で良好なパフォーマンスを得るためのコードを生成します。

  • 生成されるオブジェクトコードは SPARC-V8 + ELF32 形式であり、Solaris UltraSPARC 環境でのみ実行できます。 つまり、V7 または V8 のプロセッサ上では実行できません。

    例: UltraSPARC チップアーキテクチャーに基づくすべてのシステム

v8plusa

V8plusa 版の SPARC-V9 ISA 用にコンパイルします。定義上、V8plusa は、V8plus アーキテクチャー + VIS (Visual Instruction Set) version 1.0 + UltraSPARC 拡張機能を意味します。

  • UltraSPARC アーキテクチャー上で良好なパフォーマンスを得るためのコードを生成します。 ただし、V8plus 仕様で定義されている 32 ビットサブセットに限定されます。

  • 生成されるオブジェクトコードは SPARC-V8 + ELF32 形式であり、Solaris UltraSPARC 環境でのみ実行できます。 つまり、V7 または V8 のプロセッサ上では実行できません。

    例: UltraSPARC チップアーキテクチャーに基づくすべてのシステム

v8plusb

UltraSPARC-III 拡張機能を持つ、V8plusb 版の SPARC-V8plus ISA 用にコンパイルします。 

UltraSPARC アーキテクチャー + VIS (Visual Instruction Set) version 2.0 + UltraSPARC-III 拡張機能用のオブジェクトコードを生成します。 

  • 生成されるオブジェクトコードは SPARC-V8 + ELF32 形式です。Solaris UltraSPARC-III 環境でのみ実行できます。

  • UltraSPARC-III アーキテクチャー上で良好なパフォーマンスを得るための最良のコードを使用します。

v9

-m64 -xarch=sparc と同等です。64 ビットのメモリーモデルを取得するために -xarch=v9 を使用している従来のメイクファイルおよびスクリプトでは、-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 のみ)。64 ビットのメモリーモデルを取得するために -xarch=amd64 を使用している従来のメイクファイルおよびスクリプトでは、-m64 のみを使用する必要があります。

amd64a 

-m64 -xarch=sse2a と同等です (Solaris のみ)。

generic

ほとんどのプロセッサに共通の命令セットを使用します。これはデフォルトです。 

generic64

多くのシステムで良好な 64 ビットパフォーマンスを得るためのコンパイルをします (Solaris のみ)。 

このオプションは -m64 -xarch=generic と同等で、以前のリリースとの互換性のために提供されています。64 ビットのコンパイルを指定するには、 -xarch=generic64 の代わりに -m64 を使用します。

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 形式の並列化プラグマは、x86 上では使用できません。この代わりに OpenMP を使用してください。従来の並列化指令から OpenMP への変換に関する詳細は、『Sun Studio 12: OpenMP API ユーザーズガイド』を参照してください。

-xarchssesse2sse2a、または sse3 に設定してコンパイルしたプログラムは、必ずこれらの拡張と機能を提供するプラットフォームでのみ実行してください。

Pentium 4 互換プラットフォームの場合、Solaris 9 4/04 以降のリリースは SSE/SSE2 に対応しています。これより前のバージョンの Solaris は SSE/SSE2 に対応していません。-xarch によって選択された命令セットが実行中の Solaris OS で有効にされていない場合、コンパイラはその命令セットのコードを生成またはリンクできません。

コンパイルとリンクを別々に行う場合は、必ずコンパイラを使ってリンクし、-xarch 設定で適切な起動ルーチンがリンクされるようにしてください。

x86 の 80 ビット浮動小数点レジスタが原因で、x86 での数値演算結果が SPARC の結果と異なる場合があります。この差を最小にするには、-fstore オプションを使用するか、ハードウェアが SSE2 をサポートしている場合は -xarch=sse2 でコンパイルします。

たとえば sin(x) など、組み込みの数学ライブラリが同じではないため、Solaris と Linux で数値演算結果が異なる場合があります。

バイナリの互換性の妥当性検査

Sun Studio 11 と Solaris 10 OS から、これらの特殊化された xarch ハードウェアフラグを使用してコンパイルし、構築されたプログラムバイナリは、適切なプラットフォームで実行されることが確認されます。

Solaris 10 以前のシステムでは確認が行われないため、これらのフラグを使用して構築したオブジェクトが適切なハードウェアに配備されることをユーザが確認する必要があります。

これらの xarch オプションでコンパイルしたプログラムを、適切な機能または命令セット拡張に対応していないプラットフォームで実行すると、セグメント例外や明示的な警告メッセージなしの不正な結果が発生することがあります。

このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、および SSE3 の命令や拡張機能を利用している __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 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。