脇坂/MPI
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[脇坂]]
#contents
劣化コピー。
がんばろう。
*MPI(Massage Passing Interface) [#o668e531]
-MPIについて実行環境,プログラム例についてまとめるページ.
**MPIとは [#h9caf5af]
-並列プログラミングの規格であり、並列プログラミングライブラリのインターフェイスが決められている。
--CやFortranなどの既存プログラムをちょっと変更するだけで実装可能。
-簡単にマシン間でメッセージを授受できるライブラリインターフェイス。
**MPIの特徴 [#nbfa5dec]
-ポータビリティ
--標準化されたライブラリインターフェイスによっていろいろなMPI実装で同じソースがコンパイルできる。これによって、MPI実装のあるシステムであれば、どんな実装でもソースを修正する必要は無い。
-SPMD(Single Program Multiple Data)である。
--同一のプログラムを複数のプロセスで実行する。各プロセスはランク(一意の値)付けされており、ランクごとに異なった処理をさせることも可能。
--プログラマはどのマシンがどの処理ルートを通るとか考えなくてすむ。
**MPIの関数 [#i3233c72]
-MPI_COMM_WORLDはコミュニケータを示す。
--MPIの初期化を行う関数。コマンドラインの引数として送られてきたものをそのまま渡さなければいけない。
MPI_Init(&argc, &argv);
--MPIの終了処理を行う関数
MPI_Finalize();
--MPI_COMM_WORLD内での自分のプロセス数を求める関数。num_procsに格納。
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
--自分自身のMPI_COMM_WORLD内でのランクを知る関数。 num_procsに格納される。
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
--プロセッサの名前を知る関数。 rocessor_nameに格納される。
MPI_Get_processor_name(processor_name, &namelen);
--プロセスにデータを送信する関数。
MPI_Send(
(void *) 送信データ変数へのポインタ,
int データ数,
MPI Datatype 変数のデータ型,
int 送信先ランク番号,
int 送信データに付加するタグ,
MPI Comm コミュニケータ
);
--プロセスからデータを受信する関数。
MPI Recv(
(void *) 受信データ変数へのポインタ,
int データ数,
MPI Datatype 変数のデータ型,
int 受信元ランク番号,
int 受信データに付加されているタグ,
MPI Comm コミュニケータ
MPI Status * ステータス
);
**変数データ型 [#r2be2047]
***Fortran [#u41940a2]
Fortran Datatype MPI Datatype データ長
------------------------------------------------------------
integer MPI_INTEGER 4
real MPI_REAL 4
double precision MPI_DOUBLE_PRECISION 8
complex MPI_COMPLEX 8
double complex MPI_DOUBLE_COMPLEX 16
logical MPI_LOGICAL 4
character MPI_CHARACTER 1
integer*1 MPI_INTEGER1 1
integer*2 MPI_INTEGER2 2
integer*4 MPI_INTEGER4 4
integer*8 MPI_INTEGER8 8
real*4 MPI_REAL4 4
real*8 MPI_REAL8 8
real*16 MPI_REAL16 16
byte MPI_BYTE 1
対応なし MPI_DATATYPE_NULL -
***C [#a7ce0a10]
MPI Datatype C Datatype データ長
----------------------------------------------------
MPI_CHAR char 1
MPI_SHORT short 2
MPI_INT int 4
MPI_LONG long 8
MPI_UNSIGNED_CHAR unsigned char 1
MPI_UNSIGNED_SHORT unsinged short 2
MPI_UNSIGNED unsinged int 4
MPI_UNSIGNED_LONG unsinged long 8
MPI_FLOAT float 4
MPI_DOUBLE double 8
MPI_LONG_DOUBLE long double 16
MPI_BYTE 対応なし 1
MPI_PACKED 対応なし -
**コマンドオプション [#ca7bc7cc]
***mpicc [#x601423d]
- -mpilog
--実行時にログファイルを出力。 このログファイルは、jumpshot という MPICH 付属のツールで 下の図ように表示することが出来る。 jumpshot での表示は通信量が多いと厳しくなるため、 通信量を少なくして表示したがいいでしょう (ただし、mpich 1.2 では通信が多くても表示できるよう、 改良されているそうです)。
---例mpicc -o hello hello.c -mpitrace
- -mpitrace
--実行時に各プロセスがどういう動作をしているか表示してくれる。
---例 mpicc -o hello hello.c -mpitrace
std1dc2{s1150247}261: mpirun -machinefile hostfile -np 5 hello
Starting MPI_Init...
Starting MPI_Init...
....
[0] Ending MPI_Init
[0] Starting MPI_Comm_rank...
[0] Ending MPI_Comm_rank
[0] Starting MPI_Get_processor_name...
[0] Ending MPI_Get_processor_name
[0] Starting MPI_Comm_size...
[0] Ending MPI_Comm_size
[0] Starting MPI_Recv with count = 100, source = 1, tag = 0...
[2] Ending MPI_Init
[1] Ending MPI_Init
[4] Ending MPI_Init
[3] Ending MPI_Init
[0] Ending MPI_Recv from 1 with tag 0
Hello, my process rank is 1 at std1dc1.
[0] Starting MPI_Recv with count = 100, source = 2, tag = 0...
[0] Ending MPI_Recv from 2 with tag 0
Hello, my process rank is 2 at std1dc3.
[0] Starting MPI_Recv with count = 100, source = 3, tag = 0...
[0] Ending MPI_Recv from 3 with tag 0
Hello, my process rank is 3 at std1dc4.
...
- -mpianim
--通信状況などをリアルタイムでX上に表示してくれる。通信しているノード間で矢印がついたり消えたりする。ただし、表示が速すぎるらしい。(学内では使えない?)
- -v
--mpich のバージョンを表示。 どの mpich でコンパイルしたかを確認するのに使える。
- -h
--ヘルプの表示
***mpirun [#ye01f612]
- -nolocal
--mpiのコマンドを実行しているホストを計算に使用しないようにする設定。
---例 mpirun -machinefile hostfile -np 5 -nolocal hello
- -gdb
--rank 0 のプロセスを、GNU のデバッガ GDB のもとで実行。 rank 0 だけですが、手軽にデバッガをつけて実行できる方法。 コンパイル時には -g オプションをつける必要がある。(起動はするが使えてない)
- -dbx
--rank 0 のプロセスを、デバッガ DBX のもとで実行。(dbx ログファイル プログラム名で起動できる)
- -xxgdb
--rank 0 のプロセスを、XXGDB のもとで実行します。 XXGDB は GDB に X の GUI をつけたもの。(動かしてみたがあんまり理解できてない。でも、他のよりは見やすいし使いやすい)
---例 mpirun -xxgdb -machinefile hostfile -np 5 hello
- -ddd
--rank 0 のプロセスを、DDD のもとで実行。 DDD は GDB などのデバッガに対して X の GUI をつけるプログラム。(動作未確認)
- -mpedbg
--エラー発生時にxterm を起動し、エラーを起こしたプロセスを デバッグできるらしい。(一応実行は出来る。でもエラー出してないから動くのか。。。?)
- -help
--mpirun コマンドのオプションの説明などのメッセージを出力します。
---例 mpirun -help
- -p4dbg level
--rank 0 のプロセスにおける MPI の関数のデバッグメッセージを 出力。 level には整数でデバッグレベルを指定できる。 10 増やすごとに出力メッセージが増える。(表示は7割くらい理解)
ーーー例 mpirun -machinefile hostfile -np 5 hello -p4rdbg 20
- -t
--実際にプログラムを動かすわけではなく予想したものを表示させる。
***その他のツール [#f29d23c2]
-jumpshot
--mpilogで取ったログを利用してそれを可視化してくれる。
**実行環境 [#o2f38fa8]
-学内マシン(Unix)の使用:
--PATH
/usr/local/mpich/bin
--RSHの設定
~/.rhosts
-個人管理マシンor共有マシン(Linux)の使用
--自分でMPICH, RSHなど必要なプログラムをインストール
---RSHのパスの設定なども行う
**実行方法 [#s90904c7]
-コマンド
mpiCC -o program program.c
mpirun -machinefile hostfile -np XX program
-説明
++MPIを使用したプログラムを書く.C,C++など好きなもので.
++mpiCCなどのコンパイラで実行ファイルを生成する.
++動作させるマシンリストをhostfileに書く
++(Unixの場合はファイルシステムの関係上必要ない)実行ファイルを実行できる状態で各マシンに置く
++(Unixの場合はファイルシステムの関係上必要ない)RSHやパスなどの設定を確認しておく
++mpirunコマンドで動作させる.オプションについてはヘルプで確認すること.
---machinefile: マシンリストを読み込む
---np: プロセス数を設定
++どのプロセスがどのマシンで動くかは自動で振り分けてくれる.(自分で設定も可)
**実行例 [#m454d156]
-RANKと動作マシンを表示するプログラム
--rank.c
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int numprocs;
int myrank;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"Process %d on %s\n",myrank, processor_name);
MPI_Finalize();
return 0;
}
--hostfile
hdwXdcXX
hdwXdcXX
hdwXdcXX
stdXdcXX
-実行方法
mpiCC -o rank rank.c
mpirun -machinefile hostfile -np 6 rank
-実行結果(一例)
Process 0 on hdwXdcXX.
Process 3 on hdwXdcXX.
Process 2 on hdwXdcXX.
Process 1 on hdwXdcXX.
Process 5 on hdwXdcXX.
Process 4 on hdwXdcXX.
終了行:
[[脇坂]]
#contents
劣化コピー。
がんばろう。
*MPI(Massage Passing Interface) [#o668e531]
-MPIについて実行環境,プログラム例についてまとめるページ.
**MPIとは [#h9caf5af]
-並列プログラミングの規格であり、並列プログラミングライブラリのインターフェイスが決められている。
--CやFortranなどの既存プログラムをちょっと変更するだけで実装可能。
-簡単にマシン間でメッセージを授受できるライブラリインターフェイス。
**MPIの特徴 [#nbfa5dec]
-ポータビリティ
--標準化されたライブラリインターフェイスによっていろいろなMPI実装で同じソースがコンパイルできる。これによって、MPI実装のあるシステムであれば、どんな実装でもソースを修正する必要は無い。
-SPMD(Single Program Multiple Data)である。
--同一のプログラムを複数のプロセスで実行する。各プロセスはランク(一意の値)付けされており、ランクごとに異なった処理をさせることも可能。
--プログラマはどのマシンがどの処理ルートを通るとか考えなくてすむ。
**MPIの関数 [#i3233c72]
-MPI_COMM_WORLDはコミュニケータを示す。
--MPIの初期化を行う関数。コマンドラインの引数として送られてきたものをそのまま渡さなければいけない。
MPI_Init(&argc, &argv);
--MPIの終了処理を行う関数
MPI_Finalize();
--MPI_COMM_WORLD内での自分のプロセス数を求める関数。num_procsに格納。
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
--自分自身のMPI_COMM_WORLD内でのランクを知る関数。 num_procsに格納される。
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
--プロセッサの名前を知る関数。 rocessor_nameに格納される。
MPI_Get_processor_name(processor_name, &namelen);
--プロセスにデータを送信する関数。
MPI_Send(
(void *) 送信データ変数へのポインタ,
int データ数,
MPI Datatype 変数のデータ型,
int 送信先ランク番号,
int 送信データに付加するタグ,
MPI Comm コミュニケータ
);
--プロセスからデータを受信する関数。
MPI Recv(
(void *) 受信データ変数へのポインタ,
int データ数,
MPI Datatype 変数のデータ型,
int 受信元ランク番号,
int 受信データに付加されているタグ,
MPI Comm コミュニケータ
MPI Status * ステータス
);
**変数データ型 [#r2be2047]
***Fortran [#u41940a2]
Fortran Datatype MPI Datatype データ長
------------------------------------------------------------
integer MPI_INTEGER 4
real MPI_REAL 4
double precision MPI_DOUBLE_PRECISION 8
complex MPI_COMPLEX 8
double complex MPI_DOUBLE_COMPLEX 16
logical MPI_LOGICAL 4
character MPI_CHARACTER 1
integer*1 MPI_INTEGER1 1
integer*2 MPI_INTEGER2 2
integer*4 MPI_INTEGER4 4
integer*8 MPI_INTEGER8 8
real*4 MPI_REAL4 4
real*8 MPI_REAL8 8
real*16 MPI_REAL16 16
byte MPI_BYTE 1
対応なし MPI_DATATYPE_NULL -
***C [#a7ce0a10]
MPI Datatype C Datatype データ長
----------------------------------------------------
MPI_CHAR char 1
MPI_SHORT short 2
MPI_INT int 4
MPI_LONG long 8
MPI_UNSIGNED_CHAR unsigned char 1
MPI_UNSIGNED_SHORT unsinged short 2
MPI_UNSIGNED unsinged int 4
MPI_UNSIGNED_LONG unsinged long 8
MPI_FLOAT float 4
MPI_DOUBLE double 8
MPI_LONG_DOUBLE long double 16
MPI_BYTE 対応なし 1
MPI_PACKED 対応なし -
**コマンドオプション [#ca7bc7cc]
***mpicc [#x601423d]
- -mpilog
--実行時にログファイルを出力。 このログファイルは、jumpshot という MPICH 付属のツールで 下の図ように表示することが出来る。 jumpshot での表示は通信量が多いと厳しくなるため、 通信量を少なくして表示したがいいでしょう (ただし、mpich 1.2 では通信が多くても表示できるよう、 改良されているそうです)。
---例mpicc -o hello hello.c -mpitrace
- -mpitrace
--実行時に各プロセスがどういう動作をしているか表示してくれる。
---例 mpicc -o hello hello.c -mpitrace
std1dc2{s1150247}261: mpirun -machinefile hostfile -np 5 hello
Starting MPI_Init...
Starting MPI_Init...
....
[0] Ending MPI_Init
[0] Starting MPI_Comm_rank...
[0] Ending MPI_Comm_rank
[0] Starting MPI_Get_processor_name...
[0] Ending MPI_Get_processor_name
[0] Starting MPI_Comm_size...
[0] Ending MPI_Comm_size
[0] Starting MPI_Recv with count = 100, source = 1, tag = 0...
[2] Ending MPI_Init
[1] Ending MPI_Init
[4] Ending MPI_Init
[3] Ending MPI_Init
[0] Ending MPI_Recv from 1 with tag 0
Hello, my process rank is 1 at std1dc1.
[0] Starting MPI_Recv with count = 100, source = 2, tag = 0...
[0] Ending MPI_Recv from 2 with tag 0
Hello, my process rank is 2 at std1dc3.
[0] Starting MPI_Recv with count = 100, source = 3, tag = 0...
[0] Ending MPI_Recv from 3 with tag 0
Hello, my process rank is 3 at std1dc4.
...
- -mpianim
--通信状況などをリアルタイムでX上に表示してくれる。通信しているノード間で矢印がついたり消えたりする。ただし、表示が速すぎるらしい。(学内では使えない?)
- -v
--mpich のバージョンを表示。 どの mpich でコンパイルしたかを確認するのに使える。
- -h
--ヘルプの表示
***mpirun [#ye01f612]
- -nolocal
--mpiのコマンドを実行しているホストを計算に使用しないようにする設定。
---例 mpirun -machinefile hostfile -np 5 -nolocal hello
- -gdb
--rank 0 のプロセスを、GNU のデバッガ GDB のもとで実行。 rank 0 だけですが、手軽にデバッガをつけて実行できる方法。 コンパイル時には -g オプションをつける必要がある。(起動はするが使えてない)
- -dbx
--rank 0 のプロセスを、デバッガ DBX のもとで実行。(dbx ログファイル プログラム名で起動できる)
- -xxgdb
--rank 0 のプロセスを、XXGDB のもとで実行します。 XXGDB は GDB に X の GUI をつけたもの。(動かしてみたがあんまり理解できてない。でも、他のよりは見やすいし使いやすい)
---例 mpirun -xxgdb -machinefile hostfile -np 5 hello
- -ddd
--rank 0 のプロセスを、DDD のもとで実行。 DDD は GDB などのデバッガに対して X の GUI をつけるプログラム。(動作未確認)
- -mpedbg
--エラー発生時にxterm を起動し、エラーを起こしたプロセスを デバッグできるらしい。(一応実行は出来る。でもエラー出してないから動くのか。。。?)
- -help
--mpirun コマンドのオプションの説明などのメッセージを出力します。
---例 mpirun -help
- -p4dbg level
--rank 0 のプロセスにおける MPI の関数のデバッグメッセージを 出力。 level には整数でデバッグレベルを指定できる。 10 増やすごとに出力メッセージが増える。(表示は7割くらい理解)
ーーー例 mpirun -machinefile hostfile -np 5 hello -p4rdbg 20
- -t
--実際にプログラムを動かすわけではなく予想したものを表示させる。
***その他のツール [#f29d23c2]
-jumpshot
--mpilogで取ったログを利用してそれを可視化してくれる。
**実行環境 [#o2f38fa8]
-学内マシン(Unix)の使用:
--PATH
/usr/local/mpich/bin
--RSHの設定
~/.rhosts
-個人管理マシンor共有マシン(Linux)の使用
--自分でMPICH, RSHなど必要なプログラムをインストール
---RSHのパスの設定なども行う
**実行方法 [#s90904c7]
-コマンド
mpiCC -o program program.c
mpirun -machinefile hostfile -np XX program
-説明
++MPIを使用したプログラムを書く.C,C++など好きなもので.
++mpiCCなどのコンパイラで実行ファイルを生成する.
++動作させるマシンリストをhostfileに書く
++(Unixの場合はファイルシステムの関係上必要ない)実行ファイルを実行できる状態で各マシンに置く
++(Unixの場合はファイルシステムの関係上必要ない)RSHやパスなどの設定を確認しておく
++mpirunコマンドで動作させる.オプションについてはヘルプで確認すること.
---machinefile: マシンリストを読み込む
---np: プロセス数を設定
++どのプロセスがどのマシンで動くかは自動で振り分けてくれる.(自分で設定も可)
**実行例 [#m454d156]
-RANKと動作マシンを表示するプログラム
--rank.c
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int numprocs;
int myrank;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Get_processor_name(processor_name,&namelen);
fprintf(stderr,"Process %d on %s\n",myrank, processor_name);
MPI_Finalize();
return 0;
}
--hostfile
hdwXdcXX
hdwXdcXX
hdwXdcXX
stdXdcXX
-実行方法
mpiCC -o rank rank.c
mpirun -machinefile hostfile -np 6 rank
-実行結果(一例)
Process 0 on hdwXdcXX.
Process 3 on hdwXdcXX.
Process 2 on hdwXdcXX.
Process 1 on hdwXdcXX.
Process 5 on hdwXdcXX.
Process 4 on hdwXdcXX.
ページ名: