PGIコンパイラによる MPICH2 の使い方(Linux)

対象 MPICH2 PGIコンパイラ PGI CDK for Linux

 (PGI 14.1以降は 新しい MPI-3 規格準拠の MPICH 3.0.4 がバンドルされました)PGI コンパイラでコンパイルして構築した MPICH2 ライブラリの使用方法を説明します。なお、PGI CDK製品には、予め PGI CDK ソフトウェアのパッケージに含まれておりますので、PATH 環境変数の設定等は異なります。ここでは、オープンソースの MPICH2 パッケージを自ら構築した際の利用方法と、PGI CDK 製品にバンドルされている MPICH2 ライブラリの使用法を説明します。このページの説明は、MPICH2 がバンドルされていた PGI CDK 13.10 (2013) までの使用法を示したものです。PGI CDK 14.1 以降は、MPICH 3.0.4 の使用法をご覧ください。
2014年2月20日 更新2011年3月16日 Copyright © 株式会社ソフテック 加藤

MPICH2 実行(bin)コマンドの場所を環境変数 PATH に追加する

 MPICH2 のライブラリ環境の構築については、前回のコラムで説明しました。

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

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

 ここでの前提は mpich2 の実行コマンドが、以下のPATH(場所)に実装していることとします。個人用ユーザのホーム・ディレクトリ下の .bashrc ファイルの中の設定で、環境変数 PATH に以下を追加します。なお、ここでの例では、/export/mpich2-141p1 と言う、共用ファイルシステム(NFS)ディレクトリの配下に MPICH2 のソフトウェアを実装したものとして説明します。

 以下の記述は、2012年1月現在の最新バージョン 1.4.1p1 を使用した例です。

export PATH=/export/mpich2-141p1/bin/:$PATH

Linux 上での rsh、あるいは ssh 設定時の注意事項

 クラスタ上で、MPI 並列処理を行う場合、各ノード間でリモートアクセスが可能とする構成が必要となります。リモートアクセスのソフトウェアとしては、rsh あるいは ssh の二つの方法があります。なお、最近は、クラスタ構成ではなく、一つのシステム上のマルチコアを使用して MPI 実行するケースも多いと思いますが、この場合でも、そのシステム内に閉じた中で、以下のどちらかの TCP 通信形式が有効でなければいけません。

① rsh の設定
 rsh 系のソフトウェアは、現在の Linux のデフォルト・インストールにおいては、実装されておりません。従って、明示的に rsh/rlogin系のソフトウェアを Linux上にインストールする必要があります。そのほか、いくつかの Linux 上の設定があります。以下に、rsh 関連の設定に関して参考記事がありますので、そのリンクを記します。

  • http://www.proton.jp/main/unix/rsh.html
  • ルート権限での rsh の利用では、/etc/securetty ファイルに "rsh" 行を追加する必要があります。また、必要に応じて、rexec、rlogin 等も追加してください。

② ssh の設定に関する記事リンク
 ssh は、デフォルトでLinux上にインストールされておりますので、基本的に個人用の「鍵」の設定だけ行うことで使用することができます。以下は、ssh 設定に関して参考となる URL です。システムがクラスタ構成の場合は、/home 領域が共有されているはずですので、各ユーザのホーム配下に .ssh ディレクトリを作成の上、authorized_keys2 ファイル内に各ノードの公開鍵を全て記述します。

ノード間での rsh、ssh のリモート環境の確認

 クラスタ間の rsh あるいは、ssh リモートアクセス環境の動作を確認して下さい。

 リモート環境が設定されていることの確認は、ルート権限並びにユーザ環境において以下のコマンドが動作することで確認できます。例えば 3 ノード構成(master, node1, node2) の場合で説明すると、node1 から以下のコマンドを実行します。これにより、リモートログインが可能であれば、問題ないと言うことになります。以下と同じ確認が master、node2 においても必要です。全てのノード間でリモート環境が設定されている必要があります。なお、rsh、ssh 共に 「パスワード(パスフレーズ)認証無し」 でアクセスできる環境でなければなりません。

【From node1】
 $ rsh master date あるいは $ ssh master date
 $ rsh node2 date  あるいは $ ssh node2 date
 
【node1内だけでMPIを使う場合】自システムを指定してチェックする
 $ rsh node1 date あるいは $ ssh node1 date

