MPICH2 インストール Linux
(PGI 14.1以降は 新しい MPI-3 規格準拠の MPICH 3.0.4 がバンドルされましたのでご自身でビルドの必要はありません)PGI Workstation / Server for Linux 製品には、PGI コンパイラでプリコンパイルした MPICH1 のライブラリがバンドルされ、システムに実装できるようになっていますが、MPICH2 はご自身で構築して頂く必要があります。この MPICH2 ライブラリの構築方法を説明します。
2012年1月 6日 補筆
2011年3月15日 Copyright © 株式会社ソフテック 加藤
このガイドは、MPICH2 の 2011年3月現在の最新バージョン 1.3.2p1 のライブラリ生成について説明します。これは、64bit Linux あるいは、32bit Linux に対して適用できます。このドキュメントの最新版が、こちらにあります。
(補筆)2012年1月現在の最新バージョン 1.4.1p1 でも以下と同じ方法構築することができます。
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.3.2p1.tar.gz cd mpich2-1.3.2p1
2. 環境変数の設定と configure スクリプトの実行
env CC=pgcc FC=pgfortran F77=pgfortran CXX=pgcpp CFLAGS=-fast FCFLAGS=-fast FFLAGS=-fast ¥ CXXFLAGS=-fast MPICH2LIB_LDFLAGS=-pgf90libs ./configure --with-pm=mpd --enable-shared ¥ --prefix=/opt/pgi/linux86-64/2011/mpi/mpich2 >& configure.log
※上記の ¥ マークは、「継続行」の意味ですので、上記の3行は、「1行のコマンド」として実行して下さい。
PGI 11.0, 11.1 でコンパイル生成する場合は、リンケージに問題が生じますので、環境変数に LDFLAGS=-nomp を追加して configure して下さい。PGI 11.2 以降であれば、必要ありません。
3. MPICH2 のビルド
make >& make.log
4. MPICH2 を正式なインストール場所に実装
make install make install-examples
5. インストール実装場所の状況
この例では、MPICH2 ライブラリのインストール実装場所を 、/opt/pgi/linux86-64/2011/mpi2/mpich として説明しています。その実装状況を bin ディレクトリと lib ディレクトリについて以下に表示します。
$ pwd /opt/pgi/linux86-64/2011/mpi2/mpich $ ls bin/ etc/ examples/ include/ lib/ sbin/ share/ $ cd bin $ ls bt2line* clogprint* mpich2version* plpa-info* check_callstack* hydra_nameserver* mpicxx* plpa-taskset* clog2TOslog2* hydra_persist* mpiexec@ slog2filter* clog2_join* hydra_pmi_proxy* mpiexec.hydra* slog2navigator* clog2_print* jumpshot* mpif77* slog2print* clog2_repair* logconvertor* mpif90* slog2updater* clog2print* mpic++@ mpirun@ clogTOslog2* mpicc* parkill* $ cd ../lib $ ls clog2TOdrawable.jar libmpe_nompi_null.a libmpl.so.1.0.0* clog2TOslog2.jar libmpe_null.a libopa.a clog2print.jar libmpich.a libopa.la* clogTOdrawable.jar libmpich.so@ libopa.so@ clogTOslog2.jar libmpich.so.2@ libopa.so.1@ clogprint.jar libmpich.so.2.2* libopa.so.1.0.0* jumpshot.jar libmpichcxx.a libtmpe.a jumpshot_launcher.jar libmpichcxx.so@ logconvertor.jar libampe.a libmpichcxx.so.2@ mpe_prof.o libfmpich.a libmpichcxx.so.2.2* pkgconfig/ libfmpich.so@ libmpichf90.a slog2filter.jar libfmpich.so.2@ libmpichf90.so@ slog2navigator.jar libfmpich.so.2.2* libmpichf90.so.2@ slog2printrecur.jar liblmpe.a libmpichf90.so.2.2* slog2printserial.jar libmpe.a libmpl.a slog2update205to206.jar libmpe_collchk.a libmpl.la* traceTOslog2.jar libmpe_f2cmpi.a libmpl.so@ traceprint.jar libmpe_nompi.a libmpl.so.1@
環境変数 PATH の設定
ビルドした MPICH2 の実行コマンド(bin directory) の場所を環境変数 PATH に設定 (sh 系の場合の例)する必要があります。このページでの例では、以下のローカルな directory 領域の場所として説明しています。
export PATH=/opt/pgi/linux86-64/2011/mpi2/mpich/bin:$PATH
[kato@photon29 tmp]# cd (HOME directory へ移動) [kato@photon29 etc]# vi .bashrc (.bashrc ファイルを編集して登録) (前略) export PATH=/opt/pgi/linux86-64/2011/mpi2/mpich/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( ); }
簡単な C++ プログラム例(myname.cpp)
#include <iostream> #include <unistd.h> #include "mpi.h" int main(int argc, char **argv){ int len; char hname[32]; len = 32; MPI_Init( &argc, &argv ); gethostname(hname,len); std::cout << "My name is " << hname << "\n"; MPI_Finalize( ); }
Fortran、C プログラムを mpif90、mpicc コマンドを使用してコンパイルし、実行モジュールを作成します。MPICH2 の mpd デーモンを起動した後、MPI 実行を行います。ここでは、簡単に一台の Linux システム上のマルチコアを使用して、並列 MPI プロセスの実行を行います。mpd は、メッセージパッシングを制御するデーモンソフトウェアであり、MPICH1 の時にはこうしたデーモンは必要ありませんでしたが、MPICH2 では、必ず、起動しておく必要があります。mpd デーモンソフトウェアは、1台のローカルなシステム上で起動するためのものです。クラスタ・ワイドで、各 mpd デーモンを起動させるためのコマンドは mpdboot と言うものが他に提供されています。これについては、PGIコンパイラによる MPICH2 の使い方(Linux)に説明しています。以下の例は、一つのローカルマシン(photon29 と言うホスト)上の「マルチコア」を利用して、4つのマルチプロセスを起動して使用する例を示します。
[kato@photon29 mpihello]$ which mpif90 /usr/pgi/linux86-64/2011/mpi2/mpich/bin/mpif90 (Fortranのコンパイルmpif90コマンドスクリプトを使うのが無難) [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo mpihello.f (mpdデーモン・プロセスのバックグラウンド起動) [kato@photon29 mpihello]$ mpd& [1] 11373 [kato@photon29 mpihello]$ mpiexec -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.3-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 (mpdデーモン・プロセスの停止) [kato@photon29 mpihello]$ mpdallexit
(注意 2012/1/6)
Red Hat 6.0/Scientific Linux 6.0/CentOS 6.0 以上の場合、/usr/bin/python2.4 コマンドがありません。mpdデーモンは、その起動スクリプトの中で /usr/bin/python2.4 を使用しますので、mpd の起動エラーが生じます。この場合は、python2.4 に対して、実体のある/usr/bin/python2.6 をシンボリックリンクして下さい。
クラスタ上での MPICH2 の実行のための準備と実行方法については、次のコラムをご覧下さい。