MPICH2 インストール Linux
(PGI 14.1以降は 新しい MPI-3 規格準拠の MPICH 3.0.4 がバンドルされましたのでご自身でビルドの必要はありません)PGI Workstation / Server for Linux 製品には、PGI コンパイラでプリコンパイルした MPICH1 のライブラリがバンドルされ、システムに実装できるようになっていますが、MPICH2 はご自身で構築して頂く必要があります。この MPICH2 ライブラリの構築方法を説明します。以前のMPICH2 構築方法の説明ページでは、MPIプロセスマネージャとして MPD と言うソフトウェアを使用するための構築方法を説明しましたが、この MPD は今後廃止されますので、現在のデフォルトのプロセスマネージャである hydra を使う環境の構築方法を説明します。
2012年1月7日 Copyright © 株式会社ソフテック 加藤
このガイドは、MPICH2 の 2012年1月現在の最新バージョン 1.4.1p1 のライブラリ生成について説明します。これは、64bit Linux あるいは、32bit Linux に対して適用できます。
MPICH2は、無償で使用できます。ソフトウェアは、MPICH2 の Webサイト( http://www.mcs.anl.gov/research/projects/mpich2/index.php ) からダウンロード可能です。MPICH2 は、MPI-1 並びに MPI-2 の規約に準拠したメッセージ・パッシング・インタフェースの実装ライブラリです。
以下の URL から最新の MPICH2 Source (UNIX and Windows) ソースプログラムを入手します。以下の例は、64bit Linux 上でビルドする例を述べていますが、32bit Linux 環境でも同様の方法となります。なお、ビルドしたライブラリのインストール実装するディレクトリは任意ですので、以下の例は、一例としてご理解下さい。
1. MPICH2 パッケージ tar ファイルの展開
tar xvzf mpich2-1.4.1p1.tar.gz cd mpich2-1.4.1p1
2. 環境変数の設定と configure スクリプトの実行
env CC=pgcc FC=pgfortran F77=pgfortran CXX=pgcpp CFLAGS=-fast FCFLAGS=-fast FFLAGS=-fast ¥ CXXFLAGS=-fast MPICH2LIB_LDFLAGS=-pgf90libs ./configure --enable-shared ¥ --with-device=ch3:nemesis --prefix=/export/mpich2-141p1 >&configure.log
※上記の ¥ マークは、「継続行」の意味ですので、上記の3行は、「1行のコマンド」として実行して下さい。
PGI 11.0, 11.1 でコンパイル生成する場合は、リンケージに問題が生じますので、環境変数に LDFLAGS=-nomp を追加して configure して下さい。PGI 11.2 以降であれば、必要ありません。以下の例は、PGI 11.10 バージョンを使用してます。
プロセスマネージャ Hydra について
MPICH2 で従来使用していた mpd と言うプロセスマネージャは、ユーザが明示的に mpd デーモンを稼働させてから、mpiexec でプログラムを起動する必要がありました。Hydraを使用するとこうした事前準備は必要がなく、各ノードに備えられているリモート通信用のデーモン(例 ssh, pbs, slurm, sge等)を使用して、プロセス間の管理を行う機能を有します。新しく開発されたマネージャであるため、プロセス・スケーラビリティの向上や堅牢性を備えています。Hydra を使用すると、mpiexec (mpirun) コマンドだけで、MPIプログラムを投入できます。
3. MPICH2 のビルド
make >& make.log
4. MPICH2 を正式なインストール場所に実装
make install make install-examples
5. インストール実装場所の状況
この例では、MPICH2 ライブラリのインストール実装場所を 、/export/mpich2-141p1 として説明しています。その実装状況を bin ディレクトリと lib ディレクトリについて以下に表示します。
$ pwd /export/mpich2-141p1 $ ls bin/ etc/ examples/ include/ lib/ sbin/ share/ $ cd bin $ ls bt2line* clogprint* mpich2version* rlog_check_timeorder* check_callstack* hydra_nameserver* mpicxx* rlog_print* clog2TOslog2* hydra_persist* mpiexec@ rlogprint* clog2_join* hydra_pmi_proxy* mpiexec.hydra* slog2filter* clog2_print* jumpshot* mpif77* slog2navigator* clog2_repair* logconvertor* mpif90* slog2print* clog2print* mpic++@ mpirun@ slog2updater* clogTOslog2* mpicc* rlogTOsllsog2* $ cd ../lib $ ls clog2TOdrawable.jar libmpe_nompi_null.a libmpl.so.1.1.0* clog2TOslog2.jar libmpe_null.a libopa.a clog2print.jar libmpich.a libopa.la* clogTOdrawable.jar libmpich.so@ libopa.so@ clogTOslog2.jar libmpich.so.3@ libopa.so.1@ clogprint.jar libmpich.so.3.3* libopa.so.1.0.0* jumpshot.jar libmpichcxx.a libtmpe.a jumpshot_launcher.jar libmpichcxx.so@ logconvertor.jar libampe.a libmpichcxx.so.3@ mpe_prof.o libfmpich.a libmpichcxx.so.3.3* pkgconfig/ libfmpich.so@ libmpichf90.a slog2filter.jar libfmpich.so.3@ libmpichf90.so@ slog2navigator.jar libfmpich.so.3.3* libmpichf90.so.3@ slog2printrecur.jar liblmpe.a libmpichf90.so.3.3* slog2printserial.jar libmpe.a libmpl.a slog2update205to206.jar libmpe_collchk.a libmpl.la* traceTOslog2.jar libmpe_f2cmpi.a libmpl.so@ trace_rlog/ libmpe_nompi.a libmpl.so.1@ traceprint.jar
環境変数 PATH の設定
ビルドした MPICH2 の実行コマンド(bin directory) の場所を環境変数 PATH に設定 (sh 系の場合の例)する必要があります。このページでの例では、以下のローカルな directory 領域の場所として説明しています。
export PATH=/export/mpich2-141p1/bin:$PATH
[kato@photon29 tmp]# cd (HOME directory へ移動) [kato@photon29 etc]# vi .bashrc (.bashrc ファイルを編集して登録) (前略) export PATH=/export/mpich2-141p1/bin:$PATH :wq
MPI プログラムのコンパイル・実行例
簡単な Fortran プログラム例(mpihello.f)
program hello include 'mpif.h' integer ierr, myproc character*10 hostname call mpi_init(ierr) call mpi_comm_rank(MPI_COMM_WORLD, myproc, ierr) ierr=setvbuf3f(6,2,0) ierr=hostnm(hostname) write(6,100) myproc,hostname 100 format(1x,"hello - I am process",i3," host ",A10) print *, "Hello world! I'm node", myproc call mpi_finalize(ierr) end
簡単な C プログラム例(myname.c)
#include <unistd.h> #include "mpi.h" main(int argc, char **argv){ int len,ierr; char hname[32]; len = 32; MPI_Init( &argc, &argv ); gethostname(hname,len); printf("My name is %s\n",hname); MPI_Finalize( ); }
Fortran、C プログラムを mpif90、mpicc コマンドを使用してコンパイルし、実行モジュールを作成します。以前のような mpd デーモンの起動は必要ありません。但し、最低限、各ノード間では パスワードなしで ssh 通信が可能であるように設定しておく必要があります。ここでは、簡単に一台の Linux システム上のマルチコアを使用して、並列 MPI プロセスの実行を行います。以下の例は、一つのローカルマシン(photon29 と言うホスト)上の「マルチコア」を利用して、4つのマルチプロセスを起動して使用する例を示します。
[kato@photon29 mpihello]$ which mpif90 /export/mpich2-141p1/bin/mpif90 (Fortranのコンパイルmpif90コマンドスクリプトを使うのが無難) [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo mpihello.f [kato@photon29 mpihello]$ mpiexec -n 4 a.out (あるいは、mpirun -n 4 a.out) hello - I am process 1 host photon29 Hello world! I'm node 1 hello - I am process 0 host photon29 Hello world! I'm node 0 hello - I am process 2 host photon29 Hello world! I'm node 2 hello - I am process 3 host photon29 Hello world! I'm node 3 (Cのコンパイルmpiccコマンドスクリプトを使うのが無難) [kato@photon29 mpihello]$ mpicc -fastsse -Minfo myname.c PGC-W-0156-Type not specified, 'int' assumed (myname.c: 3) PGC/x86-64 Linux 11.10-0: compilation completed with warnings [kato@photon29 mpihello]$ mpiexec -n 4 a.out My name is photon29 My name is photon29 My name is photon29 My name is photon29
クラスタ上での MPICH2 の実行のための準備と実行方法については、次のコラムをご覧下さい。