PGIコンパイラによる MPICH3 の使い方(Linux/OS X)

対象 MPICH3 PGIコンパイラ デバッグ方法 プロファイル Linux

 PGI 14.1 以降に、PGI Workstation/Server/CDK for Linux 64bit 並びに Apple OS X 64bit 製品に付属している MPICH3 ライブラリの使用方法を説明します(なお、32bit 環境用は付属しておりません)。この MPICH3 は、新しい MPI-3 規格に準拠したライブラリです。ここでは、主に PGIコンパイラをインストールしてある「一つのシステム」上のマルチコアを利用した MPI 並列処理を行う場合の構成の方法を説明します。PGI Workstation/Server 製品にバンドルされた MPICH3 は、コンパイラをインストールしたシステム内のみで MPI 実行ができる構成となっております。PGI CDK 製品の場合は、クラスタシステム全体で MPI の実行が可能です。
2015年2月10日更新 Copyright © 株式会社ソフテック 加藤

PGIコンパイラの MPI ライブラリ総括ページはこちらへ

PGIコンパイラのインストール中に MPICH パッケージを実装する

 Linux 版の PGI Workstation ソフトウェアのインストール・スクリプト実行中に、MPICH のライブラリパッケージを実装するかどうかの設問があります。これを Yes として実装して下さい。もし、以前のインストール中に MPICH を実装していなかった場合は、再度、同じバージョンもしくは、最新の PGI のバージョン(リビジョン)をダウンロードして、再度、PGI コンパイラ・ソフトウェア自体をインストールしてください。なお、この場合は、すでに実装しているPGIのソフトウェアを削除する必要はありません(上書きインストールで良い)。

 具体的には、インストール・スクリプト実行中に以下のような設問が現れます。その際、MPICH プログラムのデバッグで使用する PGDBG デバッガが使用するリモート通信方法を指定します(これは、ノード内の MPI 実行時のリモート通信環境を指定するものではありません。これに関する指定は必要ありません)。PGDBGデバッガのプロセス間通信に SSH 環境を使用するか RSH 環境を使用するかの選択です。

Do you wish to install MPICH?(y/n) 
y
script /tmp/PGI/install_mpich

Remote execution method? [rsh,ssh]
ssh               (ここでの例は、sshを選択)

Installing PGI MPICH components into /opt/pgi
This might take awhile ...

See the files /opt/pgi/linux86{-64}/2015/mpich.{csh,sh} for examples of 
how to set your environment to run and debug MPI programs

Linux システム環境での rsh、あるいは ssh 設定時の注意事項

同一システム内のマルチコアを利用して MPI 実行する場合、以下に述べる rsh あるいは ssh の設定は必ずしも必要ありません。PGDBG を使用する場合は、どちらかの通信手段を使用できるように設定してください。

 一般的に 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 です。あるいは、google 等で「ssh パスワード」のキーワードで検索すると、「ssh でパスワード無し」でアクセスする方法の関連記事が出てきます。

システム上での rsh、ssh のリモート環境の確認

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

 PGDBG デバッガを使用する場合、リモート環境が設定されていることを確認してください。ユーザの環境において以下のコマンドが動作することで確認できます。例えば node1 と言うホスト上で、以下のコマンドを自システムに対して実行します。これにより、リモートログインが可能であれば、問題ないと言うことになります。なお、rsh、ssh 共に 「パスワード(パスフレーズ)認証無し」 でアクセスできる環境でなければなりません。

【自システム内だけでMPIを使う場合】
 $ rsh node1 date あるいは $ ssh node1 date

 PGI CDK の場合は、クラスタシステム上でのノード間のリモート環境が設定されていることを確認してください。mpiexec 等でデフォルトで使用する通信環境は、ssh です。なお、rsh あるいは ssh 共に 「パスワード(パスフレーズ)認証無し」 でアクセスできる環境でなければなりません。

MPICH 実行(bin)コマンドの場所を環境変数 PATH に追加する (PGI Workstation 製品)

 この設定は、PGI Workstation/Server 製品を使用した場合の各自のユーザアカウント上の処理です。シェル初期設定ファイル(bash の場合は HOME 上の .bashrc ファイル)の中に、MPICH 関係の PATH を設定します。PGIコンパイラに付属している MPICH のソフトウェアは、以下の場所に実装されています。パスの中の '2015' は、PGI 2015 (15.x) バージョンの場合の総称 directory の数字です。適宜、実装している PGI のバージョンにより、変更して下さい。以下の PATH を加えることにより、デフォルトで MPICH のコマンドが使用できます。以下の PATH 名は、$PGI/linux86-64/2015/mpi.sh ファイルの中にも記載されています。なお、32bit 環境には、MPICH3 は付属しておりません。

【各自のホームディレクトリ上にある .bashrc ファイルの中】
[kato@photon29]# cd      (ホームディレクトリへ)
[kato@photon29]# vi .bashrc (editor で以下を追加する)

【64bit 環境のみ】
   export PATH=$PGI/linux86-64/2015/mpi/mpich/bin/:$PATH

