PGIトップ PGI技術情報・TIPS 別のシステムで動かす
a.out 実行バイナリ Linux
PGI コンパイラを実装しているシステム上で作成した実行モジュール(バイナリ)を他の同一OSのシステムにコピーして実行させる際の方法、注意事項を説明します。こうした状況は、一般にPCクラスタ上のマスタノードで作成された実行モジュールを他のスレーブノード上で実行させるような場合にあたります。これは技術的に言えば、PGIの専用 shared library を取り扱い方を説明するものです。なお、Windows環境では、生成された実行モジュールは、デフォルトでスタティック形式のビルドを行っておりますので、以下に述べるような DLL(shared library)ライブラリのコピー等は必要ありません。他のシステムにコピーして、そのまま実行できます。
2012年1月28日更新 Copyright © 株式会社ソフテック 加藤
一般的な Linux 上の実行バイナリ形態と同様に、PGI で生成された実行モジュール(a.out) は、全て実行に必要なライブラリを含めた「静的」な実行形式では生成されていません。いわゆる、ダイナミックな共有ライブラリを使用する形式になっており、実行時にその dynamic shared library (libxxx.so の形式のファイル) をシステム側から取り込み、動作する形式となっています。例えば、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 をインストールしたマシン上でしか存在しません。以下の例に示すように、他にもダイナミックにリンクされる PGI の shared library が存在します。
(64bit Linux 上の例で、OpenMP 並列化された実行モジュール)
[kato@photon29 Himeno]$ ldd a.out
Scientific Linux release 6.1 (Carbon)
linux-vdso.so.1 => (0x00007fff549ff000)
libpgmp.so => /opt/pgi/linux86-64/11.10/libso/libpgmp.so (0x00007fa4df7ac000)
libnuma.so => /opt/pgi/linux86-64/11.10/libso/libnuma.so (0x00007fa4df6aa000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000302cc00000)
libpgf90.so => /opt/pgi/linux86-64/11.10/libso/libpgf90.so (0x00007fa4df2b4000)
libpgf90_rpm1.so => /opt/pgi/linux86-64/11.10/libso/libpgf90_rpm1.so (0x00007fa4df1b1000)
libpgf902.so => /opt/pgi/linux86-64/11.10/libso/libpgf902.so (0x00007fa4df09e000)
libpgf90rtl.so => /opt/pgi/linux86-64/11.10/libso/libpgf90rtl.so (0x00007fa4def70000)
libpgftnrtl.so => /opt/pgi/linux86-64/11.10/libso/libpgftnrtl.so (0x00007fa4dee40000)
libpgc.so => /opt/pgi/linux86-64/11.10/libso/libpgc.so (0x00007fa4dece2000)
librt.so.1 => /lib64/librt.so.1 (0x000000302d400000)
libm.so.6 => /lib64/libm.so.6 (0x000000302d000000)
libc.so.6 => /lib64/libc.so.6 (0x000000302c800000)
/lib64/ld-linux-x86-64.so.2 (0x000000302c000000)
PGI ソフトウェアがインストールされているマシン上で作成した実行モジュールを別のマシン上で動かしたい場合には、その対策が必要です。このような場合の典型的な例は、PCクラスタ上のスレーブ・マシン上での実行において遭遇します。また、別のシステム上で単独で動かしたい場合も以下に述べる対策が必要です。
ここで述べる前提として、「別のマシン」の意味は、PGI コンパイラが実装されている(コンパイルする)マシンの Linux kernel のバージョン並びに glibc のバージョンと互換性を有するマシンと言う意味です。全くかけ離れたバージョンのマシン間では、動作しないことがありますので、その際はお問合せください。Linux の glibc のバージョンを知るためのコマンドは、ルート権限で "/lib/libc.so.6" あるいは "/lib64/libc.so.6" を実行してください。
PGI コンパイラがインストールされているマシン以外の「別のシステム」で実行モジュールを動かす典型的な例は、PCクラスタのスレーブ・ノード上での場合です。すなわち、PGI コンパイラは、マスタ・ノード上にインストールして、実行はスレーブ・ノード上で行う等の場合です。クラスタに限らず、「別のシステム」と言うのは、こうした同じような状況を意味すると捉えてください。
対策としては、システム上でその設定をする方法と、リンク・オプションだけで別のシステムで動く実行モジュールを作成する二種類の方法があります。ここでは、以下の方法をそれぞれ説明します。最も簡単な対策をお選びください。
【システム上で設定する方法】
【システム上で設定する方法】
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.10/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 と置き換えてください。
PGI 2012 (12.1~12.x) の場合は、以下の 9.0 を 12.1~12.x と置き換えてください。
。
【 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
PGI Accelerator Compilerの場合(PGI CUDAライブラリが追加されている)
libC.so libpgbind.so libpgf902.so libpgftnrtl.so libstd.so
libcudafor.so libpgc.so libpgf90_rpm1.so libpgmp.so
libcudaforemu.so libpgf90.so libpgf90rtl.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-g232/ liblf-linux86-g232/
./lib-linux86-g232:
libpgbind.so libpgc.a libpgc.so libpgnuma.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環境用)
PGI 9.0 以前の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 を作成する。
他のバージョンの場合は、以下の太字番号 11.10 を当該バージョン番号に置き換えてください。
【32bit Linux の場合】
mkdir /usr/export/pgi/linux86/11.10/lib
※上記の 11.10 配下に 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/11.10/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 関連の環境変数の設定は、特に必要ありません。
4. プログラムのリンケージのレベルで、スタティックなライブラリをリンクし、実行モジュールを作成する(32bit Linux only)
この対策は、システム管理上の作業は伴わず、ユーザサイドだけで行うことができる対策です。但し、32ビット Linux 環境のみで利用可能です。実行モジュールの作成において、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) の方法をお勧めします。