MS-MPI MPIプログラム PGIコンパイラ デバッグ方法 Windows
PGI 2019以降の Winodws 製品には MS-MPI ライブラリはバンドルされていません(使用できません)。このページは、PGI 18.7 以前の製品を購入したユーザのみ有効です。Windows 版の PGI Workstation/Server、Professional 製品あるいは、PGI Visual Fortran for Windows (PVF) 製品と共に使用できるマイクロソフト社の MS-MPI ライブラリ(無償)の使用方法を説明します。MS-MPI ライブラリは、MPI-1、MPI-2 の規格に準拠した MPI ライブラリです。従って、一般的な MPI関数、ルーチンを使用したプログラムは、PGIコンパイラで MS-MPI ライブラリをリンクすることにより、MPI 実行モジュールを作成することができます。さらに、付属する PGI の PGDBG 並列デバッガと PGPROF プロファイラにより、MS-MPI の並列デバッグ/プロファイリングも可能です。ここでは、PGIコンパイラをインストールしてある「一つの Windows システム」上のマルチコアを利用した MPI 並列処理を行うまでの方法を説明します。無償で提供される MS-MPI 機能は、1台の Windows 内で閉じて使用するだけに限定されており、Winodws Cluster で使用する場合は、別途、クラスタのOSとして、マイクロソフト社の有償の「Windows(R) HPC Server」のライセンスが必要となります。ここでは、一つのシステム内のマルチコア・プロセッサを利用して、Flat-MPI 実行を行う方法やデバッグ、プロファイリング方法を説明します。
2018年6月28日 更新
2011年3月21日 Copyright © 株式会社ソフテック 加藤
なお、PGI 2014 (14.1)以降の Windows 用製品(PGI Workstation / PGI Visual Fortran) には、Microsoft HPC Pack 2012 SP1 MS-MPI Redsitributable Pack (version 4.1.4174.0) for 64-bit and 32-bit development が、PGI のインストール時に実装されております。PGI Workstation コマンドプロンプト(端末)画面を開き、以下のコマンドをで MPIコマンドの PATH の確認を行ってください。
PGI 17.4 の場合の例 PGI 18.5 PGI$ which mpiexec /c/Program Files/Microsoft HPC Pack 2012/Bin/mpiexec
以上の実装のみで、MS-MPI のソフトウェアを使用できる準備は終了です。
(注意)インテル社のコンパイラも同じシステムにインストールされている場合、インテル社独自の mpiexec 等の MPI コマンド群がシステムに実装されています。さらにインストール時にこれら MPIコマンドを参照するための PATH 環境変数が自動的にセットされています。すなわち、このインテル社のコマンドが優先されて使用されるようにパス(PATH環境変数)の設定がなされています。こうした状況で、mpiexec 等のコマンドを実行すると、「Error while connecting to host, 対象のコンピューターによって拒否されたため、接続できませんでした。 (10061)」とか、User credentials needed to launch processes: account (domain\user) ***** 等のエラーが生じてアボートします。
PCに intel compiler も実装されている場合の一例 PGI$ mpiexec -n 2 mpihello.exe Error connecting to the Service [mpiexec@kato4] ..\hydra\utils\sock\sock.c (270): unable to connect from "ホスト名" to "ホスト名" (No error) read from stdin failed, error 6.(以下省略) あるいは、 PGI$ mpiexec -np 2 ./copytest.exe 100000000 User credentials needed to launch processes: account (domain\user) [kato-PC\kato]: ******** password: Error connecting to the Service PGI$ which mpiexec /c/Program Files (x86)/Common Files/Intel/Shared Libraries/redist/intel64_win/mpirt/mpiexec
これを回避するには、Windows のデフォルト PATH 環境変数の設定を変更する必要があります。「コントロールパネル」--「システム」--「システムの詳細設定」--「環境変数」--「システム環境変数」の中の Path の内容を編集します。インテルコンパイラ用の PATH の設定を一番最後に定義するように編集してください。
一例: 以下のパスを移動させる(以下のパス名は一例です) %INTEL_DEV_REDIST%redist\intel64\mpirt;%INTEL_DEV_REDIST%redist\intel64\compiler; %INTEL_DEV_REDIST%redist\ia32\mpirt;%INTEL_DEV_REDIST%redist\ia32\compiler;
使用する PGI コンパイラのバージョンが PGI 2012(12.10)以前の場合は、マイクロソフト社のサイトから、Microsoft HPC Pack 2008 SDK SP2(無償)のソフトウェアを入手しインストールして下さい。このソフトウェアが Windows 内に実装されれば、MS-MPI ライブラリとその実行コマンド mpiexec が使用できる環境となります。なお、インストールのウイザードでは、実装するフォルダを尋ねてきますが、この場所は必ず、デフォルトの場所である C:\Program Files\Micorosoft HPC Pack 2008 SDK\ として下さい。
【重要】この時点で、HPC Pack 2008 SDK の新バージョン 「HPC Pack 2008 SDK R2」 や 「HPC Pack 2008 R2 MS-MPI Redistributable Package」 がリリースされていますが、PGI 13.x コンパイラを利用する場合は、これらは実装しないで下さい。(MS-MPI のソフトウェア実装 directory が異なるため、利用できません。)
なお、PGI 2013 (13.2)以降の Windows 用製品(PGI Workstation / PGI Visual Fortran) には、MS-MPI ライブラリがバンドルされており、PGI のインストール時に実装されております。PGI Workstation コマンドプロンプト(端末)画面を開き、以下のコマンドをで MPIコマンドの PATH の確認を行ってください。
PGI 13.3 の場合の例 PGI$ which mpiexec /c/Program Files/Microsoft HPC Pack 2008 R2/Bin/mpiexec PGI$
以上の実装のみで、MS-MPI のソフトウェアを使用できる準備は終了です。
Windows 版の PGI コンパイラ製品には、二種類あります。一つは、Linux版や OS X 版のものと同じ Linux bash シェルインタフェース(cygwin)でコマンドプロンプト上で使用する PGI Workstation/Server 製品です。この製品は、Fortran、C、C++ の三つの言語のコンパイラ機能を提供しています。もう一つは、Fortran対応のみですが、Microsoft Visual Studio 上で使用する PGI Visual Fortran (PVF と言う。)製品です。このソフトウェアは、Visual Studio 上で、その統合環境のインタフェースで使用できます。なお、PVF の使用ライセンスは、 PGI Workstation/Server 製品の中の Fortran 言語を含んだ製品の中に含まれており、Fortran に関して言えば、二つの使用インタフェースでコンパイラを使用できます。以下は、参考記事です。
① PGI Workstation/Server
Windows 版 PGI コンパイラの使用法特集(2) PGI Workstation 製品を使う
② PGI Visual Fortran
Windows 版 PGI コンパイラの使用法特集(1) PGI Visual Fortran 製品を使う
MPI プログラムの例
簡単な Fortran プログラム例(mpihello.f)
program hello include 'mpif.h' integer ierr, myid call mpi_init(ierr) call mpi_comm_rank(MPI_COMM_WORLD, myid, ierr) write(6,100) myid 100 format(1x,"hello - I am process",i3) call mpi_finalize(ierr) end
簡単な C プログラム例(mpihello.c)
#include <stdio.h> #include <mpi.h> int main (argc, argv) int argc; char *argv[]; { int myid, numprocs; MPI_Init (&argc, &argv); /* starts MPI */ MPI_Comm_rank (MPI_COMM_WORLD, &myid); /* get current process id */ MPI_Comm_size (MPI_COMM_WORLD, &numprocs); /* get number of processes */ printf( "Hello world from process %d of %d\n", myid, numprocs ); MPI_Finalize(); return 0; }
簡単な C++ プログラム例(mpihello.cpp)、PGI 15.10 以前で利用可能
#include <mpi.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { int myid, numprocs; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); cout << "Hello from process " << myid << " of " << numprocs << endl; MPI_Finalize(); }
また、PGI 14.1 以降、例題プログラムが実装されております。Windows 上の C:\Program Files\PGI\win64\2014\examples (PGI 2014 の場合)のフォルダ内に MPI 用の例題フォルダがあります。この例題使用してテストすることもできます。
上図の中の「MPIフォルダ」を自身のユーザ領域にフォルダ毎コピーしてください(エクスプローラを使用して行う)。PGI Workstation コマンドプロンプトを開き、コピーした先のフォルダまで移動してください。その後、以下のように make で実行すると例題プログラムを MPI 実行できます。
PGI$ pwd /d/PGI/MPI/PGI2014 (コピーしたフォルダ先へ) PGI$ ls (Makefile utilityを使う) Makefile* samples/ scalapack/ PGI$ make (実行方法を確認する) To build and run a specific example, do the following: make buflimit_test : MPI buffering example make [NPROCS=n] copy_test : MPI point-to-point copy test make [NPROCS=n] mpihello_test : MPI Hello world example make [NPROCS=n] mpp_test : MPI communication performance test where NPROCS is set to the number of processors to test, default is 2. PGI$ make copy_test (make でコンパイル・実行)
1. PGI Workstation コマンドプロンプト上での使用
PGI Workstation のコマンドプロンプト、あるいは、PGI Visual Fortran に付属する「コマンドプロンプト」上で、コンパイラコマンドを使用して MPI プログラムのコンパイル、リンクする方法を説明します。MS-MPI ライブラリを使用して、コンパイル、リンクするには、-Mmpi=msmpi オプションを付加するだけで可能となります。このオプションは、マイクロソフトの MS-MPI のデフォルトの実装場所から、MPIのヘッダーファイルとライブラリを参照してコンパイル・リンクすることを指示するものです。
【Fortranのコンパイル pgfortran コマンド】 kato5:~/MPI$ pgfortran -fastsse -Minfo -Mmpi=msmpi -o f.exe mpihello.f ------------------------------------------------------------------------------------ 【Cのコンパイル (pgcc コマンド)】 kato5:~/MPI$ pgcc -fastsse -Minfo -Mmpi=msmpi -o c.exe mpihello.c ------------------------------------------------------------------------------------ 【C++のコンパイル (pgcpp コマンド)】 kato5:~/MPI$ pgcpp -fastsse -Minfo -Mmpi=msmpi -o cpp.exe mpihello.cpp
作成した MPI プログラムの実行モジュールを並列実行するために、mpiexec コマンドが提供されています。これは、MPICH2 の実装での実行コマンドと同じ名前です。 mpiexec の引数に、-n {並列プロセス数}という形で、並列実行に必要なプロセス数を指定します。PGIコンパイラを使用すると、余計なコストを掛けることなしに、こんなに簡単に MS-MPI を利用することができます。以下の例は、4つのプロセスを使用して並列実行させた例です。
【Fortranプログラムの実行】 kato5:~/MPI$ mpiexec -n 4 f.exe hello - I am process 0 hello - I am process 1 hello - I am process 3 hello - I am process 2 【Cプログラムの実行】 kato5:~/MPI$ mpiexec -n 4 c.exe Hello world from process 3 of 4 Hello world from process 1 of 4 Hello world from process 2 of 4 Hello world from process 0 of 4 【C++プログラムの実行】 kato5:~/MPI$ mpiexec -n 4 cpp.exe Hello from process 0 of 4 Hello from process 3 of 4 Hello from process 1 of 4 Hello from process 2 of 4
2. PGI Visual Fortran 上での MSMPI を使用する際の設定
PVF 上での MSMPI のための設定は、以下の画面イメージの通り、プロジェクトのプロパティ画面の [Fortran] - [Language] に MSMPI を利用するかどうかの設定項目があります。ここで、MSMPI を使用すると設定して下さい。この他、必要に応じコンパイル・オプションを設定した後、「プロジェクトのビルド」でコンパイル・リンクを行い、実行モジュールを作成して下さい。
次に、並列実行のための設定を行います。プロジェクトのプロパティ画面の [General] - [Debugging] に、MPI 実行の環境に関して設定を行うパラメータがあります。以下の画面イメージを見て下さい。「MPI Debugging」という項目のプルダウンメニューで「Local」を選択して下さい。これは、このマシン上1台の中で MPI プロセスを起動して実行すると言う意味です。他に、「Cluster」というパラメータがありますが、これは使用できません(日本では、クラスタ用のWindows版 PGI CDK を販売しておりません)。
その後、「適用」ボタンを押すと、さらに詳しいパラメータ項目が追加表示されます。「Number of Processes」と言う欄は、並列プロセス数を指定する項目です。ここに、並列実行に必要なプロセス数を指定します。なお、システム性能を考慮すると、システムのプロセッサが有する最大コア数が、この値に指定できる最大数です。ここでの設定は、Visual Studio のデバッグモードの実行だけでなく、リリースモードでの「デバッグ無しで開始」にも反映されます。
この設定後に、Visual Studio 上で実行を行えば、自動的に mpiexec実行が行われます。
MPIに使用する最大プロセス数について
MPI 実行で使用する「複数のプロセス」数の最大値は、使用システムに実装されている CPU の総コア数と言うことになります。最近のインテル・プロセッサは、「ハイパー・スレッディング」技術で、物理コア数の 2 倍の数を「スレッド・コア数」として表示していますが、HPC の並列計算では、「物理コア数」をそのシステムが並列実行に使用する最大コア数(並列許容プロセス数)として、並列実行を行います。(一般に、HPC 用途の純並列実行計算の場合、BIOS レベルで、Hyper threading を disable にします。なぜなら、Hyper threading とは、一つの物理コア内に、全ての CPU リソース(演算器)をダブルで持っていなため、リソース競合を起こし、並列性能を低下させる原因となります。)
PGI Workstaion 製品付属の PGDBG デバッガの使用
Windows上の PGI コマンドプロンプト上で、pgdbg コマンドを起動しますが、その前に、デバッグ情報を含めた実行モジュールを作成します。デバッグ情報を含めるには、-g オプションを指定します。これにより、一般的なコンパイラ最適化は、disable されます。MS-MPI ライブラリを使用する場合は、さらに、-Mmpi=msmpi オプションを追加します。これにより、デバッグ用の実行モジュールが作成されます。
次に、MS-MPIプログラム用のデバッガを起動するには、pgdbg コマンドに以下の引数を追加する必要があります。-mpi オプションに引き続き、実行に要するプロセス数の指定を -n オプションで指定します。以下の例は -n 4 としているので、4プロセス並列の実行を指示しています。なお、PGI Workstation/PVF ライセンスでは、8 プロセスまで、PGI Server ライセンスでは 16 プロセスまでの MPI デバッグ、プロファイリングが可能です。
【デバッグのためのコンパイラオプション】 kato5:~/MPI$ pgfortran -Mmpi=msmpi -g himenoBMTxpr.f 【デバッグのためのコンパイラオプション】 kato5:~/MPI$ pgdbg -mpi -n 4 himenoBMTxpr.exe
PGBDG 画面(プロセスグリッド表示)
変数値の表示例
表示ウインドウ
PGI Visual Fortran (Visual Studio 上)のデバッグ実行
Visual Studio 上で動作する PGI Visual Fortran を使用しての MPI プログラムの実行は、上記のように MS-MPI を使用するコンパイル・オプションの設定を行って実行モジュールを作成すれば、Visual Studio のインタフェースで使用できます。実行モジュールのビルド方法は、「デバッグモード」で行い、「デバッグ」--「デバッグ開始」でスタートすれば、MPIのデバッグモードに入ります。その後は、Visual Studio のインタフェースで使用して下さい。
Visual Studio 上の PVF
PGI Workstaion/PVF 製品付属の PGPROF プロファイラの使用
Windows 上でのプロファイルは、PGI Workstation の bash コマンドプロンプト上で行うことを推奨します。なお、ソースファイル、実行バイナリが同じフォルダ配下にある環境で行うと問題が少ないです(ソーファイルの PATH 等を指定する必要がないため)。もちろん、PGI Visual Fortran のプロジェクトのフォルダ配下でも可能ですが、実行バイナリとソースファイルの場所等が分散しているため、pgprof 実行時に問題が生じる場合があります。PGI Visual Fortran (PVF) 製品の PGPROF の使用においては、Visual Studio のインタフェースから一旦離れ、PVFが提供している DOSコマンドプロンプトを開き、以下で述べる同じ内容の PGI コンパイラコマンドを使用して、コマンドレベルで pgprof を起動して下さい。なお、その際、ソースファイルと実行モジュールが置かれているフォルダが同じで、MPI実行環境(入力データ環境)も同じ場所であれば、pgprof 起動時の「ファイルが見つからない等」の問題が生じませんので、できるだけ、こうした環境を用意して実行して下さい。
プロファイリングの実行は、Windows上の PGI コマンドプロンプト上で、pgprof コマンドを起動して GUI ベースで操作しますが、その前に、プロファイルを行うための実行モジュールを作成します。MSMPI のプロファイルは、-Mprof=func (サブルーチン、関数)ベースと -Mprof=lines (ソース行)ベースのものがサポートされています(MPIライブラリを使用する場合、pgcollectを使用したサンプリングベースのプロファイリング機能はサポートしていません)。コンパイル・リンク時のオプションは、-Mprof=msmpi,func あるいは、-Mprof=msmpi,lines を指定します。これにより、プロファイル用の実行モジュールが作成されます。
次に、実行です。MS-MPI の実行では、mpiexec コマンドで MPI 実行起動します。実行後、プロセス数分の pgprof.out ファイルが、同じフォルダ(ディレクトリ)下に作成されます。このファイルを使用して pgprof は、MPI 実行プロファイルの情報を表示します。コマンドは、pgprof コマンドを単に実行すれば良いだけです。デフォルトの場所(カレント・ディレクトリ)に存在する pgprof.out ファイルとソースファイル、実行モジュールを使用して、プロファイル表示処理を行います。
【プロファイルのためのコンパイラオプション】 kato5:~/MPI$ pgfortran -fastsse -Minfo -Mmpi=msmpi -Mprof=msmpi,func himenoBMTxpr.f 【MPIプログラムの実行】 kato5:~/MPI$ mpiexec -n 4 himenoBMTxpr.exe 実行後、4 MPI プロセスの実行の場合は、pgprof.out, pgprof1.out, pgprof2,out, pgprof3.out の 三つのファイル(プロファイル・データファイル)が作成される。 【プロファイラの実行】 kato5:~/MPI$ pgprof
PGPRO総合情報画面(MPIの場合は、メッセージの情報も表示)
-Mprof=msmpi,lines を指定した場合のソース行レベルのプロファイル
-Mprof=msmpi,lines の場合の CCFF コンパイル情報で最適化の指針等の表示