PGIコンパイラによる MPICH2 ライブラリ環境の構築2(Linux)

プロセス管理としてデフォルトの Hydra を使用

対象 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 とバージョン情報

 このガイドは、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行のコマンド」として実行して下さい。

  • FC/F77 環境変数は、MPICH の生成において使用する Fortran コンパイラのコマンド名を記述します。これは、双方とも pgfortran を指定します。
  • CC 環境変数は、MPICH の生成において使用する C コンパイラのコマンド名を記述します。PGI C コンパイラ (pgcc) がない場合は、gcc で代用します。その際は、CFLAGS="-O2"としてください。また、OPTFLAGS="-fast" LDFLAGS="-fast"を指定しないでください。
  • CXX 環境変数は、MPICH の生成において使用する C++ コンパイラのコマンド名を記述します。PGI C++ コンパイラ (pgCC) がない場合は、g++ で代用します。その際は、CXXFLAGS="-O2"としてください。また、OPTFLAGS="-fast" LDFLAGS="-fast"を指定しないでください。
  • CFLAGS, FFLAGS, CXXFLAGS 環境変数は、各コンパイラに与える PGI コンパイル・オプションをそれぞれ指定します。
  • OPTFLAGS 環境変数は、mpich ソースをコンパイルする際の全体に渡るコンパイラ最適化オプションを指定します。
  • LDFLAGS 環境変数は、必要に応じて、リンク時のオプションを指定します。また、MPICH2LIB_LDFLAGS=-pgf90libs は、mpicc コンパイラに対して、PGI fortran システム・ライブラリをリンクするようにセットする指示となります。
  • --with-device=ch3:nemesis は、通信デバイスとそのチャネルの指定です。ここでは、TCPソケットで通信することを想定して、一般のデバイス形式である ch3 に nemesis と言うチャネルオプションを指定しています。このオプションを指定しない場合のデフォルトは、--with-device=ch3:sock です。sock よりも最適化されており、ノード内の shared memory 上の通信に関しても最適化されています。
  • --with-pm=hydra は、mpich2 のメッセージパッシング・プロセスをシステム内で管理する方式を指定します。MPICH2 1.3以降のMPICH2のデフォルトは hydra ですので、このオプションは指定しなくても良いですが、注意喚起のために記しておきます。Hydra プロセスマネージャに関しては、Using the Hydra Process Manager に説明されています。なお、以前のバージョンで使用していたプロセス管理マネージャ MPD は、今後のリリースで廃止される予定です。
  • --prefix には、mpich2ライブラリを正式にインストール実装する場所をフルパス名で指定する。この例では、NFS共用ファイルシステム上の /export/mpich2-141p1 と言う場所を指定します。このページでは、クラスタ上の全てのノードで共通に使用するための MPICH2 環境構築の例を示しますので、共用ファイルシステム(NFS)ディレクトリの配下の一領域に実装します。これにより、MPICH2 の実行コマンドや shard library を同じ directory point で共用することができます。
  • --enable-shared は、shared library も生成することを指示するオプションです。これは、2GB 以上の実行モジュールを作成する際 -mcmodel=medium コンパイル・オプションを使用する際に必要なライブラリです。

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等の設定と MPIプログラムのコンパイルの方法

環境変数 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 の実行方法について

 クラスタ上での MPICH2 の実行のための準備と実行方法については、次のコラムをご覧下さい