Next: , Previous: , Up: Installing GMP   [Index]


2.2 ABI と ISA

ABI (Application Binary Interfaceの略)は機能の相互呼び出し規約のことで,どのレジスタを使うのか, どのCデータ型を使うのか,ということを規定したものです。ISA (Instruction Set Architectureの略)は CPUが使用できる命令セットやレジスタを規定したものです。

ある種の64-bit ISA CPUは64-bit ABIと32-bit ABIの両方が定義されており,32-bit ABIに 関しては同じファミリー内の古いCPUと互換性があります。GMPはこのような二つのABIを持つ CPUもサポートしています。実際,GMP ‘ABI’の内部ではABIの組み合わせも可能ですし, どのABIを使うのかを選択する機能も有しています。例えばある種の 32-bit ABIについては,32-bit長 long型のリムと64-bit長 long long型のリム のどちらかを選択して使うことができるようになっています。

デフォルトでは,GMPは使用システムに応じて最適なABIを選択するようになっています。そのため, 自動的に高速な動作を可能にしてくれます。他のライブラリやアプリケーションの都合に合わせて GMPを明示的に構成したい時には,次のようにABIオプションを指定します。

./configure ABI=32

どんな場合でも,与えられたプログラム内で使われるすべてのオブジェクト コードが,同一のABIに対してコンパイルされるようになっている,ということが重要です。

GMPのリムは常にlong型として実装されています。long long型のリム が使用されるのは,生成されたgmp.h内でそのように定義されている時に限られます。 このような扱いはアプリケーションにとっては都合が良いのですが,gmp.hが多種多様に なり,それを他の環境にコピペして使い回すことはできないということを意味します。 特定のABIを対象としたコンパイラに対しては同一のリム型を使うことが期待される以上, gmp.hがコンパイラ依存になっていまうことは止むを得ません。

現状では,特定のABIを対象としたライブラリのインストールやヘッダファイルの生成は行っていません。 複数のシステム向けGMPの生成や,特定の ‘libdir’を使う設定をできる限り単純化したりするぐらいは可能ですが, 異なるABIに対してのビルドは個別に行い,それぞれ./configuremakeを 新たに生成して実行する必要がある,ということを覚えておいて下さい。


AMD64 (‘x86_64’)

AMD64システム上では,32ビット,64ビットモードの両方をサポートしており,下記のABIが利用可能です。

ABI=64

64bit ABIは64bitリムとポインタを使用してその性能を最大限引き出しており,これがデフォルトになります。アプリケーションは特にコンパイラ用のフラグを設定する必要はありませんが,下記のオプションで指定ができます。

gcc  -m64
ABI=32

32bit ABIは普通のi386用です。比較的低速になってしまうので,64bit環境との相互運用性が必要ないのであれば,これを使用することはお勧めしません。

gcc  -m32

(GCC 2.95以前では, ‘-m32’オプションは利用できず,これが唯一のモードでした。)

ABI=x32

x32 ABIは 64bitリムと32bitポインタを利用します。64bit ABIのような環境では,これでCPUの演算性能を最大限活用できるようになります。このABIが使えないOS環境も存在します。

gcc  -mx32

HPPA 2.0 (‘hppa2.0*’, ‘hppa64’)
ABI=2.0w

2.0w ABIは64-bitリムとポインタを使用し,HP-UX 11以降の環境で使用可能です。アプリケーションは次のように してコンパイルしなければいけません。

gcc [built for 2.0w]
cc  +DD64
ABI=2.0n

2.0n ABIとは,32bitのHPPA 1.0 ABIと関数呼び出し形式を意味します。但し,関数の内部では64bit命令も使用可能です。 GMPでは64bit長のlong long型のリムを使用します。このABIはhppa64 GNU/LinuxとHP-UX 10以降の環境で利用可能です。 このABIを使うにはアプリケーション生成時には次のようにコンパイルしなければなりません。

gcc [built for 2.0n]
cc  +DA2.0 +e

現在のGCC(Verison 3.2など)では,long long用の64bit命令を生成しませんので,2.0wに対しては低速になります(GMPアセンブラコードも同様です)。

ABI=1.0

HPPA 2.0 CPUは,32ビット HPPA 1.0 ABI である全てのHPPA 1.0, 1.1のコードを動作させることができます。この場合は特別なコンパイラオプションを付加する必要はありません。

この3種類のABIは‘hppa2.0w’, ‘hppa2.0’,‘hppa64’のCPUタイプすべてで利用可能です。但し,‘hppa2.0n’のCPUは 2.0n もしくは 1.0しか利用できません。

HP-UX上のGCCは,HP ccとは違い,APIとして2.0n か 2.0wを選択するためのオプションを持っておらず, どちらか片方のABI でビルドする必要があります。GMPはビルド方法を検出し,対応する‘ABI’を選択します。。


HP-UX環境下のIA-64 (‘ia64*-*-hpux*’, ‘itanium*-*-hpux*’)

HP-UXはIA-64用に二つのABIをサポートしており,GMPのパフォーマンスはどちらも同程度です。

ABI=32