PGI CDK 製品の場合の環境変数の設定 (PGI CDK 14.1以降)

 PGI CDK 製品の場合は、以下の PATH の設定を追加してください。さらに、環境変数 LD_LIBRARY_PATH の指定に関しては、以下のように 2 行必要となります。パス内のバージョンを表す番号が 総称バージョン名 2016 と リビジョン番号名 16.x の二種類あります。以下に例示したとおりに LD_LIBRARY_PATH を指定してください。もし、これに誤りがある場合は、クラスタノード間の mpiexec の実行時にエラーが生じます。なお、以下の例に示した16.x 部分は、例えば、PGI CDK 16.1 の実装であれば、16.1 と指定してください。

【各自のホームディレクトリ上にある .bashrc ファイルの中】
[kato@photon29]# cd      (ホームディレクトリへ)
[kato@photon29]# vi .bashrc (editor で以下を追加する)

【64bit 環境のみ】
   export PATH=$PGI/linux86-64/2016/mpi/mpich/bin/:$PATH
   export LD_LIBRARY_PATH=$PGI/linux86-64/2016/mpi/mpich/lib:$PATH
   export LD_LIBRARY_PATH=$PGI/linux86-64/16.x/libso:$PATH

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

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

 Fortran / C プログラムの例は、こちらをご参照下さい

 MPICH を使用する場合のコンパイラのコマンドは、二つあります。PGI のネイティブなコンパイラコマンドに
-Mmpi=mpich と言うオプションを付加して使う場合と、MPICH のパッケージで作成された mpif90 コマンドと mpicc コマンドを使用する場合です。どちらを使用しても構いません。また、どちらの場合でも PGI 用のコンパイル・リンク・オプションを適宜指定することができます。ここで、 -Mmpi=mpich は予め MPICH3を使用するようにプリセットされているオプションです。これらのコマンドを指定すると、-I オプション(インクルードファイルの場所)や -L オプション(ライブラリの場所)等を指定するが必要ありません。

【Fortranのコンパイル pgfortran コマンド】
[kato@photon29 mpihello]$ pgfortran -fastsse -Minfo -Mmpi=mpich -o mpihello mpihello.f

【Fortranのコンパイル mpif90 コマンド】
[kato@photon29 mpihello]$ which mpif90
/opt/pgi/linux86-64/2015/mpi/mpich/bin/mpif90

[kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -o mpihello mpihello.f
------------------------------------------------------------------------------------
【Cのコンパイル (pgcc コマンド)】
[kato@photon29 mpihello]$ pgcc -fastsse -Minfo -Mmpi=mpich -o myname myname.c

【Cのコンパイル (mpicc コマンド)】 
[kato@photon29 mpihello]$ which mpicc
/opt/pgi/linux86-64/2015/mpi/mpich/bin/mpicc

[kato@photon29 mpihello]$ mpicc -fastsse -Minfo -o myname myname.c

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

 2GB 以上のメモリ空間を使用するプログラムのコンパイルには、PGI の 64bit 用のオプション -mcmodel=medium を追加指定してください。なお、Apple OS X は、2GB 以上の静的メモリ空間をサポートしていませんので、-mcmodel=medium はサポートしていません。

【Fortranのコンパイル】
 [kato@photon29 mpihello]$ pgfortran -fastsse -Minfo -Mmpi=mpich -mcmodel=medium -o mpihello mpihello.f
 [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -mcmodel=medium -o mpihello mpihello.f
 
【Cのコンパイル】
 [kato@photon29 mpihello]$ pgcc -fastsse -Minfo -Mmpi=mpich -mcmodel=medium -o myname myname.c
 [kato@photon29 mpihello]$ mpicc -fastsse -Minfo -mcmodel=medium -o myname myname.c

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

MPIプログラムの実行

MPICHの machinefile について

 このページの説明は、PGIコンパイラをインストールした「一つの Linux システム上のマルチコアを使用して MPI 実行する」こととしています。クラスタ構成で他のノードも使用した並列実行は想定していません。クラスタ上での MPI 環境実現したい場合は、「PGIコンパイラによる MPICH2 ライブラリ環境の構築(Linux) 」をご覧下さい。
 MPI並列実行で使用するノード名(ホスト名)は、一般に、以下の場所にある、machines.LINUXに記述されています。PGIコンパイラに付属する MPICH の構成では、このファイルの中身は、PGI をインストールしたホスト名が 1 行記述されているだけです。従って 1 台のローカルなマシン上で複数のプロセスを起動して MPI 並列実行することがデフォルトの挙動となります。以下の例は、photon29 と言うマシン(4物理CPUコア)上に PGI をインストールして、mpirun 実行することとして説明します。

【デフォルトのマシンファイル machines.LINUX】
$PGI/linux86-64/2015/mpi/mpich/share/machines.LINUX

mpiexec(mpirun)コマンドで並列実行

 MPIの実行を行うラウンチャー・コマンドは、mpiexec あるいは mpirun です。現バージョンでの正式なものは、mpiexec です。mpirun は昔の MPICH バージョンで使用されていたため、エイリアス名として残しております。また、MPICH の実行を司る Hydra Process Manager に関しては、こちらに説明がありますのでご参照ください。

【mpiexecのヘルプ】
[kato@photon29 mpihello]$ mpiexec -help

Usage: ./mpiexec [global opts] [exec1 local opts] : [exec2 local opts] : ...

Global options (passed to all executables):

  Global environment options:
    -genv {name} {value}             environment variable name and value
    -genvlist {env1,env2,...}        environment variable list to pass
    -genvnone                        do not pass any environment variables
    -genvall                         pass all environment variables not managed
                                          by the launcher (default)

  Other global options:
    -f {name}                        file containing the host names
    -hosts {host list}               comma separated host list
    -wdir {dirname}                  working directory to use
    -configfile {name}               config file containing MPMD launch options

Local options (passed to individual executables):
(以下略)
【mpihelloプログラムの実行】
[kato@photon29 mpihello]$ mpiexec -n 4 mpihello  (4つのプロセスを起動して実行)
 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
 hello - I am process  1 host photon29
 Hello world!  I'm node            1
 
【mynameプログラムの実行】
[kato@photon29 mpihello]$ mpiexec -n 4 myname
My name is photon29
My name is photon29
My name is photon29
My name is photon29

PGI CDK 製品 ホストファイルの指定方法

 mpiexec コマンドで、明示的にホストファイルを指定して実行するには、-f {hostfile} オプションを使用します。hostfile には使用するクラスタ内のノード名を記述しておきます。mpiexec の詳細に関しては、こちらに説明がありますのでご参照ください。

hostfile名を hosts とします。ノード名と、コロンで区切りその最大プロセッサ(コア)数を定義しています。

[kato@photon29]# cat hosts
photon29:2
photon30:4
photon31:8

[kato@photon29]# mpiexec -f hosts -n 10 ./a.out

MPIに使用する最大プロセス数について

 MPI 実行で使用する「複数のプロセス」数の最大値は、使用システムに実装されている CPU の総コア数と言うことになります。最近のインテル・プロセッサは、「ハイパー・スレッディング」技術で、物理コア数の 2 倍の数を「スレッド・コア数」として表示していますが、HPC の並列計算では、「物理コア数」をそのシステムが並列実行に使用する最大コア数(並列許容プロセス数)として、並列実行を行います。(一般に、HPC 用途の純並列実行計算の場合、BIOS レベルで、Hyper threading を disable にします。なぜなら、Hyper threading とは、一つの物理コア内に、全ての CPU リソース(演算器)をダブルで持っていなため、リソース競合を起こし、並列性能を低下させる要因となります。)

MPIプログラムのデバッグ方法

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

 デバッガの実行は、Linux/OS X のデスクトップ上で行います。PGIコンパイラ製品に付属している pgdbg コマンドでデバッガ GUI をコマンドラインから起動しますが、その前に、デバッグ情報を含めた実行モジュールを作成します。デバッグ情報を含めるには、-g オプションを指定します。これにより、一般的なコンパイラ最適化は、disable されます。MPICH ライブラリを使用する場合は、さらに、-Mmpi=mpich オプションを追加します。これにより、デバッグ用の実行モジュールが作成されます。
 次に PGDBG デバッガを起動しますが、以下のように -mpi -n {プロセス数} と言う引数を付けて起動します。以下の例は -n 4 としているので、4 プロセス並列の実行を指示しています。なお、PGI Workstation/PVF ライセンスでは、8 プロセスまで、PGI Server ライセンスでは 16 プロセスまでの MPI デバッグ、プロファイリングが可能です。なお、PGI CDK ライセンスでは、ローカルノードだけのMPI並列デバッグだけでなく、リモートノードに渡る並列プロセスのデバッグが可能です。ただ、今はマルチコアのローカルノードでデバッグが可能となりましたので、特別なことがない限りあえて、リモートノードを含めたMPIデバッグは必要ないでしょう。 PGI CDK 実装の場合も以下と同じ方法で、MPICH プログラムのデバッグ、プロファイルが可能です。

詳細な使用法に関しては、PGDBG のマニュアルをご覧ください

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

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

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

PGBDG (旧バージョン)画面(プロセスグリッド表示)

PGDBG MSMPI画面

変数値の表示例

PGDBG MSMPI画面

表示ウインドウ

PGDBG MSMPI画面

MPIプログラムのプロファイリング方法 (PGI 15.10 まで、PGI16.1 以降ではMPI対応機能なし)

PGI Workstaion 製品付属の PGPROF プロファイラの使用

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

詳細な使用法に関しては、PGPROF のマニュアルをご覧ください

【プロファイルのためのコンパイラオプション】
[kato@photon29 MPI]$ pgfortran -fastsse -Minfo -Mmpi=mpich -Mprof=mpich,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=mpich,lines を指定した場合のソース行レベルのプロファイル

PGPROF MSMPI Mprof=lines モードの画面

-Mprof=mpich,lines の場合の CCFF コンパイル情報で最適化の指針等の表示

PGDPROF MSMPI Minfo=ccff 画面