PGI で生成された実行モジュール(a.out) は、全て実行に必要なライブラリを含めた「静的」な実行形式では生成されていません。いわゆる、ダイナミックな共有ライブラリを使用する形式になっており、実行時にその
dynamic shared library (libxxx.so の形式のファイル) をシステム側から取り込み、動作する形式となっています(現在の
Linux 上の一般的な方法です)。例えば、PGI 関連の dynamic shared library として、libpgc.so があります。この
libpgc.so は、PGI の run-time library であり、PGI がインストールされている領域 (32bit 環境では、/opt/pgi/linux86/11.10/lib(libso)、あるいは 64bit 環境では、/opt/pgi/linux86-64/11.10/lib(libso) ) に存在します。(この例は、PGI 11.10 の場合。その他のバージョンの場合は、太字部分が当該バージョン番号に変わります。)
PGI コンパイラ・ソフトウェアがインストールされているマシン上での実行は、このライブラリのパス /opt/pgi/linux86/11.10/lib (or libso) 内のライブラリを実行時に読み込みますが、PGI をインストールしていない異なるマシンでは、この shared
library をシステム内に有していないため、下記のような エラーが出ます。
error while loading shared libraries: libpgc.so:
ちなみに、実行モジュールの中でどのような dynamic shared library が使用されているかは、以下のコマンド (ldd) で確かめることができます。PGI
関連の libpgc.so がリンクされることが分かります。このファイルは、PGI をインストールしたマシン上でしか存在しません。
$ ldd a.out (以下は、32bit 環境の例)
Scientific Linux release 6.1 (Carbon)
linux-gate.so.1 => (0xf771f000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf76f4000)
libpgc.so => /opt/pgi/linux86/11.10/lib/libpgc.so (0xf76d1000)
librt.so.1 => /lib/librt.so.1 (0xf76c8000)
libm.so.6 => /lib/libm.so.6 (0xf769d000)
libc.so.6 => /lib/libc.so.6 (0x00829000)
/lib/ld-linux.so.2 (0x00807000)
PGI ソフトウェアがインストールされているマシン上で作成した実行モジュールを別のマシン上で動かしたい場合には、その対策が必要です。このような場合の典型的な例は、PCクラスタ上のスレーブ・マシン上での実行において遭遇します。また、別のシステム上で単独で動かしたい場合も以下に述べる対策が必要です。
ここで述べる前提として、「別のマシン」の意味は、PGI がインストールされている(コンパイルする)マシンの Linux kernel のバージョン並びに
glibc のバージョンと互換性を有するマシンと言う意味です。全くかけ離れたバージョンのマシン間では、動作しないことがありますので、その際はお問合せください。Linux の glibc のバージョンを知るためのコマンドは、ルート権限で"/lib/libc.so.6" を実行してください。
|
● 対策を行うための四つの方法
|
PGI コンパイラがインストールされているマシン以外の別のシステムで実行モジュールを動かす典型的な例は、PCクラスタのスレーブ・ノード上での場合があります。PGI コンパイラは、マスタ・ノード上にインストールして、実行はスレーブ・ノード上で行う等の場合です。クラスタに限らず、別のマシンと言うのは、同じ状況のことを意味するという風に捉えてください。
対策としては、システム上でその設定をする方法と、リンク・オプションだけで別のシステムで動く実行モジュールを作成する二種類の方法があります。ここでは、以下の方法をそれぞれ説明します。最も簡単な対策をお選びください。
【システム上で設定する方法】
- PC クラスタの場合は、システム設計時に クラスタ全てのノードからアクセスできる共有領域(NFS領域)にシステム管理領域(パーティション)を設け、その配下に、マスタ・ノードからPGI
ソフトウェアをインストールする方法
- 各マシン(スレーブ)上でローカルに、かつ明示的に /opt/pgi のディレクトリを作成し、PGI をインストールしたマシンから、PGI 関連の
dynamic shared library をコピーする方法
- 各マシン(スレーブ)上でローカルに、、外部 dynamic shared library を保存する ディレクトリを作成して、この配下に PGI
をインストールしたマシンから、PGI 関連の dynamic shared library をコピーする方法
【リンク・オプションだけで別のシステムで動作可能な実行モジュールを作成する方法】
- プログラムのリンケージのレベルで、dynamic shared library をリンクせず、スタティックなライブラリをリンクし、実行モジュールを作成する方法 (Linux 32ビット環境のみで有効)
|
(参考情報)
PGI Server ライセンス製品の使用を例として、32bit マシンと 64bit マシンの混在時の PGI 環境変数の設定例をこちらのページで説明しています。ノードロックの
PGI Workstation ライセンスを複数お持ちのお客様は、環境変数の設定方法に関して参考になるかと思います。
|
(1) 全てのノードからアクセスできる共有領域(NFS領域)に PGI をインストール
|
この方法は、PCクラスタ構築時(設計時)に行わなければならないことに留意してください。実施することは、クラスタ全てのノードからアクセスできる共有領域(NFS領域)にシステム管理領域(パーティション)を設けることです。例えば、このNFS
領域のパーティションを /export とした場合、PGI ソフトウェアのインストールを /export/pgi 配下に行うことで、全てのノードから /export/pgi 配下の PGI 関連の動的ライブラリをアクセスすることができます。なお、PGI
ソフトウェアのインストールは、マスタ・ノード上で行い、コンパイル作業もここで行うことを前提にしています。この対策のシステム的な作業は、これだけで済みます。
なお、各ユーザのシェルの環境変数の設定は、全てのノードで同じ形を取ります。例えば、この場合は、以下のような形態になります。以下の例は、PGI
11.10 の場合) 関連する FAQ ページはこちら。
|
(64bit Linux環境の場合)
csh または、tcsh の場合、$HOME/.cshrc 等
setenv PGI /export/pgi (コンパイラの installation directoryを定義) set path = ( $PGI/linux86-64/11.10/bin $path ) setenv MANPATH “$MANPATH“:$PGI/linux86-64/11.10/man setenv LM_LICENSE_FILE $PGI/license.dat
sh または、bash の場合、$HOME/.bashrc 等
export PGI=/export/pgi (コンパイラの installation directoryを定義) export PATH=$PGI/linux86-64/11.10/bin:$PATH export MANPATH=$MANPATH:$PGI/linux86-64/11.100/man export LM_LICENSE_FILE=$PGI/license.dat
|
(2) 各マシン(スレーブ)上でローカルに、 /opt/pgi (PGI のインストールdirectory) のディレクトリを作成
|
この対策は、実行モジュールを動かしたいマシン上で、ローカルにマスタノードと同じ 「/opt/pgi のディレクトリ」を作成し、PGI をインストールしたマシン(以下、「マスタ・ノード」と称する)のディレクトリ構造と同じものを作ることです。但し、構造は同じにするだけで、マスタ・ノードからコピーするのは、PGI
の dynamic shared library だけです。ディレクトリの名前は、マスタ・ノードと全く同じものを作成してください。なお、作成した
directory のパーミッションは 0777(あるいは 0775) としてください。
|
各マシン(スレーブ)上で、ルート権限で以下の directory を作成する。
PGI 6.0 の場合は、以下の 9.0 を 6.0 と置き換えてください。
PGI 6.1 の場合は、以下の 9.0 を 6.1 と置き換えてください。
PGI 6.2 の場合は、以下の 9.0 を 6.2 と置き換えてください。
PGI 7.0 の場合は、以下の 9.0 を 7.0 と置き換えてください。
PGI 7.1 の場合は、以下の 9.0 を 7.1 と置き換えてください。
PGI 7.2 の場合は、以下の 9.0 を 7.2 と置き換えてください。
PGI 8.0 の場合は、以下の 9.0 を 8.0 と置き換えてください。
PGI 2010 (10.0〜10.9) の場合は、以下の 9.0 を 10.0〜10.9 と置き換えてください。
PGI 2011 (11.0〜11.10) の場合は、以下の 9.0 を 11.0〜11.10 と置き換えてください。
【 64ビットPGIソフトウェア環境 】
mkdir /opt/pgi/linux86-64/9.0/libso
マスタノードから PGI の 64ビット dynamic shared library を同じ場所に
コピーする。コピーするファイルは、以下のとおり。(以下に説明する REDIST directory
配下のもの全てをコピーする)
libC.so libpgc.so libpgf902.so libpgf90rtl.so libpgmp.so libstd.so
libpgbind.so libpgf90.so libpgf90_rpm1.so libpgftnrtl.so libpgnuma.so
-------------------------------------------------------------
【32ビットPGIソフトウェア環境分】
64ビット Linux 上で 32bit環境が必要ない場合は、以下の作業は必要なし。
mkdir /opt/pgi/linux86/9.0/lib かつ /opt/pgi/linux86/9.0/liblf
※上記の 9.0 配下に liblf と言う directory がありますが、
これは 2GB 以上の large file I/O を扱うためのライブラリ群です。
lib、liblf 両方の directory を作成してください。
その後、マスタノードから PGI の 32ビット dynamic shared library を同じ場所に
コピーする。コピーするファイルは、以下に説明する REDIST 配下に存在するもの全てを
そのままコピーする。以下のようないずれかの directory 構造のファイルが
REDIST 配下に存在する。(システムの 32bit glibc のバージョンによって、
ファイルが異なるため、各ディレクトリ名で分離されている)
REDISTディレクトリの配下 (以下のいずれかのディレクトリがあるはず)
./lib-linux86-g225:
libpgbind.so libpgc.a libpgc.so libpgnuma.so
./lib-linux86-g2293:
libpgbind.so libpgc.a libpgc.so libpgnuma.so
./lib-linux86-g232:
libpgbind.so libpgc.a libpgc.so libpgnuma.so
./liblf-linux86-g225:
libpgc.a libpgc.so
./liblf-linux86-g2293:
libpgc.a libpgc.so
./liblf-linux86-g232:
libpgc.a libpgc.so
|
各ユーザのシェルの PGI 関連の環境変数 (PGI、PATH) の設定は、マスタ・ノードでの設定と全く同じ形を取ります。
PGI 6.0 から PGI ランタイムライブラリ( dynamic shared library)を以下の REDIST dierectory 配下に置くようにしています。 PGI ランタイムライブラリは、他のマシンで動作させるために必要なライブラリで、
PGI ライセンス規約上、コピーしてご利用いただいても問題のないファイルです。
【32bit Linuxの場合】 /opt/pgi/linux86/9.0/REDIST (32bit用)
【64bit Lnux の場合】 /opt/pgi/linux86/9.0/REDIST (32bit環境用) 並びに、
/opt/pgi/linux86-64/9.0/REDIST (64bit環境用)
なお、PGI 2010 (10.0) 以降、PGI Accelerator Compiler がリリースされてから、「PGI アクセラレータ用」の
REDIST
ディレクトリが用意されています。この中に含まれている shared libary も、上記の同じ場所(例/opt/pgi/linux86-64/10.0/libso 等)にコピーして下さい。
【32bit Linuxの場合】 /opt/pgi/linux86/10.0/REDIST-RLR (32bit用)
【64bit Lnux の場合】 /opt/pgi/linux86/10.0/REDIST-RLR (32bit環境用) 並びに、
/opt/pgi/linux86-64/10.0/REDIST-RLR (64bit環境用)
----------------------------------------------------------------------------------
【32bit 版での注意】
/opt/pgi/linux86/9.0/REDIST (32bitライブラリの場合は以下の directory が配下に存在します)
以下の directory 名称で g225 とは glibc の 2.2.5 に対応したPGI ランタイムライブラリを含む directory
と言う意味となります。inux の glibc のバージョンを知るためのコマンドは、ルート権限で"/lib/libc.so.6" を実行してください。REDIST配下に存在するものをコピーしてください。なお、glibc 2.3.2 以上の場合は、*.g232
をコピーしてください。また、liblf-linux86-*** の liblf は 2GB 以上の large file I/O を扱うために対応したランタイムライブラリが含まれます。
lib-linux86-g225 lib-linux86-g2293 lib-linux86-g232
liblf-linux86-g225 liblf-linux86-g2293 liblf-linux86-g232 (2GB 以上の large file I/O 対応)
|
(3) 各マシン(スレーブ)上でローカルに、外部 dynamic shared library を保存する ディレクトリを作成
|
この対策は、上記の (2) とほぼ同じ対策ですが、PGI の dynamic shared library をシステム専用のライブラリ保存領域にコピーしておくことです。このためには、マシン毎ローカルに、、外部
dynamic shared library を保存する ディレクトリを作成して、この配下にPGI をインストールしたマシンから、PGI 関連の
dynamic shared library をコピーする作業が必要です。なお、作成した directory のパーミッションは 0777(あるいは
0775) としてください。例えば、この領域を /usr/export/pgi として作成し、この配下に PGI 関連の dynamic shared
library をコピーしておくことになります。
|
各マシン(スレーブ)上で、ルート権限で以下の directory を作成する。
他のバージョンの場合は、以下の太字番号 9.0 を当該バージョン番号 6.0 に置き換えてください。
【32bit Linux の場合】
mkdir /usr/export/pgi/linux86/9.0/lib
【64bit Linux の場合】
mkdir /usr/export/pgi/linux86/9.0/lib
※上記の 9.0 配下に liblf と言う directory がありますが、
これは 2GB 以上の large file I/O を扱うためのライブラリ群です。
この large file I/O処理をしたい場合は、liblf 配下の libpgc.so をお使いください。
その後、マスタノードから PGI の 32ビット dynamic shared library を同じ場所に
コピーする。コピーするファイルは、以下のとおり。
libpgbind.so libpgc.a libpgc.so libpgnuma.so
さらに、64bit 環境では、以下の directory も追加します。lib ではなくlibso です。
【64bit Linux の場合】
mkdir /usr/export/pgi/linux86-64/9.0/libso
マスタノードから PGI の 64ビット dynamic shared library を同じ場所に
コピーする。コピーするファイルは、以下のとおり。
libC.so libpgc.so libpgf902.so libpgf90_rpm1.so
libpgf90rtl.so libpgf90.so libpgftnrtl.so libpgmp.so libstd.so
PGI 6.0 以降の場合の dynamic shared libraryの存在場所は、こちらに補足説明しています。
|
実行時の dynamic shared library のローディングに対しては、システム側でその設定をしておきます。その方法として以下の方法があります。ユーザサイドの
PGI 関連の環境変数の設定は、特に必要ありません。
LD_LIBRARY_PATH 環境変数に PGI の dynamic shared library の場所を含める。sh 型のシェルの場合は、" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<インストール先ディレクトリ>/lib " と入力する。
/etc/ld.so.confを修正して、/sbin/ldconfig システム・ユーティリティを使用して、PGI の dynamic shared library を登録する。(注: ユーティリティの実行には、root
ユーザ権限が必要です。)
|
(4) プログラムのリンケージのレベルで、スタティックなライブラリをリンクし、実行モジュールを作成する
|
この対策は、システム管理上の作業は伴わず、ユーザサイドだけで行うことができる対策です。実行モジュールの作成において、dynamic shared
library をリンクせず、同じスタティックなライブラリをリンクしておく方法です。これは、最も手軽な方法ですが、全てのライブラリを含んで実行モジュールが作成されるため、モジュールのサイズが大きくなるデメリットがあります。サイズを気にしないのであれば、この対策を施すことで別のシステム上で動作可能です。
コンパイル時のリンク・オプションに以下の -Wl,-Bstatic を付加してコンパイルしてください。なお、PGI 5.1 から同機能オプションである
-Bstatic オプションが提供されました。関連情報として、こちらのページもご覧ください。
|
pgf90 {other compile options} -Wl,-Bstatic test.f
あるいは
pgf90 {other compile options} -Bstatic test.f (PGI 5.1以降)
|
上記で生成された実行モジュールを使用することで、、dynamic shared library を気にすることなしに実行することができます。また、別のマシンでの各ユーザのシェルの
PGI 関連の環境変数 (PGI、PATH) の設定は必要ありません。
【既知の制約事項】
64bit OS環境において、-mcmodel=meidium -Bstatic オプションにて静的なリンク実行モジュールを作成する際、「リンク時」のエラーが生じる場合があります。 64ビット Linux が提供する静的システムライブラリの中の一部のモジュールが 64bit でオブジェクトが生成されていないことによるものです。(PGI の問題ではありません) 即ち、完全な形で
64ビット静的システムライブラリが提供されていない場合があるため、-mcmodel=medium において
-Bstatic はサポートしておりません。この場合は、上記の (3) の方法をお勧めします。
|