32-bit ABIでは,ポインタ,int型,long型は全て32 bit長で,GMPでは 64 bit長のlong long型をリムとして使用しています。特に何もオプション指定を行わないと,このABI がHP C でも GCCでもデフォルトで使用されます。オプションとしてして明示したいのであれば,下記のように指定して下さい。

gcc  -milp32
cc   +DD32
ABI=64

64-bit ABIでは,long型とポインタは64 bit長になり,GMPはこの long型をリムとして使用します。アプリケーション生成時には下記のようにオプション指定してコンパイルして下さい。

gcc  -mlp64
cc   +DD64

他のIA-64システム,例えばGNU/Linuxは‘ABI=64’だけ指定すれば十分です。


IRIX 6環境下のMIPS (‘mips*-*-irix[6789]’)

IRIX 6では常に64bit MIPS 3以上のCPUを使用しており,ABIとしては o32, n32, 64が利用可能です。 n32か64を使用することをお勧めします。GMPのパフォーマンスはどちらも同程度です。デフォルトはn32になります。

ABI=o32

o32 ABIは32bitポインタと整数になり,64bit命令はサポートしません。従って,GMPは n32や64より遅くなりますので,GCC 2.7.2のような古いコンパイラをサポートするためだけに存在しています。特にフラグを指定せずに新旧のコンパイラを実行する際には下記のオプションを指定して下さい。

gcc  -mabi=32
cc   -32
ABI=n32

n32 ABIは32bitポインタと整数となりますが,long long型が使えるので64bitリムになります。コンパイル時は次のようにオプション指定を行います。

gcc  -mabi=n32
cc   -n32
ABI=64

64bit ABIは64bit長のポインタと整数になります。コンパイル時のオプションは下記のようになります。

gcc  -mabi=64
cc   -64

カーネル version 2.2のMIPS GNU/Linuxではn32もしくは64のサポートの必要はありませんので,32bit長のリムとMIPS 2用のコード生成だけを行います。


PowerPC 64 (‘powerpc64’, ‘powerpc620’, ‘powerpc630’, ‘powerpc970’, ‘power4’, ‘power5’)
ABI=mode64

AIX 64 ABI は 64-bit リムとポインタを使いますので,PowerPC 64 ‘*-*-aix*’システム上ではこれがデフォルトとなります。 アプリケーションをコンパイルする時のオプションは下記の通りです。

gcc  -maix64
xlc  -q64

64-bit GNU/Linux, BSD, Mac OS X/Darwin上では下記のように指定します。

gcc  -m64
ABI=mode32

mode32’ ABIは64-bit long longリムを使用するものの,CPUは32-bitモードで動作し,32bitの関数呼び出しを行います。 真の64-bit ABIが利用できない環境ではこれがデフォルトになります。コンパイラのオプション指定は必要ありません。 こnABIはAIX環境下では使用できません。

ABI=32

基本的な32bit PowerPC ABIで,32bitリムを使用します。このABIを使う際には,特別なコンパイラオプションを付加する必要はありません。

GMPの速度は‘mode64’ ABIが最高で,次に‘mode32’ ABIです。‘ABI=32’では32-bit ISAしか使えませんので, 64bit CPUを有効に使用できません。


Sparc V9 (‘sparc64’, ‘sparcv9’, ‘ultrasparc*’)
ABI=64

64-bit V9 ABIは様々なspar64 BSD,最新のSparc64 GNU/Linux, Solaris 2.7以上(カーネルが64bitモードの場合)で利用可能です。 GCC 3.2以上,もしくはSun ccが利用可能です。GNU/Linux上では,デフォルトのgccのモードに依存しますが,下記のようにオプションをつけてコンパイルして下さい。

gcc  -m64

Solaris上では次のように指定します。

gcc  -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9
cc   -xarch=v9

BSD sparc64上では,64bit ABIしか使えませんので,オプション指定は不要です。

ABI=32

基本的な32bit ABIでは,GMPはV9 ISAを利用します。Sunのドキュメントによると,この組み合わせはv8plusと呼ばれているようです。 GNU/Linux上では,デフォルトのgccのモードにもよりますが,下記のオプションを指定します。

gcc  -m32

Solaris上では下記のように指定することが望ましいわけですが,特段オプションは付けなくても大丈夫です。(gcc 2.8以前の場合は‘-mv8’になります)。

gcc  -mv8plus
cc   -xarch=v8plus

GMPの速度は‘ABI=64’が最大になるので,使用可能であればこのABIがデフォルトになります。64bit環境では追加のレジスタが利用でき,それ用のコードを持っているので最速になる訳です。

コンパイラに渡す‘-m’ と ‘-x’ オプションをごっちゃにしないで下さい。どちらも‘arch’を指定するものですが,ABIとISA の両方を効果的に指定できます。

Solaris 2.6以前では,カーネルが全てのレジスタを保持しないので,‘ABI=32’だけが利用可能です。

Solaris 2.7で32bit モードのカーネルを使うと,普通のネイティブビルドを行うと実行可能ファイルが動作しなくなるので, ‘ABI=64’オプションは受け付けません。下記のように,クロスコンパイルする要領でオプション指定すれば,‘ABI=64’でビルドできます。

./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64

Next: , Previous: , Up: Installing GMP   [Index]