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

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

 (PGI 13.10 以前にバンドルされている MPICH-1 の使用法です)PGI Workstation/Server for Linux 製品に付属している MPICH1 ライブラリの使用方法を説明します。ここでは、PGIコンパイラをインストールしてある「一つのシステム」上のマルチコアを利用した MPI 並列処理を行う場合の構成の方法を説明します。もちろん、クラスタ構成の中で使用することもできますが、MPICH のソフトウェアを別途、クラスタ用に実装する必要があります。この場合は、新規に MPICH 構成を構築した方が早いため、別のコラムで紹介している MPICH のバージョン 2 である MPICH2 のビルドの方法をご参照下さい。
2011年3月17日 Copyright © 株式会社ソフテック 加藤

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

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

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

 具体的には、インストール・スクリプト実行中に以下のような設問が現れます。その際、システム(ノード)間のリモート・アクセスの方法を選択しなければなりません。ノード間双方で、Linuxの rsh でリモートアクセス通信を行うか、あるいは ssh で行うかの選択を行って下さい。選択された「リモート通信」形式のライブラリが実装されます。

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

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

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

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

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

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

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

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

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

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

 この設定は、各自のユーザ ID 上の処理です。シェル初期設定ファイル(bash の場合は HOME 上の .bashrc ファイル)の中に、MPICH1 関係の PATH を設定します。PGIコンパイラに付属している MPICH1 のソフトウェアは、以下の場所に実装されています。パスの中の '2011' は、PGI 2011 (11.x) バージョンの場合の総称 directory の数字です。適宜、実装している PGI のバージョンにより、変更して下さい。以下の PATH を加えることにより、デフォルトで MPICH1 のコマンドが使用できます。

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

【64bit 環境】
   export PATH=$PGI/linux86-64/2011/mpi/mpich/bin/:$PATH
【32bit 環境】
   export PATH=$PGI/linux86/2011/mpi/mpich/bin/:$PATH

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

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

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

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

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

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

[kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -o mpihello mpihello.f
------------------------------------------------------------------------------------
【Cのコンパイル (pgcc コマンド)】
[kato@photon29 mpihello]$ pgcc -fastsse -Minfo -Mmpi=mpich1 -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

【Cのコンパイル (mpicc コマンド)】 
[kato@photon29 mpihello]$ which mpicc
/usr/pgi/linux86-64/2011/mpi/mpich/bin/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 以上のプログラム

 2GB 以上のメモリ空間を使用するプログラムのコンパイルには、MPICH1 のコンパイラスクリプトである mpif90 と mpicc を使用して下さい。必要となる MPICH1 のシェアード・ライブラリを組み込むようにリンケージが可能となります。なお、必ず、 mpif90 と mpicc のオプションとして -shlib と、PGI の 64bit 用のオプション -mcmodel=medium を追加指定してください。

【Fortranのコンパイル (mpif90コマンド)】
 [kato@photon29 mpihello]$ mpif90 -fastsse -Minfo -mcmodel=medium -shlib -o mpihello mpihello.f
 
【Cのコンパイル (mpiccコマンド)】
 [kato@photon29 mpihello]$ mpicc -fastsse -Minfo -mcmodel=medium -shlib -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プログラムの実行

MPICH1の machinefile について

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

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

mpirun コマンドで並列実行

【mpihelloプログラムの実行】
[kato@photon29 mpihello]$ mpirun -np 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]$ mpirun -np 4 myname
My name is photon29
My name is photon29
My name is photon29
My name is photon29

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

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

MPIプログラムのデバッグ方法(PGI 13.10 までの使用法)

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

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

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

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

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

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

PGDBG MSMPI画面

変数値の表示例

PGDBG MSMPI画面

表示ウインドウ

PGDBG MSMPI画面

MPIプログラムのプロファイリング方法(PGI 13.10 までの使用法)

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

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

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

PGPROF MSMPI Mprof=lines モードの画面

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

PGDPROF MSMPI Minfo=ccff 画面