室橋/MPI
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[室橋/並列処理輪講2009]]
#contents
--------------------------
[[MPIで並列プログラミング:http://www.fireproject.jp/pc_cluster/mpi/index.html]](森田君のとこから引っ張ってきた)~
全部読んでここにあるソース試してみた。~
以下はそこから得た情報なので詳細は上記サイトへ。~
~
[[MPIの基本的な関数の説明:http://www.sgi.co.jp/origin/ODP/documents/programming/mpi/mpi.html]]~
いろいろ載ってた。
*MPI [#qb1a7efc]
**MPI_Init [#a7644d9f]
#include "mpi.h"
int MPI_Init(int *argc, char ***argv)
全てのMPI関数は上記を一回だけ実行した後で呼び出す。
**MPI_Finalize [#l5ed52d8]
int MPI_Finalize()
MPI関数を呼び出したあとは最後に一回だけを実行する。MPI_Initを実行する前に他のMPI関数を呼び出すことはできないし,MPI_Finalizeを実行したあとに他のMPI関数を呼び出すこともできない.
**MPI_Comm_rank [#s28ac94d]
int MPI_Comm_rank ( MPI_Comm comm, int *rank )
MPIプログラムの各実行プロセスにはそれぞれランクという値が設定される.SPMDであるMPIプログラムはこのランク毎に処理を分岐させる.プロセスのランクは以下で取得する.
commはコミュニケータという通信集団,すなわち通信しあえるプロセスの集合を指定する.コミュニケータについては次節でもう少し述べる.commはMPI_Comm型の定数を指定する.この定数には以下がある.~
~
-MPI_COMM_WORLD~
すべてのプロセス ~
-MPI_COMM_SELF~
その定数を呼び出しているプロセス ~
~
MPI_Comm_rankを呼び出すと第二引数rankにランクが設定される.
**MPI_Comm_size [#r91d036d]
int MPI_Comm_size ( MPI_Comm comm, int *size )
プロセス数の取得に使用する. 入力パラメータにcommはコミュニケータである.プロセス数は第二引数sizeに格納される.
**MPI_Send [#v9f241c2]
MPI_Send(buf, count, datatype, dest, tag, comm) ブロック型
MPI_Isend(buf, count, datatype, dest, tag, comm, request) 非ブロック型
PI_Sendのパラメータは全て入力パラメータである.各パラメータの説明を以下に示す.
-buf
送信バッファの先頭アドレス.
-count
送信バッファの要素数.
-datatype
送信バッファの要素の型.
-dest
宛先プロセスのランク.
-tag
メッセージのタグ.
-comm
コミュニケータ.
-Request?
**MPI_Recv [#nab37e3e]
MPI_Recv(buf, count, datatype, src, tag, comm, status) ブロック型
MPI_Irecv(buf, count, datatype, source, tag, comm, request) 非ブロック型
MPI_Recvの出力パラメータについて以下に示す.
-buf
受信バッファの先頭アドレス
-status
受信結果のステータス.
MPI_Recvの入力パラメータについて以下に示す.
-count
受信バッファのサイズ.これは実際に受信するメッセージよりも大きければ,同じでなくても構わない.足りなければ溢れる.
-datatype
受信バッファの要素の型.
-source
送信元プロセスのランク.
-tag
メッセージのタグ.
-comm
コミュニケータ
-Request?
*ETC [#x3d8e679]
MPI_Bcast()
ルートから他の全プロセッサに一斉に同報通信
MPI_Gather()
プロセスのグループから値を収集
MPI_Scatter()
バッファをプロセスのグループに分配
MPI_Alltoall()
全プロセスから全プロセスへデータを転送
MPI_Reduce()
全プロセス上のデータを組み合わせて1個の値をつくる
MPI_Reduce_scatter()
値を組み合わせて結果を分配
MPI_Scan()
プロセス上のデータのプレフィックス簡約を計算
MPI_Wtime()
時間(秒)を返すルーチン
*MPICH動作例 [#oc9cf072]
-Parallel Programmingの輪講でも学ぶMPIについて実行環境,プログラム例についてまとめるページ([[大堀さんのパクリw>大堀/ツール関係/MPICH]])
**実行環境 [#o2f38fa8]
-学内マシン(Unix)の使用:これがもっとも簡単
--PATH
/usr/local/mpich/bin
--RSHの設定
~/.rhosts
--.rhost の記述例
hdw3dc2 s1140209
hdw3dc3 s1140209
hdw3dc4 s1140209
+@std-hosts
.rhost に記述したホストにはパスワード入力省いて接続できる~
~
-個人管理マシン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
hdw3dc2
hdw3dc3
hdw3dc4
-実行方法
mpiCC -o rank rank.c
mpirun -machinefile hostfile -np 6 rank
-実行結果(一例)
Process 0 on hdw3dc2.
Process 3 on hdw3dc2.
Process 2 on hdw3dc4.
Process 1 on hdw3dc3.
Process 5 on hdw3dc4.
Process 4 on hdw3dc3.
終了行:
[[室橋/並列処理輪講2009]]
#contents
--------------------------
[[MPIで並列プログラミング:http://www.fireproject.jp/pc_cluster/mpi/index.html]](森田君のとこから引っ張ってきた)~
全部読んでここにあるソース試してみた。~
以下はそこから得た情報なので詳細は上記サイトへ。~
~
[[MPIの基本的な関数の説明:http://www.sgi.co.jp/origin/ODP/documents/programming/mpi/mpi.html]]~
いろいろ載ってた。
*MPI [#qb1a7efc]
**MPI_Init [#a7644d9f]
#include "mpi.h"
int MPI_Init(int *argc, char ***argv)
全てのMPI関数は上記を一回だけ実行した後で呼び出す。
**MPI_Finalize [#l5ed52d8]
int MPI_Finalize()
MPI関数を呼び出したあとは最後に一回だけを実行する。MPI_Initを実行する前に他のMPI関数を呼び出すことはできないし,MPI_Finalizeを実行したあとに他のMPI関数を呼び出すこともできない.
**MPI_Comm_rank [#s28ac94d]
int MPI_Comm_rank ( MPI_Comm comm, int *rank )
MPIプログラムの各実行プロセスにはそれぞれランクという値が設定される.SPMDであるMPIプログラムはこのランク毎に処理を分岐させる.プロセスのランクは以下で取得する.
commはコミュニケータという通信集団,すなわち通信しあえるプロセスの集合を指定する.コミュニケータについては次節でもう少し述べる.commはMPI_Comm型の定数を指定する.この定数には以下がある.~
~
-MPI_COMM_WORLD~
すべてのプロセス ~
-MPI_COMM_SELF~
その定数を呼び出しているプロセス ~
~
MPI_Comm_rankを呼び出すと第二引数rankにランクが設定される.
**MPI_Comm_size [#r91d036d]
int MPI_Comm_size ( MPI_Comm comm, int *size )
プロセス数の取得に使用する. 入力パラメータにcommはコミュニケータである.プロセス数は第二引数sizeに格納される.
**MPI_Send [#v9f241c2]
MPI_Send(buf, count, datatype, dest, tag, comm) ブロック型
MPI_Isend(buf, count, datatype, dest, tag, comm, request) 非ブロック型
PI_Sendのパラメータは全て入力パラメータである.各パラメータの説明を以下に示す.
-buf
送信バッファの先頭アドレス.
-count
送信バッファの要素数.
-datatype
送信バッファの要素の型.
-dest
宛先プロセスのランク.
-tag
メッセージのタグ.
-comm
コミュニケータ.
-Request?
**MPI_Recv [#nab37e3e]
MPI_Recv(buf, count, datatype, src, tag, comm, status) ブロック型
MPI_Irecv(buf, count, datatype, source, tag, comm, request) 非ブロック型
MPI_Recvの出力パラメータについて以下に示す.
-buf
受信バッファの先頭アドレス
-status
受信結果のステータス.
MPI_Recvの入力パラメータについて以下に示す.
-count
受信バッファのサイズ.これは実際に受信するメッセージよりも大きければ,同じでなくても構わない.足りなければ溢れる.
-datatype
受信バッファの要素の型.
-source
送信元プロセスのランク.
-tag
メッセージのタグ.
-comm
コミュニケータ
-Request?
*ETC [#x3d8e679]
MPI_Bcast()
ルートから他の全プロセッサに一斉に同報通信
MPI_Gather()
プロセスのグループから値を収集
MPI_Scatter()
バッファをプロセスのグループに分配
MPI_Alltoall()
全プロセスから全プロセスへデータを転送
MPI_Reduce()
全プロセス上のデータを組み合わせて1個の値をつくる
MPI_Reduce_scatter()
値を組み合わせて結果を分配
MPI_Scan()
プロセス上のデータのプレフィックス簡約を計算
MPI_Wtime()
時間(秒)を返すルーチン
*MPICH動作例 [#oc9cf072]
-Parallel Programmingの輪講でも学ぶMPIについて実行環境,プログラム例についてまとめるページ([[大堀さんのパクリw>大堀/ツール関係/MPICH]])
**実行環境 [#o2f38fa8]
-学内マシン(Unix)の使用:これがもっとも簡単
--PATH
/usr/local/mpich/bin
--RSHの設定
~/.rhosts
--.rhost の記述例
hdw3dc2 s1140209
hdw3dc3 s1140209
hdw3dc4 s1140209
+@std-hosts
.rhost に記述したホストにはパスワード入力省いて接続できる~
~
-個人管理マシン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
hdw3dc2
hdw3dc3
hdw3dc4
-実行方法
mpiCC -o rank rank.c
mpirun -machinefile hostfile -np 6 rank
-実行結果(一例)
Process 0 on hdw3dc2.
Process 3 on hdw3dc2.
Process 2 on hdw3dc4.
Process 1 on hdw3dc3.
Process 5 on hdw3dc4.
Process 4 on hdw3dc3.
ページ名: