トップページ⇒tech
500コメント204KB

Message Passing Interface (MPI) 統合スレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
MPIによる並列プログラミングについて話し合う統合スレッドです。

とりあえず本家
http://www-unix.mcs.anl.gov/mpi/

0459デフォルトの名無しさん2010/06/18(金) 01:00:23
いやしかし、そろそろMPIに厳しい時期になりましたなぁ。

そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている
から1100Wの電熱器付けているようなもんだからなぁ。
0460名無しさん@そうだ選挙に行こう2010/07/10(土) 14:37:03
>>459
台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w
(一台あたりの話)

作業配列をunsignedからunsigned charにしただけで、1.2倍。

昔のCPUは1byteアクセスはペナルティ高かったような…
PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
0461名無しさん@そうだ選挙に行こう2010/07/10(土) 19:12:52
コンパイラや最適化の影響があるかも知れない。
単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
04624602010/07/10(土) 23:39:18
>>461
単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。

CPUがPhenom II 945だしインテルコンパイラーつかえねー
04634602010/07/12(月) 23:52:31
最適化を推し進めていくと、inline命令の逆のnoinline命令が欲しくなるな(gccは拡張機能であるがANSI Cとして欲しいね)

コンパイラの最適化レベルを上げるとホットスポット内にある、めったに呼ばれない関数までinline展開されてループ内のマシン語が大きくなってしまう。

また、ifでの条件分離の確率をプログラマーが指定したくなるな。。これはコンパイラーの機能ではどうにもならなかったので、制御構造を変更するしかなかった。こういうのはコンパイラ変更したら無意味になりそうでいやーん。

マシン語がどういう形で展開されているかは、素直に読むとなかなか辛いので、以下のようにasm文で適当にLABEL文を埋め込んでいけばいい。
---
asm(".HOGEHOGE_START:");
for(i=0; i < MAX; i++){ hogehoge;}
asm(".HOGEHOGEEND:");
--
そして-save-tempsでマシン語をファイル(hoge.s)に出力させればいい。マシン語のC++の関数名は奇妙奇天烈な名前に変換されるが、c++filtで復元出来る。

$ cat tmp.c
void test(int hoge){}
$ g++ tmp.c -c
$ nm tmp.o
00000000 T _Z4testi <- 謎の関数名
U __gxx_personality_v0
$ nm tmp.o | c++filt
00000000 T test(int) <- 関数名を復元
U __gxx_personality_v0
0464デフォルトの名無しさん2010/07/14(水) 03:12:44
>>458
そんなこともあるんですか
あまり欲張らないでおこう
0465デフォルトの名無しさん2010/07/14(水) 16:19:27
MPIを使わずに馬鹿並列をする簡単なフレームワークないですかね?

MPIをインストールするのめどい。

やって欲しい事は、32coreのマシンと、数千個のファイルがある。

.a.outにこのファイルを一つづつ渡して実行してほしい。処理が終
わったら続いてファイルを渡して処理をして欲しい。同時に32個
のa.outを実行しつつ、処理が終わったa.outがあったら残りの
ファイルをa.outで処理してほしい。
0466デフォルトの名無しさん2010/07/14(水) 16:24:10
↑ それぞれのa.outは処理時間が一定ではありません。
0467デフォルトの名無しさん2010/07/15(木) 00:26:56
妥当なところはOpenMPかな。
#pragma omp parallel for schedule(dynamic,1)
for( int i = 0 ; i < 1000 ; ++i ) {
  char filename[100];
  sprintf(filename, "file%03d.dat", i);
  process(filename);
}
結構適当に書いたけど、こんな感じ?
0468デフォルトの名無しさん2010/07/15(木) 22:00:42
ありがとうございます。OpenMPでそんな事ができるんですね。
gccも4系はサポートしているみたいですので、試してみます。
0469デフォルトの名無しさん2010/08/07(土) 11:07:24
この辺でもみてくださいな。
一見正しく動いていても、OCで遅くなったり計算間違ったり
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/454
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/458

0470デフォルトの名無しさん2010/09/12(日) 06:01:26
465-466 で処理量が一定でないとの事だから、
>>467 さんの schedule(dynamic,1)
は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。
頑張ってね〜。
0471デフォルトの名無しさん2010/10/03(日) 18:04:08
MPI導入の話なのですが…
MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。
日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
0472デフォルトの名無しさん2010/10/12(火) 03:47:24
MPIでコンパイルしているかどうかをコンパイル中に#ifdefで判別したいのですが、
どれがdefineされているかを調べれば良いのでしょうか?
0473デフォルトの名無しさん2010/10/22(金) 10:35:24
Ubuntuでintelコンパイラを使ってMPIプログラムをコンパイルしたいのですが、
apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する
方法がわかりません。
やり方を教えてください