複数のノードを有するクラスタの場合の PGI シェアードライブラリのコピー

 PGIコンパイラの PGI 専用のシェアードライブラリは、PGIをインストールしたノード(「マスタノード」と言う。)以外では存在していないため、マスタノードからコピーしてセットする必要があります。その一例を以下に示します。ここでは、Linux 64bit 環境 (linux86-64) 上の設定方法を例示します。以下の操作は、ルート権限で行います。

まず、PGIコンパイラを実装しているマスタノード上にログインします。PGIコンパイラの再配布可能なシェアードライブラリは、以下の場所に存在します。ここでの PGI のバージョンは、11.3 を想定します。以下のパス名の中の 11.3 の番号は、PGIの実装リビジョン番号により変化します。

【マスタノード上】
[root@photon29]# cd $PGI/linux86-64/11.3/REDIST
[root@photon29]# ls
libC.so        libcudaforemu.so  libpgf90.so   libpgf90_rpm1.so  libpgftnrtl.so  libpgnuma.so
libcudafor.so  libpgc.so         libpgf902.so  libpgf90rtl.so    libpgmp.so      libstd.so

 クラスタ上の共用ファイルシステム (NFS) 上に、PGI用のシェアードライブラリの保存場所を確保します。以下では、仮にこの場所を /export/PGIshared として話を進めます。上記の REDIST 配下にある lib*****.so ファイルを
全て、 /export/PGIshared 配下にコピーします。

[root@photon29]# cd /export
[root@photon29]# mkdir PGIshared
[root@photon29]# cd PGIshared
[root@photon29]# cp $PGI/linux86-64/11.3/REDIST/*.so .
[root@photon29]# ls
libC.so        libcudaforemu.so  libpgf90.so   libpgf90_rpm1.so  libpgftnrtl.so  libpgnuma.so
libcudafor.so  libpgc.so         libpgf902.so  libpgf90rtl.so    libpgmp.so      libstd.so

各自の .bashrc ファイルに LD_LIBRARY_PATH を指定

 ここからの設定は、各自のユーザ ID 上の処理です。シェル初期設定ファイル(bash の場合は HOME 上の .bashrc ファイル)の中に、LD_LIBRARY_PATH を指定します。LD_LIBRARY_PATH は、シェアードライブラリの検索パスの指定を行うための環境変数です。この PATH の中に、上記の PGI シェアードライブラリが存在するのディレクトリ(ここでの例では /export/PGIshared)を指定します。これによって、クラスタ内の全てのノード上の Linux シェル起動時に、LD_LIBRARY_PATH の検索パスの設定が行われ、PGIのシェアードライブラリ形式の実行モジュールの実行が、全てのノードで可能となります。

【各自のホームディレクトリ上にある .bashrc ファイルの中】
[kato@photon29]# cd   (ホームディレクトリへ)
[kato@photon29]# vi .bashrc
(省略)
export LD_LIBRARY_PATH=/export/PGIshared:$LD_LIBRARY_PATH     <== 追加する
:wq
[kato@photon29]#

MPIプログラムのコンパイル・リンク方法

1. メモリ空間 2GB 未満のプログラム

 Fortran / C プログラムの例は、こちらをご参照下さい。なお、MPICH2 を使用する場合のコンパイラのコマンドは、mpich2 のパッケージでビルドした mpif90 や mpicc コマンドを使用して下さい。(ライブラリの指定の不備による、無用な問題が起きません。)その他、必要に応じて PGI のコンパイル・リンクオプションを付加してください。

【mpif90等の MPICH2 コマンドの存在を確認】
 [kato@photon29 mpihello]$ which mpif90
 /export/mpich2-141p1/bin/mpif90

