1 名前:デフォルトの名無しさん [04/11/07 18:25:56.net] MPIによる並列プログラミングについて話し合う統合スレッドです。 とりあえず本家 www-unix.mcs.anl.gov/mpi/
357 名前:デフォルトの名無しさん [2009/07/07(火) 20:32:32 .net] >> 353 神様、仏様、353様! 早速お教え頂きありがとうございました。
358 名前:デフォルトの名無しさん [2009/07/24(金) 16:46:11 .net] MPICH2とOpenMPIを使い分ける基準ってなんなのだろう 構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
359 名前:355 [2009/07/24(金) 16:49:25 .net] ちなみに自分のはMac OS XなのでOpenMPIが標準で入っているそうですが (XgridもOpenMPIを通して使うそうですね) MPICH2のほうはどうなのか、ちと気になりましてw
360 名前:デフォルトの名無しさん [2009/09/06(日) 10:48:01 .net] mpif77 でコンパイルは出来るのですが、 実行時 に mpirun -np 4 tttt と入力すると error while loading shared libraries : libompi_f77.so.o cannot open云々 となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
361 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 11:37:43 .net] >>357 実行時に .so ファイルを探したが見つからないというエラーなので適当な設定を加える必要がある。 libompi_f77.so のあるディレクトリを仮に /opt/lib とすると a) コンパイル時に -Wl,-rpath,/opt/lib オプションを指定する b) 実行時に環境変数 LD_LIBRARY_PATH=/opt/lib を設定する c) /etc/ld.so.conf に /opt/lib を追加して ldconfig コマンドを root 権限で実行する のどれかをすればいいと思われ。 a) は gcc のオプションで他のコンパイラにも同じようなオプションがある(はず)。 b) の環境変数の指定方法はあなたが使っているシェル(bash とか tcsh とか)によって違うので調べて。 c) は Linux の方法で、他の OS だとファイル名が違うかも知れない。
362 名前:デフォルトの名無しさん [2009/09/06(日) 13:37:28 .net] サンプルプログラムを実行することができました。有難うございます
363 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 16:07:43 .net] rank数が0から始まるとちょっと使いにくいんですが、 勝手に include 'mpif.h' call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world,np,ierr) call mpi_comm_size(mpi_comm_world,npe,ierr) np=np+1 ってやって使っても問題ないでしょうか?
364 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 18:29:39 .net] 好きにせぇや
365 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 00:13:13 .net] すいません、Visual studioのスレで聞いたんですが、 こっちで聞いた方が良いとのことでこっちにきました。 Visual studio2008+MPICH2+ifortranを使ってます。 ブレークポイントやステップ実行などが使いたいのですが、 デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。 msdn.microsoft.com/ja-jp/library/ms164731.aspx 上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、 デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、 また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています) ちなみにデバッグなしで開始なら問題なく実行できますが… 今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、 さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、 どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって 足りない情報などあればご指摘ください。
366 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:43:11 .net] >>362 VSスレの方がいいんじゃねーかな。 windowsでMPI使う物好きは少ないと思うし。 つーか、モロにVSの使い方だし。
367 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:53:16 .net] 質問です。fortranで配列の要素数をプロセス数に応じて決めたいのですが、 どのように宣言したらよいのでしょうか?allocateを使うしかないでしょうか? 77では無理ですか?
368 名前:デフォルトの名無しさん [2009/10/14(水) 11:12:10 .net] call mpiplay(n) subroutine mpiplay(n) real data(n) とか、かな。Initializeやfinalizeはメイン階層でしてね。 もっとも今は77とそれ以降を混ぜて書いても解釈してくれるから allocate でがんがんやっても良いと思うけど。
369 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 19:51:56 .net] >>365 なるほど。動的配列を使うまでもなくそれでいいのですか。 ありがとうございます。もう一つお聞きしたいのですが、 メインでもその配列を使いたいときはどうすればよいでしょう? rank等の取得の前に宣言部が来るのでそのやり方では出来ないでしょうか? ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
370 名前:365 [2009/10/15(木) 05:59:50 .net] 365の例では サブルーチンでの型宣言 integer n とMPI呼出呪文w include 'mpif.h' が抜けてたね。 呪文はメイン階層でもする必要があるけど。 >>366 配列の要素数を、例えばプロセス数の100倍にしたければ、 program mpiwrapper (略;なんか行があったりなかったり) include 'mpif.h' (略、宣言部とか) call mpi_init(ierr) (略) call mpi_comm_size(mpi_comm_world,nprocs,ierr) n=nprocs*100 call mpiplay(n) (略) call mpi_finalize(ierr) stop end program mpiwrapper subroutine mpiplay(n) include 'mpif.h' integer n real data(n) (略) call mpi_comm_rank(mpi_comm_world,myrank,ierr) (略;分割対象のループがいっぱい。初期化とかiteration処理とか) (略その2;data配列をmainにお持ち帰りできないので書き出しとかはこの階層で) return end subroutine mpiplay かな?wrapperの表現が適切かはちと疑問だけど、まあここではOKということで・・・。 この例だと変数の初期値代入から書き出し保存などは全部 mpiplay(n)階層ですることになるね。
371 名前:デフォルトの名無しさん [2009/10/15(木) 06:29:09 .net] そんなわけで、fortran77コンパチで且つ前もって配列サイズを決めなくて良い、というのは できるけど。めんどいよねw. 自分自身はコマンドラインの引数を使いたい、 計算コード自身は77で書いてしまった、の2つの理由で メイン階層のWrapperをCでつくる事が多いけど。上の例は良くつかう。 やはり、というか配列サイズが前もって決まっていないタイプのコードは 最適化が抑制されるのか、遅いね。まあいちいちコード編集&コンパイルの 手間がかからないから楽といえば楽だけど。
372 名前:デフォルトの名無しさん [2009/10/15(木) 06:37:31 .net] だらだら書いてしまったけど・・・・ >>366 ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか? にYes!と書けば終わりだったな・・・・w 早起きはするものではないね。
373 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 05:54:20 .net] >>369 いえ、結構怪しかったんで具体的に書いてもらって助かります。 丁寧に教えてくれてありがとう。
374 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:52:34 .net] すみません、もう一つ質問なんですが、 vel(3,m) pos(3,m) (それぞれm番目の分子のxyz座標の速度と位置)を buffer(6,n) 1~3に速度(vel)を、4~6に位置(pos)をというように一つのbufferに詰め込んで 別のプロセスに送りたいんですけど、一回のアクセスで送り先のvel,pos両方に 格納することって出来ますか?別々にやらないとだめでしょうか? それとも受信用の配列(rbuffer(6,n))とか用意して、別の処理で受信用bufferから vel,posにそれぞれ移し替える方がよいでしょうか? ちなみに送られる分子のmは不連続なので送る過程ではbufferに詰め込んでますが、 送り先では送り先にある最大の分子の番号の末尾から連続で入れればよし、というような状況です。 (送り先に既にm個あったらm+1~m+nまで) 基本的に通信回数は減らした方がパフォは上がるという認識で良いですよね?
375 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 05:40:13 .net] ・・・ラグランジュ法的な粒子なのね。 隣接関係(最近接の粒子番地)がころころかわるから厄介そう。 前半最後の2行が王道だとおもう。型の同じ変数は一つの配列名のに付けてから一度に送受信。 いっそ、最初からvelpos(6,m)みたいに位置や速度の情報を一つの大きめの配列にまとめちゃう方が いいかもね。vi(m) とか sed だと、 1,$s/pos(1/velposi(4/g 1,$s/pos(m/velposi(3+m/g みたいな感じでわりと一括置換が効きやすそうだし。 ・・・・・恐いけどw
376 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 06:45:10 .net] >>372 うーん、やっぱそうですか。たびたびありがとうございます。 ちなみに代入はf90が使える場面なら PV(1:3,m+1:m+nmbuf)=rbuffer(1:3,1:nmbuf) PP(4:6,m+1:m+nmbuf)=rbuffer(4:6,1:nmbuf) みたいにループ使わずに書く方が速度的にもいいですか? (上であってます?間違いや冗長なところありますかね?) 上は簡略化してるんですが、実はもう少し複雑なので あまりパフォが違わないなら慣れた添え字ループの代入が無難かな。 情けない話ですが出来る限りコマンドラインを避けてるのでviとかsedとかの話あまり分かりません。 でもそれで置換出来るならプログラム書く効率あがりそうですね。覚えた方がいいと思いつつ… 統合環境がそういう複雑な置換装備してくれたらいいのにな。甘えすぎですか。
377 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:38:00 .net] >>373 例では第一添え字が6要素だから、 do i=1,nmbuf pv(1:3,m+i) = rbuffer(1:3,i) pp(1:3,m+i) = rbuffer(4:6,i) enddo にするといいかな? 右側の要素を:つかって範囲指定すると遅くなることが多い・・・とおもう。 実装にも依存するけど、ベクトル的表現は第一添字(右端)だけに しておくのが安全&安心。 エディタでの一括置換は楽だけど諸刃の剣w
378 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:39:35 .net] 第一添字(右端) ↓ 第一添字(左端)
379 名前:デフォルトの名無しさん [2009/10/20(火) 06:46:25 .net] インテルコンパイラだけど、MPI使うには、インテルの売ってるやつを使わないといけないの?
380 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 22:03:31 .net] 何でもええ。 ライブラリがリンクできれば。
381 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 02:41:08 .net] MPI はコンパイラもだけど mpirun がないと。 自宅で文法チェックするだけなら -I -L
382 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:52:21 .net] max plunk institute !
383 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 06:45:10 .net] >>374 遅くなったけど本当にどうもありがとう。うまくできました。 ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで 3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?
384 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 20:05:53 .net] 最近HyperThreading対応の4coreのCPUが家庭向けの値段まで落ちてきたので 購入したのだが、ここまでスレッド数が多くなるとメモリ帯域か何かが溢れて 評価しないと使えないな。 同じプログラムが、 Pentium4 2.8GHz(1core * 2スレッド)ではMPIで2プロセス走らせると1.6倍ぐらい速くなったけど、 Corei7-860(4core * 2スレッド)ではMPIで8プロセス走らせると4プロセスに比べて0.9倍 ぐらいに遅くなったよ。
385 名前:デフォルトの名無しさん [2009/10/26(月) 06:36:28 .net] core i7か・・・いいな。このお金持ちめw いくらだった? 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? 職場での印象では mpirun がメモリアクセスのスケジューリングを うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。 やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。 ・・・・OpenMPだともう少しマシな数字がでてくるのかな?
386 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 06:42:32 .net] >>381 CPU とプロセス(またはスレッド)のアフィニティはどうしてる? プロセス数が多くなればなるほど、きっちり固定してやらないと パフォーマンス低下の原因になる希ガス。
387 名前:382 mailto:sage [2009/10/26(月) 07:00:00 .net] OpenMPはデフォだとうろうろするのは知ってたけど。 MPIも固定しないのか・・・知らんかった・・・。
388 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 09:46:19 .net] windowsだとOSがウロウロさせるんだけど。 高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。 LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
389 名前:381 mailto:sage [2009/10/26(月) 23:47:19 .net] ふと4とか8プロセスとかとか切りのよい数字じゃなくて5とか6プロセスで 実行したらどうなるんだろうと思った。 現在1〜8プロセスの全てのパターンをベンチ中。多分終わるのは明日。 > core i7か・・・いいな。このお金持ちめw いくらだった? 再利用などしたので、マザボとメモリとCPUしか買ってませんが、46,675円 > 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? そういう事です。 > CPU とプロセス(またはスレッド)のアフィニティはどうしてる? そのあたり詳しくないのでほとんど設定変更せず使ってます。 ちなみにOpenMPI/CentOS5.4です。
390 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 16:27:05 .net] Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。 マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、 マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
391 名前:デフォルトの名無しさん [2009/10/28(水) 02:43:34 .net] Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?
392 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:57:18 .net] HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。 アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、 コア間で依存性があった場合は注意が必要だと思う。 HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。 ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
393 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:59:50 .net] >>384 そりゃそうでしょ。MPIだってコアの指定をしないとだめ。 もちろんPthreadでも。
394 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 03:24:38 .net] いわれるとそりゃそうだわ、なんだけど 383のを見るまで気づかんかったw OpenMPだと dplace や taskset で固定できるけど、 これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?
395 名前:381 [2009/10/28(水) 21:52:47 .net] >>386 悪禁になってしまったのだが結果だけかくと 5プロセスで走らせると最速のようです
396 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 01:33:12 .net] >>392 それだとメモリアクセスが一番のボトルネックじゃない? ちょうど5コアでいい感じでメモリ帯域を食ってくれて、それ以下だと使い切れなくて、 それ以上だといっぱいになってしまう。 という感じに思える。
397 名前:デフォルトの名無しさん [2009/10/29(木) 03:41:16 .net] そんな感じっぽいね。381氏の実験に感謝。 最近はベクトル化を意識してループを短くして,(メモリでかくなったから)配列に中間結果を格納して・・・ というのがスパコンでは流行、というか推奨されるけど、HTでは ループ内での処理が冗長なベクトル化をあまり意識してないw古いタイプの コードが並列化では利得が大きいかも・・という事なのかな。 いまはCacheも大きいからたいがいループ内が長くても収まるし。
398 名前:デフォルトの名無しさん [2009/12/04(金) 22:16:21 .net] mpiの勉強を始めたばかりの者です。今、Bcastをやっていますが、どうにも解らなくなりました。ご指導ください。 使っているコンパイラー等はGfortran、open mpiです。解らなくなったのは、メインでBcastを使っても問題ないのですが、 サブルーチンでBcastを使うとエラーが発生してしまうんです。なんででしょうか?ちなみにプログラムは以下のとおりなんですが。 * MPI 宣言文 * IF(Nrank.EQ.0) NCP1=1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) * KKK = 100 NNN = NCP1 + Nrank*KKK PRINT *, NNN これは問題なく動きますが、 IF(Nrank.eq.0) NCP1 = 1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) 部分を IF(Nrank.EQ.0) CALL MAINSUBとし、サブルーチンを SUBROUTINE MAINSUB IMPLICIT REAL*8(A-H,O-Z) COMMON /ACTIVE/ NCP1 * NCP1 = 1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) * RETURN END として、コンパイルし実行すると、 1000、 100、200、300と画面に出力され、notice thatjob rank 1 with PID 4737...の メッセージが表示されますが、何故か原因が解らないのです。よろしくお願いします。
399 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 22:49:20 .net] >>395 サブルーチンMAINSUBの中でmpif.hのインクルードしてる?
400 名前:デフォルトの名無しさん [2009/12/05(土) 07:53:23 .net] 395 ですがやっていません。やってみます。
401 名前:デフォルトの名無しさん [2009/12/05(土) 08:04:52 .net] 395 ですが、動きました。どうも有難うございます。
402 名前:デフォルトの名無しさん [2009/12/12(土) 13:25:37 .net] WindowsでMPIをつこうたプログラムをコンパイルしたいのですが、 Windows XP+Vistal C++ 2008 Express以外に、どれをインストールすればよいのでしょうか?
403 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:30:24 .net] MPICH
404 名前:デフォルトの名無しさん [2009/12/20(日) 02:28:58 .net] MPIってユーザーグループの会とか友の会とかないんですかね?? もしなかったら作ってみたいなっと思いまして.2ヶ月に一度くらい勉強会とかライトニングトークしあう的な規模のもので.
405 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:22:07 .net] あんなもん、一旦意味がわかればマニュアル見るだけでOKなので 2ヶ月に一度とかタルいことしてたら、次の勉強会までにプログラムできるようになっている。 てか、それでできない人間だけ集まっても意味ないし、できる人間は参加してもタルいだけだろう。
406 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:52:25 .net] プログラムのほとんどを1スレッドで走らせ、一部を並列計算させたい場合、 その一部以外を if(myrank==0) で囲えばいいの?
407 名前:デフォルトの名無しさん [2009/12/20(日) 13:09:48 .net] うん、たいていそれでいいよ。 非並列処理部分の結果を並列部分で使いたい時だったら ちゃんと伝達するのを忘れないように><
408 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 05:10:55 .net] ですよね なんとなく「プログラムのほとんどが if 文」ってのが違和感なんだけど 他に書き方ないよね
409 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 09:37:58 .net] そうそう、なんかif (myrank .....が冗長に出てくるのがなんかイヤw 並列の出入口でやることが決まっていれば関数に押し込めるけど、そういう事ってあまり多くないし 引数受渡し部分でちょんぼすることあるし・・・><
410 名前:デフォルトの名無しさん [2009/12/23(水) 09:49:25 .net] 現在勉強中で、Send、Recvを使って簡単なプログラムを作って動かしていますが、送るデータの個数が 500以下だと問題なく送受でき、送受結果を画面に表示できるのですが、500個を超えると送受結果が 画面に表示できません。プログラムが暴走したような状態になってしまうんです。 データの型は倍精度浮動小数点なんですが、解決策は無いでしょうか?使用している mpiは openmpiです。
411 名前:デフォルトの名無しさん [2009/12/23(水) 10:52:26 .net] 受信側のメモリを確保しているのかと3秒問いつめたい
412 名前:デフォルトの名無しさん [2009/12/23(水) 12:40:54 .net] 407ですが、受け側でも送り側と同じ配列だけメモリーは設定しております。 当初は配列をアロケートしていましたが、疑問に思い、配列を設定して 再コンパイルして実行しても同じなんですが。
413 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:05:15 .net] 他人に自分の意志を伝えられない奴が コンピュータに自分の意志を伝えるプログラミングができるわけがない。 ソースもなしに・・・エスパーも求もと書いとけ。
414 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 20:24:15 .net] openfabrics.orgがつながらない、、、
415 名前:デフォルトの名無しさん [2009/12/28(月) 22:57:30 .net] 先日、Bcastの件で指導を頂いたものですが、今回、ScatterとGatherについてご指導願います。 プログラムは program TEST implicit real*8(a-h,o-z) : : MPIの使用開始の手続き : dimension a(2000),b(2000) ! if(Nrank.eq.0) then do i=1, 2000 a(i)=dble(i) enddo endif ! call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision,b(1),20,0,MPI_COMM_WORLD,ierr) ! if(Nrank.gt.0) then do i=1, 20 print *,Nrank,b(i) :この部分で画面に出力 enddo endif ! iiii = 1 + Nrank*10 call MPI_Gather(b(1),10,MPI=DOUBLE_Precision,a(iiii),10,MPI_DOUBLE_Precision,0,MPI_COMM_WORLD,ierr) : として、実行したのですが、画面出力部分では、出力値が全てのランクで0.0となるんです。 当然のことながらGatherでも同様なんですが、どうやった良いのか原因も何も解りません。どうかご指導ください
416 名前:デフォルトの名無しさん [2009/12/28(月) 23:06:52 .net] 失礼しました、 Scatterで...,b(1),20,の後にMPI_DOUBLE_Precision,を書き漏らしております。 質問時の記入ミスです。すみません。
417 名前:デフォルトの名無しさん [2010/01/06(水) 09:09:27 .net] これで出力が出ます。 それとGatherの方で MPI=DOUBLE_Precision の=が_の間違い。 a(iiii)は、ランク0に送るなら ランク0の受信バッファーを指定するので多分a(1)です。 implicit real*8(a-h,o-z) include'mpif.h' dimension a(2000),b(2000) call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world,Nrank,ierr) if(Nrank.eq.0) then do i=1, 2000 a(i)=dble(i) enddo endif call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision, & b(1),20,MPI_DOUBLE_Precision, & 0,MPI_COMM_WORLD,ierr) if(Nrank.gt.0) then do i=1, 20 print *,Nrank,b(i) enddo endif call mpi_finalize(ierr) end
418 名前:デフォルトの名無しさん [2010/02/08(月) 17:39:36 .net] PCだと大丈夫なんですが、大規模な計算機にジョブを投げたとき、 あるプロセスからの出力だけ途中で止まることがあります。 PCはintel fortran+mpich、大規模計算機はPGIfortran+Voltaire MPIです。 例えばプロセスごとにoutput00,output01,output02,output03のように 別のファイルに出力させているんですが、何かの拍子にいくつかが出力 されなくなったりします。ループの途中にbcastやbarrier等の同期があるので、 出力がないプロセスも計算そのものが停止しているということはないと思うのですが、 別のファイルや標準出力への出力も停止するのでうまく調べきれず、定かではありません。 かなり情報が少なくて申し訳ないのですが、考えうる原因、調査法、解決法もしくは それに至らなくとも何か思いついたことでもあれば教えて頂けませんか?
419 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 19:42:12 .net] >>415 2桁のファイル名を決める整数が 違うプロセスで同じ整数になっちゃって・・・とか とびとびになってしまって、とかは無いのかな? PCとスパコンで違う並列数でやっておかしくなったのなら 同じ並列数(2とかw)でやってテストしてみては? CPUが自分のプロセス番号(例題でよく変数名Myrankになるやつ) を決める部分のチェックとかもやるといいかも。 とあるシステムでちゃんと動いてるので415さんのMPIの (データ転送とかの)部分にミスがあるとは考えにくい、 という推定からすると他にはあまり思いつかないな。
420 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:30:15 .net] >>415 ノードローカルのディスクに書いてるとかいうオチならブチキレ
421 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 02:35:40 .net] でもたいていのシステムではジョブ終了時に一箇所にまとめるから 少なくともジョブ終了後にユーザーがファイルを移動する操作を する必要は無いような気もするけど・・・・ その可能性は大いにあるね。
422 名前:デフォルトの名無しさん [2010/02/10(水) 18:08:04 .net] 問題のプロセスはファイル出力はせずに計算はちゃんと終了してるの? mpi_finalizeを実行せずに終了してるのでは?
423 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 20:33:47 .net] MPI_Finalizeとファイル出力はなんも関係ない
424 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 10:58:34 .net] MPI_Finalizeとファイル出力はなんも関係ない => MPIとファイル出力はなんも関係ない => このスレとファイル出力はなんも関係ない
425 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 12:03:48 .net] アホかいな MPI_Finalizeしなくても、ファイル出力していればファイルはできてるし、ジョブが死ぬときにファイルがクローズされるからそのときにフラッシュされるわけで MPI_Finalizeしないことがファイルができないこととは無関係だっつってんだよ。
426 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:49:22 .net] LAM/MPIか何かでMPI_Finalizeを呼ばずにプログラムの実行を終了すると 次回以降のプログラムの実行がおかしくなることがあった希ガス。 確かlambootし直すと正しく実行できるようになったから、裏方のプロセスが 狂ったんだろうな。そういう状況ではファイル入出力が一部おかしくなっても 不思議ではない。
427 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:16:52 .net] 標準入出力はともかく、ファイル入出力をリダイレクトなんかしてませんよ。 途中でプロセスを頃したらmpichでもおかしくなることがあるが、あくまで通信に失敗すると言う次元のおかしくなり方だから。
428 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:37:48 .net] Finalizeを指定しなかったために通信がおかしくなって、 それによってプログラムの動き(例えば通信結果によってif文の判定を行っている)が変り、 ファイルへの書き出し部分を通過しなくなったというのは?
429 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 01:10:41 .net] 先に他のジョブが終わるってこと? つーか、その程度のミスならPCでマトモに動くとは思えないけど。
430 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 15:46:16 .net] 他のジョブとは関係なく、 一つのジョブで、MPI_Finalizeを指定しないで終了するプロセスがあると 通信がおかしくなることがあったと思う。
431 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:26:46 .net] >>29 ん?じゃぁ宛先はドコに置くん?
432 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 21:14:35 .net] >>428 メインプロセスがチャイルドプロセスを立ち上げる。 実装によるが、そのとき引数にチャイルドプロセスの情報を加える。 MPI_Initでargc, argvが要求されるのはそのため。
433 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 13:33:36 .net] MPI_Comm_size(MPI_COMM_WORLD,&numprocs); N_local = N_global / numprocs; double u_new[N_local + 2], u_old[N_local + 2]; こうやったら、Integer constant expression requiredって言われました どうすればいいの?
434 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 19:29:59 .net] >>430 MPIの前にCの勉強をしろカス といいたいところだが親切な俺様が教えてやろう C89, C++では動的配列は使えない。 mallocかnewで確保汁!
435 名前:デフォルトの名無しさん [2010/03/20(土) 18:01:31 .net] 三次元空間での拡散方程式の解法でお薦めのものを教えてください。 格子は150x150x150で、線形の拡散方程式です。
436 名前:デフォルトの名無しさん [2010/03/24(水) 06:27:04 .net] 自分で作るw ・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。 MPI版あったような・・・気がする。気がする、ばかりでなんだが。 それを元にして、というのも。 ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
437 名前:デフォルトの名無しさん [2010/03/24(水) 10:20:58 .net] コンパイルオプションで倍精度を指定した場合ってmpiの関数が送受信する データはどうなりますか?書き換えが必要ですか?
438 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 13:18:17 .net] >>434 Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、 自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど ・・・・忘れたwときがイヤなのであまり満足していない。 プリプロセスもクレバーに使えばコンパイル時に とあるオプションが使われたときにだけONになるように出来るハズだけど 使い方がいまいちわからんw この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
439 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 21:28:25 .net] 面倒くさいのでMPI_BYTEで送ってる。 個数を配列の長さ*sizeof(TYPE)にして。 fortranでこんなことができるか知らんけど。 エンディアンがあってないと大変なことになるが気にしない。
440 名前:435 mailto:sage [2010/03/25(木) 03:25:12 .net] 賢者あらわる。なるほど。ためしにFortran で real r r = 1.0 if sizeof(r) .eq. 8 then call mpi_send(...,mpi_double,....) else call mpi_send(...,mpi_float,....) endif をつくってみたけど、コンパイル時のオプションで振舞がちゃんと変わった。 例では r は単精度か倍精度かの判定用のダミー、のつもり。 値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
441 名前:434 mailto:sage [2010/03/26(金) 17:48:06 .net] >>436 ありがとうございます!出来るんですね。 >>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)
442 名前:436 mailto:sage [2010/03/26(金) 19:38:08 .net] 俺がやってるのは double a[N]; MPI_Send(... N, MPI_DOUBLE, ...) の代わりに MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...) なんだが。 これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。 >>437 だと新しい型を増やす度に条件分岐が増える。
443 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 02:01:35 .net] > MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...) なるほど!
444 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 12:13:43 .net] if (myrank==0) then call 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
445 名前:デフォルトの名無しさん [2010/04/04(日) 09:08:14 .net] ダグ番号って例題だと0だけど、複数の通信がシステム全体で走ってるときも0でいいのかな? ・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、 同じタグ番号でも困らないような気はするけど。
446 名前:デフォルトの名無しさん [2010/04/14(水) 10:18:20 .net] ubuntu9.10にOpenMPIをapt-getでインストールしました 。 インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか? 何か設定で切り替える方法があれば教えてください
447 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 01:33:13 .net] arkouji.cocolog-nifty.com/blog/mpich2/index.html ここの通りにやってサンプルを使った 円周率の計算まではできたんですけど 自分で書いたC, C++を動かすことができません とりあえずプロジェクトをいじってるんですがそれでいいんでしょうか? 何か留意点などありますか?
448 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 01:39:49 .net] windows版のmpichはmingw gccでもリンクできるからgccで作った方が早い。 mpi自体の設定もLinuxの方が簡単。
449 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 10:35:03 .net] 最近勉強を始めました。 並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。 とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか? codepad.org/13tw3pKS アドバイスお願いします。
450 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 00:58:42 .net] >>446 で、技術料はいくら払うんだ?
451 名前:デフォルトの名無しさん [2010/04/30(金) 06:33:21 .net] $200
452 名前:デフォルトの名無しさん [2010/05/10(月) 05:36:11 .net] OpenMPIとMPICH、どちらをインストールしたらよいのでしょうか それぞれの利点欠点を教えてください
453 名前:デフォルトの名無しさん [2010/06/12(土) 19:14:06 .net] MPICH2 1.0.7rc1 + g95 + cygwin の環境下で、以下のようにバックグランド実行させているのですが、 >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 &
454 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 23:35:54 .net] >>450 メッセージに書かれている通りのことをやればいいだけ
455 名前:デフォルトの名無しさん [2010/06/13(日) 04:24:41 .net] >>451 ありがとうございました。確かに入力用にこれを指定すると出なくなりました。 しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、 このようにしたのですが、それはマルチノードの設定の問題でしょうか。
456 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:55:37 .net] 何をやったらどんなエラーが出たのか書けよ
457 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 22:05:53 .net] PhenomII x6 1090Tを3.2GHzから4GHzにOCして、MPIでバカ並列の数値計算 プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。 殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、 計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。 ふと、OCやめて定格に戻したら、まともな速度が出るようになった。 なんてこった。どうやらOCで逆に遅くなる事があるようだ。 OCする場合とOCしないときと速度比較してみる価値あるかもよ。