0474デフォルトの名無しさん2010/10/24(日) 02:32:25
http://www.google.co.jp/search?q=ubuntu+icc&ie=utf-8&oe=utf-8

なるほど分からん
0475デフォルトの名無しさん2010/10/24(日) 02:44:51
gcc -E -dM -xc /dev/null

定義済みマクロ
http://wikiwiki.jp/redstrange/?%C4%EA%B5%C1%BA%D1%A4%DF%A5%DE%A5%AF%A5%ED
__MPI
__OPENMP
0476デフォルトの名無しさん2010/11/11(木) 06:38:52
ご存知の方教えてください。
MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか?
よろしくお願いします。
0477デフォルトの名無しさん2010/11/11(木) 10:15:27
なんか答えにくい質問だなぁ・・

たとえば x86 なCPU で linux 上で、とかなら
.o ファイルかき集めて最後にリンクできて・・なら、
たぶんだけど意図したとおりに動くんじゃないかな?

コードはあげないけど中間ファイルならあげるよ、という人たちから
いろいろもらって一まとめで使う、とかなの?
0478デフォルトの名無しさん2010/11/12(金) 14:02:34
>>477
すみません質問がいい加減すぎました。

ノード1がCygwinでgcc_4.3.4を使っていて、
ノード2がUbuntuでgcc_4.4.4を使っています。
CPUはともにx86系です。

このようなときに、
MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。
よろしくお願いします。
0479デフォルトの名無しさん2010/11/12(金) 15:38:08
mpirun mpiexec の気分次第w
まあ、動くかと。
gcc と intel は割と相性イイから
インテルも混ぜてあげよう
0480デフォルトの名無しさん2010/11/15(月) 18:12:22
MPICHを使っています。各プロセスに環境変数(具体的には$HOME)を渡したい
のですが、どうすればよいでしょうか。

Windows版の場合には、mpiexec(のみ)が提供されていて、
mpiexec -env HOME <somewhere> -np ...
とすればできますが、

Linux版では、mpirunが提供されているが、mpirunには環境変数を指定する
オプションがないので、できなくて困っています。なお、インストールには
YaSTを使い、
mpich-1.2.7p1-214.3.i586
mpich-devel-1.2.7p1-214.3.i586
を入れました。
0481デフォルトの名無しさん2011/01/13(木) 13:07:41
>>480
bashrcに書けばいいんじゃない?
0482デフォルトの名無しさん2011/01/26(水) 19:07:42
行列行列積のやり方が全くわかりません

A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。
Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。
行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。

誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
0483デフォルトの名無しさん2011/02/09(水) 18:08:03
A B
000 333
111 444
222 555

rank0 rank1 rank2
step1
000 333 --- --- --- ---
--- --- 111 444 --- ---
--- --- --- --- 222 555

step2
000 --- --- --- --- 333
--- 444 111 --- --- ---
--- --- --- 555 222 ---

step3
000 --- --- 333 --- ---
--- --- 111 --- --- 444
--- 555 --- --- 222 ---
0484デフォルトの名無しさん2011/05/21(土) 13:51:12.10
mpich2-1.3.2、4nodesでプログラムを並列実行しようとすると

Fatal error in PMPI_Barrier: Other MPI error, error stack:
PMPI_Barrier(476)..................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier(82)...................:
MPIC_Sendrecv(161).................:
MPIC_Wait(405).....................:
MPIDI_CH3I_Progress(150)...........:
MPID_nem_mpich2_blocking_recv(1074):
MPID_nem_tcp_connpoll(1663)........: Communication error

とエラーが出てしまい実行出来ません。検索しても有効な解決策が見つかりませんでした。
どなたか解決策を教えていただけないでしょうか?
0485デフォルトの名無しさん2011/05/31(火) 04:09:40.08
Intel mpi(impi)使ってる人います?
自分でコンパイルしたのより速い?
0486デフォルトの名無しさん2011/05/31(火) 23:53:44.81
そりゃ人間がコンパイルするより速いだろ
0487デフォルトの名無しさん2011/06/01(水) 02:31:39.53
機械語直打ちw
やだな・・・罰ゲームだ
0488デフォルトの名無しさん2011/06/07(火) 02:57:07.11
>>486,487
そんなくだらない煽りが来るとは思わなかった.
mpichってconfigure makeしません?
数値計算メインで使ってるなら,
効率考えて,コンパイラ変えたりするでしょ.