【Fortranのコンパイル (mpif90コマンド)】
 [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -o mpihello mpihello.f
 
【Cのコンパイル (mpiccコマンド)】
 [kato@photon29 mpihello]$ mpicc -fastsse -Minfo -o myname myname.c
 PGC-W-0156-Type not specified, 'int' assumed (myname.c: 3)
 PGC/x86-64 Linux 11.3-0: compilation completed with warnings

2. メモリ空間 2GB 以上のプログラム

【Fortranのコンパイル (mpif90コマンド)】
 [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -mcmodel=medium -o mpihello mpihello.f
 
【Cのコンパイル (mpiccコマンド)】
 [kato@photon29 mpihello]$ mpicc -fastsse -Minfo -mcmodel=medium -o myname myname.c
 PGC-W-0156-Type not specified, 'int' assumed (myname.c: 3)
 PGC/x86-64 Linux 11.3-0: compilation completed with warnings

  • 2GB 以上のメモリ(配列)空間を要するプログラムでは、-mcmodel=medium コンパイルオプションを付加します。これで生成された実行モジュールは、シェアード・ライブラリ・リンク形式のものとなります。

MPIプログラムの実行

 MPICH2 のプロセスマネージャとして、どのソフトウェアを使うかにより、実行環境の準備方法が異なります。ここでは、MPICH2-1.3 以降にデフォルトとして採用されている Hydra ソフトウェアを使用する場合と、過去のバージョンでデフォルトであった MPD ソフトウェアを使用する方法の二つを説明します。最新の MPICH2 バージョンを使用する場合は、Hydra マネージャの環境で使用して下さい。

Hydra プロセスマネージャ環境上の mpiexec の実行

 Hydra プロセスマネージャ配下で MPI実行する場合は、mpiexec コマンドでプログラムを投入するだけで済みます。昔の MPICH1 の時と同じような使い方で使用できます。以下の例では、三つのノードを使用して MPI 並列実行を行う方法を示します。ノード名は、photon28(Intel Core2 物理コア数2)、photon29(Intel Nehalem コア数4) と photon30(Intel SandyBridgeコア数4) とし、photon30 上のセッションから MPI 実行を起動します。

クラスタ上のホスト構成とそのCPUリソース数の定義を行うため hosts と言うファイルに作成します。このファイルにはMPI実行に使用するノード名(ホスト名)と物理的CPUコアリソース数を記述します。ホスト名の指定は、一行にホスト名を一つ記述することで行います。以下の例では、photon28/photon29/photon30 の三つのホスト記述します。なお、Hydra 環境でのMPI使用法は、こちらのサイトで説明しています。

【マシンファイル hosts の作成】
[kato@photon30 MPI]# vi hosts  (実行に使用するノードを指定するファイル))
photon29:4  #最初の4プロセスは、ここの4コアを使用
photon30:4  #次の3プロセス分は、このノードの4コアを使用
photon28:2  #次の2プロセス分は、このノードの2コアを使用
:wq
(ここで、mpd.hosts 作成完了)

【異なるCPUアーキテクチャ対応のために PGI Unified binary作成】
[kato@photon30 MPI]$ mpif90 -fast -Minfo -o mpihello hello.f -tp core2,nehalem,sandybridge
Scientific Linux release 6.1 (Carbon)
mpihello:
      1, PGI Unified Binary version for -tp=sandybridge-64
mpihello:
      1, PGI Unified Binary version for -tp=nehalem-64

[kato@photon30 MPI]$ mpicc -fast -Minfo -o myname myname.c -tp core2,nehalem,sandybridge
Scientific Linux release 6.1 (Carbon)
PGC-W-0156-Type not specified, 'int' assumed (myname.c: 3)
main:
      3, PGI Unified Binary version for -tp=sandybridge-64
main:
      3, PGI Unified Binary version for -tp=nehalem-64

【mpihelloプログラムの実行】
[kato@photon30 MPI]$ mpiexec -n 4 -f hosts mpihello  (4つのプロセスを使用して実行)
Scientific Linux release 6.1 (Carbon)
 hello - I am process  0 host photon29 (hostsファイル定義で最初の4プロセスは photon29上のものを使用)
 Hello world!  I'm node            0
 hello - I am process  1 host photon29
 Hello world!  I'm node            1
 hello - I am process  3 host photon29
 Hello world!  I'm node            3
 hello - I am process  2 host photon29
 Hello world!  I'm node            2
 
【mynameプログラムの実行】
[kato@photon30 MPI]$ mpiexec -n 8 -f hosts myname
My name is photon29 (hostsファイル定義で最初の8プロセスは photon29/30 上のもの)
My name is photon29
My name is photon30
My name is photon30
My name is photon30
My name is photon29
My name is photon30
My name is photon29

[kato@photon30 MPI]$ mpiexec -n 10 -f hosts myname
My name is photon30 (hostsファイル定義で10プロセスは photon29/30/28 上のもの)
My name is photon28
My name is photon30
My name is photon28
My name is photon30
My name is photon30
My name is photon29
My name is photon29
My name is photon29
My name is photon29

MPD プロセスマネージャ環境上の mpiexec の実行 (PGI CDK 11.10 以前にバンドル)

 MPICH2-1.2 以前は、各 MPIプロセスの管理を行うための mpd と言う管理デーモンを各ノードで起動する必要がありました。この mpd デーモンを起動してから、mpiexec コマンドで実行する形態になります。以下の例では、二つのノードを使用して MPI 並列実行を行う方法を示します。ノード名は、photon29 と photon28 とし、photon29 上のセッションから MPI実行を起動します。

 mpd デーモンを起動する前に、mpd.hostsと言うファイルを作成します。このファイルには、mpd のデーモンを起動するノード名(ホスト名)を記述します。 mpd デーモンが起動されるホストが、MPI並列実行されるノードと言うことになります。ホスト名の指定は、一行にホスト名を一つ記述することで行います。以下の例では、photon28 と photon29 の二つのホスト記述します。

【マシンファイル mpd.hosts の作成】
[kato@photon29 mpihello]# vi mpd.hosts  (実行に使用するノードを指定するファイル))
photon28
photon29
:wq
(ここで、mpd.hosts 作成完了)

【mpdデーモンの起動方法】
[kato@photon29 mpihello]$ mpdboot -n 2 -f mpd.hosts --verbose (二つのノードでmpdデーモンを起動)
running mpdallexit on photon29
LAUNCHED mpd on photon29  via
RUNNING: mpd on photon29
LAUNCHED mpd on photon28  via  photon29
RUNNING: mpd on photon28
(mpd デーモンの稼働状況を見る方法)
[kato@photon29 mpihello]$ mpdtrace -l
photon29_50401 (192.168.0.29)(IPアドレスが 127.0.0.0と表示される場合は、/etc/hostsに誤りの可能性)
photon28_39001 (192.168.0.28)

(mpdデーモンの接続テストの方法)
[kato@photon29 mpihello]$ mpdringtest 1000
time for 1000 loops = 0.452740907669 seconds

【mpihelloプログラムの実行】
[kato@photon29 mpihello]$ mpiexec -n 4 mpihello  (4つのプロセスを使用して実行)
 hello - I am process  0 host photon29      (photon29/photon28 に各 2プロセスずつ分散)
 Hello world!  I'm node            0
 hello - I am process  1 host photon28
 Hello world!  I'm node            1
 hello - I am process  3 host photon28
 Hello world!  I'm node            3
 hello - I am process  2 host photon29
 Hello world!  I'm node            2
 
【mynameプログラムの実行】
[kato@photon29 mpihello]$ mpiexec -n 4 myname
My name is photon29
My name is photon28
My name is photon28
My name is photon29

mpd デーモンの停止方法

【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 をシンボリックリンクして下さい。

PGI CDK 製品にバンドルしている MPICH2 ライブラリの使用(PGI CDK 13.10以前)

PGI CDK製品にバンドルされている MPICH2

 PGI CDK 製品には、MPICH1、MPICH2、MVAPICH1のライブラリが付属しており、インストール時に必要に応じて実装されております。基本的なライブラリ・ソフトウェアは、クラスタの管理ノード(マスタノード)に実装されていますが、スレーブノード上には、各MPI ライブラリのコマンドとシェアードライブラリが実装されます。また、これらのライブラリを利用した PGDBG 並列デバッガ並びに PGPROF 並列プロファイラも利用できます。MPICH2 を利用したプログラムの並列デバッグと並列プロファイリングは、PGI CDK ライセンスでしか実行できません。PGI Workstation/Server ライセンスの場合は、MPICH1 を使用してこれらのユーティリティを利用して下さい。これらの MPI ライブラリの実装場所(PGI CDK 2011 における 64 ビットLinux 場合の例)は以下の通りです。なお、MPICH2 を利用する場合のコンパイルの方法は、上記に述べた方法と同じです。なお、各MPIライブラリのコマンド(mpif90, mpicc, mpdboot等)を利用する場合は、環境変数 PATH に以下のパスの配下の bin を登録して下さい。

  • 【MPICH1】$PGI/linux86-64/2011/mpi/mpich/
  • 【MPICH2】$PGI/linux86-64/2011/mpi2/mpich/
  • 【MVAPICH1】$PGI/linux86-64/2011/mpi/mvapich/

PGI CDK 製品付属の MPICH2 + PGDBG デバッガの使用

 PGI CDK ライセンスにおける PGDBG デバッガは、ローカル並びにリモート MPI プロセスに対応し、その上限デバッグ・プロセス数は、購入ライセンスの「PGI CDKプロセス数」まで対応します。 デバッガの実行は、マスタノードのデスクトップ上、あるいは、リモート X-Window で行います。PGI コンパイラ製品に付属している pgdbg コマンドでデバッガ GUI をコマンドラインから起動しますが、その前に、デバッグ情報を含めた実行モジュールを作成します。デバッグ情報を含めるには、-g オプションを指定します。これにより、一般的なコンパイラ最適化は、disable されます。MPICH2 ライブラリを使用する場合は、さらに、-Mmpi=mpich2 オプションを追加します。これにより、デバッグ用の実行モジュールが作成されます。
 次に、PGDBG デバッガを起動するには、pgdbg に -mpi:mpiexec オプションを指定して起動します。さらに、実行に要するプロセス数の指定を -n 引数で指定します。以下の例は -n 4 としているので、4 プロセス並列の実行を指示しています。

FAQ Linux 上の PGI 11.0 以降で、pgdbg コマンドや pgprof コマンドでデバッグあるいはプロファイラのユーティリティを起動する際、JAVA のエラーが出力され起動できません。

【デバッグのためのコンパイラオプション】
[kato@photon29 MPI]$ pgfortran -Mmpi=mpich2 -g himenoBMTxpr.f

[kato@photon29 MPI]$ mpdboot -n 4 -f mpd.hosts -verbose  (四台のノードで mpd デーモンを起動)

【PGDBG デバッガの起動】
[kato@photon29 MPI]$ pgdbg -mpi:mpiexec -n 4 ./a.out

PGBDG 画面(プロセスグリッド表示)

PGDBG MSMPI画面

変数値の表示例

PGDBG MSMPI画面

表示ウインドウ

PGDBG MSMPI画面

MPIプログラムのプロファイリング方法

PGI CDK 製品付属の MPICH2 + PGPROF プロファイラの使用

 プロファイリングの実行は、マスタノードのデスクトップ上、あるいは、リモート X-Window で行います。pgprof コマンドを起動して GUI ベースで操作しますが、その前に、プロファイルを行うための実行モジュールを作成します。MPICH2 のプロファイルは、-Mprof=func (サブルーチン、関数)ベースと -Mprof=lines (ソース行)ベース、そしてサンプリングベースの -Mprof=time がサポートされています。コンパイル・リンク時のオプションは、-Mprof=mpich2,func あるいは、-Mprof=mpich2,lines あるいは、 -Mprof=mpich2,time を指定します。これにより、プロファイル用の実行モジュールが作成されます。なお、MPIライブラリを使用する場合、pgcollectを使用したサンプリングベースのプロファイリング機能はサポートしていません。
 次に、実行です。MPICH2 の実行では、mpiexec コマンドで MPI 実行起動します。実行後、プロセス数分の pgprof.out ファイルが、同じフォルダ(ディレクトリ)下に作成されます。このファイルを使用して pgprof は、MPI 実行プロファイルの情報を表示します。コマンドは、pgprof コマンドを単に実行すれば良いだけです。デフォルトの場所(カレント・ディレクトリ)に存在する pgprof.out ファイルとソースファイル、実行モジュールを使用して、プロファイル表示処理を行います。なお、-Mprof=mpich2,lines と -Mprof=mpich2,time モードのプロファイリングでは、各ソース行の表示レベルでプロファイリング時間情報を見ることが可能です。

【プロファイルのためのコンパイラオプション】
[kato@photon29 MPI]$ pgfortran -fastsse -Minfo -Mmpi=mpich2 -Mprof=mpich2,func  himenoBMTxpr.f
【MPIプログラムの実行】
[kato@photon29 MPI]$ mpiexec -n 4 ./a.out

実行後、4 MPI プロセスの実行の場合は、pgprof.out, pgprof1.out, pgprof2,out, pgprof3.out の
三つのファイル(プロファイル・データファイル)が作成される。

【プロファイラの実行】
[kato@photon29 MPI]$ pgprof -exe ./a.out

PGPRO総合情報画面(MPIの場合は、メッセージの情報も表示)

PGPROF MSMPI 全体画面

-Mprof=mpich2,lines を指定した場合のソース行レベルのプロファイル

PGPROF MSMPI Mprof=lines モードの画面