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

プロセス管理として MPD を使用

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

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

  • 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-pm=mpd は、mpich2 のメッセージパッシングをシステム内で管理するデーモン・ソフトウェア mpd を生成します(これは必須です)。
  • --prefix には、mpich2ライブラリを正式にインストール実装する場所をフルパス名で指定する。この例では、ローカルな directory 領域である /opt/pgi/linux86-64/2011/mpi/mpich2 と言う場所を指定します。もし、クラスタ上の全てのノードで共通に使用するための 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 以降であれば、必要ありません。

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

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

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