命令セットアーキテクチャー (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 によって上書きされます。
次の表は、指定された -xarch オプションでコンパイルされたあと、さまざまな SPARC プロセッサで実行される実行可能ファイルのパフォーマンスを示しています。この表は、特定の対象マシン上の実行可能ファイルにもっとも適した -xarch オプションを調べるために利用してください。初めにマシンの範囲を決め、続いて複数のバイナリを管理する手間と、より新しいマシンから最大限のパフォーマンスを引き出す効果を比較してみるとよいでしょう。
表 B–12 -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 |
||
** 注: この命令セットでコンパイルされる実行可能ファイルは、Sun 以外の V9 プロセッサチップ上で仕様どおり機能するか、あるいはまったく機能しません。実行可能ファイルがその対象マシンで動作するかどうかについては、ハードウェアベンダーに問い合わせてください。 |
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 の全機能を十分利用できるようになります。v8plus と v8plusa の制限については、ホワイトペーパー『 The V8+ Technical Specification』(Part No.: 802-7447-10。購入先から入手可能) で説明されています。
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 互換プラットフォーム上で実行する場合に限られます。
いずれの場合でも、初期のアーキテクチャーでは、生成された実行可能ファイルの実行速度がかなり遅くなる可能性があります。また、これらの命令セットアーキテクチャーの多くで 4 倍精度 (REAL*16 および long double) 浮動小数点命令を使用できますが、コンパイラは、それらの命令を生成したコードで使用しません。
次の表に、SPARC プラットフォームでの各 -xarch キーワードの詳細を示します。
表 B–13 SPARC プラットフォームでの -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 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
従来の Sun 形式の並列化プラグマは、x86 上では使用できません。この代わりに OpenMP を使用してください。従来の並列化指令から OpenMP への変換に関する詳細は、『Sun Studio 12: OpenMP API ユーザーズガイド』を参照してください。
-xarch を sse、sse2、sse2a、または 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() アセンブラコードにも当てはまります。
C コンパイラがコードを生成するときのデフォルトのアーキテクチャーが、 v8plus (UltraSPARC) になりました。今後のリリースで、v7 のサポートは廃止される予定です。
新しいデフォルトでは、現在使用されているほぼあらゆるマシンで実行時のパフォーマンスが向上します。ただし、UltraSPARC 以前のコンピュータへの配備を意図したアプリケーションは、そうしたコンピュータ上ではデフォルトで動作しなくなります。アプリケーションがそうしたコンピュータで動作するようにするには、-xarch=v8 でコンパイルしてください。
v8 システムに配備する場合は、各コンパイラコマンド行ばかりでなく、すべてのリンク時コマンドでも -xarch=v8 オプションを明示的に指定する必要があります。提供のシステムライブラリは v8 アーキテクチャーで動作します。
v7 システムに配備する場合は、あらゆるコンパイラコマンド行だけでなく、どのリンク時コマンドでも -xarch=v7 オプションを明示的に指定する必要があります。提供のシステムライブラリは、v8 命令セットを利用します。このリリースの場合、v7 がサポートされているオペレーティングシステムは Solaris 8 ソフトウェアだけです。v8 命令が検出された場合、Solaris 8 オペレーティングシステムはソフトウェアでその命令を解釈します。このためプログラムは実行されますが、パフォーマンスは低下します。
x86 の場合、-xarch デフォルトでは generic になります。また、x86 では、-fast は -xarch=native に展開されることに注意してください。このオプションは、コンパイラが生成するコードを、指定した命令セットアーキテクチャーの命令だけに制限します。このオプションは、すべてのターゲットを対象とするような命令としての使用は保証しません。ただし、このオプションを使用するとバイナリプログラムの移植性に影響を与える可能性があります。
別々の手順でコンパイルしてリンクする場合は、両方の手順に同じ -xarch の値を指定してください。表 A–2 に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。