Message Passing Interface (MPI) 統合スレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGとりあえず本家
http://www-unix.mcs.anl.gov/mpi/
0429デフォルトの名無しさん
2010/02/13(土) 21:14:35メインプロセスがチャイルドプロセスを立ち上げる。
実装によるが、そのとき引数にチャイルドプロセスの情報を加える。
MPI_Initでargc, argvが要求されるのはそのため。
0430デフォルトの名無しさん
2010/02/19(金) 13:33:36N_local = N_global / numprocs;
double u_new[N_local + 2], u_old[N_local + 2];
こうやったら、Integer constant expression requiredって言われました
どうすればいいの?
0431デフォルトの名無しさん
2010/02/19(金) 19:29:59MPIの前にCの勉強をしろカス
といいたいところだが親切な俺様が教えてやろう
C89, C++では動的配列は使えない。
mallocかnewで確保汁!
0432デフォルトの名無しさん
2010/03/20(土) 18:01:31格子は150x150x150で、線形の拡散方程式です。
0433デフォルトの名無しさん
2010/03/24(水) 06:27:04・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。
MPI版あったような・・・気がする。気がする、ばかりでなんだが。
それを元にして、というのも。
ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
0434デフォルトの名無しさん
2010/03/24(水) 10:20:58データはどうなりますか?書き換えが必要ですか?
0435デフォルトの名無しさん
2010/03/24(水) 13:18:17Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、
自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って
そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど
・・・・忘れたwときがイヤなのであまり満足していない。
プリプロセスもクレバーに使えばコンパイル時に
とあるオプションが使われたときにだけONになるように出来るハズだけど
使い方がいまいちわからんw
この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても
しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
0436デフォルトの名無しさん
2010/03/24(水) 21:28:25個数を配列の長さ*sizeof(TYPE)にして。
fortranでこんなことができるか知らんけど。
エンディアンがあってないと大変なことになるが気にしない。
0437435
2010/03/25(木) 03:25:12real r
r = 1.0
if sizeof(r) .eq. 8 then
call mpi_send(...,mpi_double,....)
else
call mpi_send(...,mpi_float,....)
endif
をつくってみたけど、コンパイル時のオプションで振舞がちゃんと変わった。
例では r は単精度か倍精度かの判定用のダミー、のつもり。
値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
0438434
2010/03/26(金) 17:48:06ありがとうございます!出来るんですね。
>>437
436さんの文章だけ見てもぱっと分かんなかったんで助かります。
試してみます。
もう一つ、mpich2って使ってる人いますか?
mpi_in_place使えるはずと思うんですが、mpi_reduceの中で使ったところ、
Invalid buffer pointerってエラーが出て使えません。
多分何かとんでもない勘違いしてそうなんですが、どこがおかしいでしょうか?
ちなみにこんな感じです↓
mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
0439436
2010/03/26(金) 19:38:08double a[N];
MPI_Send(... N, MPI_DOUBLE, ...)
の代わりに
MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...)
なんだが。
これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。
>>437だと新しい型を増やす度に条件分岐が増える。
0440デフォルトの名無しさん
2010/03/27(土) 02:01:35なるほど!
0441デフォルトの名無しさん
2010/03/27(土) 12:13:43call mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
else
call mpi_reduce(sumofv,iwork,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
endif
0442デフォルトの名無しさん
2010/04/04(日) 09:08:14・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、
同じタグ番号でも困らないような気はするけど。
0443デフォルトの名無しさん
2010/04/14(水) 10:18:20インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか?
何か設定で切り替える方法があれば教えてください
0444デフォルトの名無しさん
2010/04/21(水) 01:33:13ここの通りにやってサンプルを使った
円周率の計算まではできたんですけど
自分で書いたC, C++を動かすことができません
とりあえずプロジェクトをいじってるんですがそれでいいんでしょうか?
何か留意点などありますか?
0445デフォルトの名無しさん
2010/04/21(水) 01:39:49mpi自体の設定もLinuxの方が簡単。
0446デフォルトの名無しさん
2010/04/21(水) 10:35:03並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。
とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか?
http://codepad.org/13tw3pKS
アドバイスお願いします。
0447デフォルトの名無しさん
2010/04/22(木) 00:58:42で、技術料はいくら払うんだ?
0448デフォルトの名無しさん
2010/04/30(金) 06:33:210449デフォルトの名無しさん
2010/05/10(月) 05:36:11それぞれの利点欠点を教えてください
0450デフォルトの名無しさん
2010/06/12(土) 19:14:06>nohup mpiexec -np 4 ./a.out >& log.txt &
標準出力(log.txt)に下記のようなメッセージが大量に書き込まれてしまいます。
これを表示させない方法はないでしょうか?
(handle_stdin_input 1067): stdin problem; if pgm is run in background, redirect from /dev/null
(handle_stdin_input 1068): e.g.: mpiexec -n 4 a.out < /dev/null &
0451デフォルトの名無しさん
2010/06/12(土) 23:35:54メッセージに書かれている通りのことをやればいいだけ
0452デフォルトの名無しさん
2010/06/13(日) 04:24:41ありがとうございました。確かに入力用にこれを指定すると出なくなりました。
しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、
このようにしたのですが、それはマルチノードの設定の問題でしょうか。
0453デフォルトの名無しさん
2010/06/13(日) 10:55:370454デフォルトの名無しさん
2010/06/16(水) 22:05:53プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。
殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、
計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。
ふと、OCやめて定格に戻したら、まともな速度が出るようになった。
なんてこった。どうやらOCで逆に遅くなる事があるようだ。
OCする場合とOCしないときと速度比較してみる価値あるかもよ。
0455デフォルトの名無しさん
2010/06/16(水) 22:47:520456デフォルトの名無しさん
2010/06/16(水) 23:29:080457デフォルトの名無しさん
2010/06/17(木) 19:01:17通常のOCのリスク(熱・故障等)以外に、結果が狂うとかある?
0458デフォルトの名無しさん
2010/06/18(金) 00:53:44狂った事あるよ。
デカイファイルが出力されるプログラムを実行させてたときに
./a.out | gzip > out.txt.gz
とかやってたんだが、out.txt.gz をgzip -d で解凍させたら壊れて
ますとエラーが出たので気が付いた。OCでgzipがまともに動作し
なかった模様。多分計算結果も壊れてたんだろうな。
てかgzipで圧縮してなかったら計算結果が壊れてる事に気がついて
なかった罠。
0459デフォルトの名無しさん
2010/06/18(金) 01:00:23そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている
から1100Wの電熱器付けているようなもんだからなぁ。
0460名無しさん@そうだ選挙に行こう
2010/07/10(土) 14:37:03台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w
(一台あたりの話)
作業配列をunsignedからunsigned charにしただけで、1.2倍。
昔のCPUは1byteアクセスはペナルティ高かったような…
PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
0461名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:12:52単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
0462460
2010/07/10(土) 23:39:18単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。
CPUがPhenom II 945だしインテルコンパイラーつかえねー
0463460
2010/07/12(月) 23:52:31コンパイラの最適化レベルを上げるとホットスポット内にある、めったに呼ばれない関数まで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そんなこともあるんですか
あまり欲張らないでおこう
0465デフォルトの名無しさん
2010/07/14(水) 16:19:27MPIをインストールするのめどい。
やって欲しい事は、32coreのマシンと、数千個のファイルがある。
.a.outにこのファイルを一つづつ渡して実行してほしい。処理が終
わったら続いてファイルを渡して処理をして欲しい。同時に32個
のa.outを実行しつつ、処理が終わったa.outがあったら残りの
ファイルをa.outで処理してほしい。
0466デフォルトの名無しさん
2010/07/14(水) 16:24:100467デフォルトの名無しさん
2010/07/15(木) 00:26:56#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:42gccも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>>467 さんの schedule(dynamic,1)
は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。
頑張ってね〜。
0471デフォルトの名無しさん
2010/10/03(日) 18:04:08MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。
日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
0472デフォルトの名無しさん
2010/10/12(火) 03:47:24どれがdefineされているかを調べれば良いのでしょうか?
0473デフォルトの名無しさん
2010/10/22(金) 10:35:24apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する
方法がわかりません。
やり方を教えてください
0474デフォルトの名無しさん
2010/10/24(日) 02:32:25なるほど分からん
0475デフォルトの名無しさん
2010/10/24(日) 02:44:51定義済みマクロ
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:52MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか?
よろしくお願いします。
0477デフォルトの名無しさん
2010/11/11(木) 10:15:27たとえば x86 なCPU で linux 上で、とかなら
.o ファイルかき集めて最後にリンクできて・・なら、
たぶんだけど意図したとおりに動くんじゃないかな?
コードはあげないけど中間ファイルならあげるよ、という人たちから
いろいろもらって一まとめで使う、とかなの?
0478デフォルトの名無しさん
2010/11/12(金) 14:02:34すみません質問がいい加減すぎました。
ノード1がCygwinでgcc_4.3.4を使っていて、
ノード2がUbuntuでgcc_4.4.4を使っています。
CPUはともにx86系です。
このようなときに、
MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。
よろしくお願いします。
0479デフォルトの名無しさん
2010/11/12(金) 15:38:08まあ、動くかと。
gcc と intel は割と相性イイから
インテルも混ぜてあげよう
0480デフォルトの名無しさん
2010/11/15(月) 18:12:22のですが、どうすればよいでしょうか。
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:41bashrcに書けばいいんじゃない?
0482デフォルトの名無しさん
2011/01/26(水) 19:07:42A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。
Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。
行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。
誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
0483デフォルトの名無しさん
2011/02/09(水) 18:08:03000 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.10Fatal 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自分でコンパイルしたのより速い?
0486デフォルトの名無しさん
2011/05/31(火) 23:53:44.810487デフォルトの名無しさん
2011/06/01(水) 02:31:39.53やだな・・・罰ゲームだ
0488デフォルトの名無しさん
2011/06/07(火) 02:57:07.11そんなくだらない煽りが来るとは思わなかった.
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環境変数はbash_profileのほうがふつうじゃない?
>>484
mpd立てた?
listenportの設定は適切?
付属のサンプルプログラムは流れた?
0490デフォルトの名無しさん
2011/06/08(水) 00:50:57.29「自分でコンパイル」に該当する環境をきちんと定義しないからさ。
コンパイラは?gcc?icc?それ以外?
mpiライブラリは?計算内容は?
まぁどれにしてもmpiコンパイラって基本的に適当なライブラリをくっつけて
ビルドするスクリプトだから、実際やってる内容を出力するオプションあるし
それで1つ1つ確認すればいいんじゃない?
0491デフォルトの名無しさん
2011/06/08(水) 01:47:18.76回答ありがとう.たしかにあやふやな質問だったと思う.
偏見かもしれんが,まともなwindowsクラスタってあるの?
数値計算を32bitで行うのは論外でしょ.
でIntel Compilerを入れる時点で,アーキテクチャほぼ決まると思いますが.
impiのデフォルトコンパイラはgcc&gfortranです.
mpiライブラリの意味がわからん.
impiの前はmpichを使ってた.(これで回答になっている?)
計算内容は有限差分とモンテカルロ.
続く
0492デフォルトの名無しさん
2011/06/08(水) 01:48:27.26続き
適当なライブラリが-lmpi -lpthread -lmとかを言っているなら,
libmpiをコンパイルする必要があると思いますが.
このライブラリをIntelがチューニングしてくれたら,
自分でコンパイルするより早いでしょうし.
デフォルトのgccとかでやられてたら,
自分でコンパイルしたほうが速そうじゃない?
実際やってる内容ってのは,mpiccやmpifcのスクリプトの中身のこと?
それとも別の何かを指しているの?
0493デフォルトの名無しさん
2011/08/28(日) 05:28:03.47それとも単に便利なだけというだけなのでしょうか?
0494デフォルトの名無しさん
2011/09/01(木) 19:37:51.69MPI_SendやMPI_Recvを使って送受信可能にするためには変換が必要だったりしますか?
double型のデータなんですが。
0495デフォルトの名無しさん
2011/09/02(金) 11:09:03.84エラーが
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とあるので全うな終了をしてないプロセスがあるんでしょう。
return 0以外で終了するっぽいコードは inputn() です。何故か EOF に達すると exit(1) しているので
inputq() のように break にすれば直る・・・・・・とは思いませんが。
とりあえず他の点でも突っ込み。
・座標入力でy,zがEOFになってもbreakで抜けて処理しているけどいいの?というかそういう表示を出さないとバグがわからないと思う。
・mainのループ関係がおかしい。わかりやすいところではifとelseが対応してない。
・getdouble() は1行から1つの数値しか読み込まないっぽいので 3次元座標的には読みにくい入力データが必要。
0497495
2011/09/04(日) 09:45:19.22正直自分の知識じゃ限界を感じているので
代わりにやってくれる方がいれば報酬払ってもいいです。
最大2万円までしか出せませんが…。メール待ってます。
0498デフォルトの名無しさん
2011/11/15(火) 11:36:05.43端末PC落とすと計算やめちゃうんだが
0499デフォルトの名無しさん
2011/11/19(土) 16:31:12.600500デフォルトの名無しさん
2011/11/24(木) 19:56:37.29■ このスレッドは過去ログ倉庫に格納されています