mpi関係ないコンパイラの速度って,
icc>1.1倍>gcc4>>1.8倍>>gcc3
ぐらいのイメージなんで,(Linux x86_64)
ifortやiccでmpichコンパイルしたのとどっちが早いかな
と思ったんですが.

impiだと,
mpicc -cc=icc
て出来ることがわかったので,自己解決しました.
0489デフォルトの名無しさん2011/06/07(火) 03:03:11.95
>>481
環境変数はbash_profileのほうがふつうじゃない?

>>484
mpd立てた?
listenportの設定は適切?
付属のサンプルプログラムは流れた?
0490デフォルトの名無しさん2011/06/08(水) 00:50:57.29
>>488
「自分でコンパイル」に該当する環境をきちんと定義しないからさ。
コンパイラは?gcc?icc?それ以外?
mpiライブラリは?計算内容は?

まぁどれにしてもmpiコンパイラって基本的に適当なライブラリをくっつけて
ビルドするスクリプトだから、実際やってる内容を出力するオプションあるし
それで1つ1つ確認すればいいんじゃない?
0491デフォルトの名無しさん2011/06/08(水) 01:47:18.76
>>490
回答ありがとう.たしかにあやふやな質問だったと思う.
偏見かもしれんが,まともなwindowsクラスタってあるの?
数値計算を32bitで行うのは論外でしょ.
でIntel Compilerを入れる時点で,アーキテクチャほぼ決まると思いますが.

impiのデフォルトコンパイラはgcc&gfortranです.
mpiライブラリの意味がわからん.
impiの前はmpichを使ってた.(これで回答になっている?)
計算内容は有限差分とモンテカルロ.

続く
0492デフォルトの名無しさん2011/06/08(水) 01:48:27.26
>>490
続き

適当なライブラリが-lmpi -lpthread -lmとかを言っているなら,
libmpiをコンパイルする必要があると思いますが.
このライブラリをIntelがチューニングしてくれたら,
自分でコンパイルするより早いでしょうし.
デフォルトのgccとかでやられてたら,
自分でコンパイルしたほうが速そうじゃない?

実際やってる内容ってのは,mpiccやmpifcのスクリプトの中身のこと?
それとも別の何かを指しているの?
0493デフォルトの名無しさん2011/08/28(日) 05:28:03.47
ブロードキャストってネットワークの送受信量を減らすことができるのですか?
それとも単に便利なだけというだけなのでしょうか?
0494デフォルトの名無しさん2011/09/01(木) 19:37:51.69
MPIってテキストからデータ読み込んだ時に、
MPI_SendやMPI_Recvを使って送受信可能にするためには変換が必要だったりしますか?

double型のデータなんですが。
0495デフォルトの名無しさん2011/09/02(金) 11:09:03.84
MPIでどうしても通らなくて困ってます。
エラーが
One of the process started by mpirun has exited with a nonzero exit code.
this typically indicates that the process finished in error.if your process
did not finish in error,besure to include a "return 0"or"exit(0)"in your
C code before exiting the application.

PID ***** failed on node n2 due to signal 11と出て通りません。

ソースはアップロダにあげるのでよければご教授お願いします。
ttp://uproda.2ch-library.com/423445uMY/lib423445.c
0496デフォルトの名無しさん2011/09/03(土) 10:38:26.00
One of the process started by mpirun has exited with a nonzero exit code.
とあるので全うな終了をしてないプロセスがあるんでしょう。
return 0以外で終了するっぽいコードは inputn() です。何故か EOF に達すると exit(1) しているので
inputq() のように break にすれば直る・・・・・・とは思いませんが。

とりあえず他の点でも突っ込み。
・座標入力でy,zがEOFになってもbreakで抜けて処理しているけどいいの?というかそういう表示を出さないとバグがわからないと思う。
・mainのループ関係がおかしい。わかりやすいところではifとelseが対応してない。
・getdouble() は1行から1つの数値しか読み込まないっぽいので 3次元座標的には読みにくい入力データが必要。
04974952011/09/04(日) 09:45:19.22
>>496さんの言った通り直しても通りませんでした…。
正直自分の知識じゃ限界を感じているので
代わりにやってくれる方がいれば報酬払ってもいいです。
最大2万円までしか出せませんが…。メール待ってます。
0498デフォルトの名無しさん2011/11/15(火) 11:36:05.43
openmpi使ってるんだがnohupが効かねぇ・・・
端末PC落とすと計算やめちゃうんだが
0499デフォルトの名無しさん2011/11/19(土) 16:31:12.60
へえ
0500デフォルトの名無しさん2011/11/24(木) 19:56:37.29
MPIの勉強始めようと思うんだけどMPI3ってのはまだ出てないの?
■ このスレッドは過去ログ倉庫に格納されています