Message Passing Interface (MPI) 統合スレ
1 :
デフォルトの名無しさん :
04/11/07 18:25:56
2 :
デフォルトの名無しさん :04/11/07 18:26:35
3 :
デフォルトの名無しさん :04/11/07 18:29:00
CORBAとかでできないの?
5 :
デフォルトの名無しさん :04/11/09 17:28:21
初心者ですが何かよい参考書はありませんか?
>>6 高校生でもこれほどの環境を手に入れられる時代になったのですね。
素晴らしい。
9 :
デフォルトの名無しさん :04/11/22 16:29:37
10 :
デフォルトの名無しさん :04/11/25 13:28:07
例とかが載っているサイトとかがあったら教えてください
MPIは使い方は簡単だけど、問題はアルゴリズムの並列化だよね。 MPI自体はほんとに難しいことはないから、リンク先でも読めばすぐにわかるよ。
MPI始めたばかりなんですが mpiccを実行した後、mpirunすると 0 - MPI_SEND : Invalid rank 2 p0_23956: p4_error: : 8262 [0] Aborting program ! [0] Aborting program! パイプ破壊 とエラーがでてしまいます。 何がいけないのでしょうか?;;
>>13 他のMPIプログラムはちゃんと動いたの?
もし動いたのなら、今回動かなかったプログラムのソースは載せられる?
>>13 > 0 - MPI_SEND : Invalid rank 2
Invalid rankなんだから、"2" に対応するpeがMPI_Sendで使用したコミュニケー
タに無いんじゃないの?
うわ・・書いてる途中で
>>15 知識が足りなくて理解できない…
本でも買って出直してきます;;
>>16 for(source=1;source<mb;source++){
多分ここでしょ。でもmbをpに直しても間違いのような・・・
突っ込みどころたくさんあるんだけど、もうちょい勉強してみて。
>>16 ,17
ありがとうございます。
周りに聞ける人いなくて助かりましたー
勉強してがんばります!
同志社の資料はわかりやすいですね。 「MPI並列プログラミング」(P.パチェコ著)も買ってみたんですが 結構難しくてちゃんと理解できるか不安に・・・。
23 :
デフォルトの名無しさん :04/12/20 16:49:59
む〜んエラーばっかだ かなり行き詰まってきた;; <NO ERROR MESSAGE> : Internal MPI error! Attribute in commun icator is not a valid attribute Special bit pattern 0 in attribute is incorrect. [0] Aborting program ! [0] Aborting program!
プロセス数2以外でやると止まってしまうんですが 原因がわかりません…ご教授のほどを 他のプログラムはプロセス数に限らず動いたんだけどなぁ
26 :
デフォルトの名無しさん :05/01/13 23:07:13
print文を入れてどこで止まってるか調べたら? 多分MPIの通信ルーチンの所だと思うけどね。
>>25 どういう状況でとまるのか書かないとわかりにくいッす。
愚考ながら、1のときと3のときでは止まる原因が違う、ということも。
ところで、MPICHのWIN版設定ってやってるページ少ないですね。
GUIのmpirunは接続異常は表示しないし…
ちょいとお尋ねしますが。 MPICHって、GlobalArrays実装してますか? 英文必死こいて読んで見たけど、らしき記述が見当たらないのです。 ・・・いや、職場で異様に自信満々で「共有メモリ使える」と逝ってる香具師がいるもんで。 そもそも分散型プロセス通信の為の規格っつーか仕様ですよね?>MPI
>>28 まさか「共有メモリ」なんて無いですよ。MPIって "Message Passing Interface" ですもん。
プロセッサ間のやりとりはすべてメッセージの送受信ですよ。
> ・・・いや、職場で異様に自信満々で「共有メモリ使える」と逝ってる香具師がいるもんで。
ずいぶんと不幸な職場環境ですね……
>>29 ・・・やっぱり?
おかしいとは思ったんですわ。
まあ、もうちょっと読み進めては見ますがせっかくだし。
それはそれとして、RMAのある実装って何かありますか?
MPICHにはないようで。
うまく使えばかなりおいしそうなんで、いじってみたい・・・
31 :
デフォルトの名無しさん :05/02/22 10:09:38
パソコンにインストールしたいのだけどどこから手をつけていいかわからん
とりあえず、 ハード的にはネットワークの使えるパソコン数台と、ルーター ソフト系は上のほうの紹介サイトぐるっと回ってライブラリをとってくる。 あとはメインのプログラムの開発環境、これぐらい?
33 :
デフォルトの名無しさん :05/03/09 17:16:27
bcc32で使える?
34 :
デフォルトの名無しさん :2005/03/28(月) 08:43:19
拡張子が.cの場合は問題ないのに、.cppにすると下記のようなエラーが出ます。 何がいけないのでしょうか?解決方法を教えてください。 /tmp/ccGU5ztX.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
拡張子を.cにする。
36 :
デフォルトの名無しさん :2005/03/28(月) 08:57:36
c++を使用したい場合は?
38 :
デフォルトの名無しさん :2005/03/28(月) 09:12:40
mpiccです。
39 :
デフォルトの名無しさん :2005/03/28(月) 16:28:41
MPIつかったプログラムを走らせた場合、すべてのプロセスは終わるときも同時に終わるのですか?
40 :
デフォルトの名無しさん :2005/03/28(月) 16:30:00
同時に終わるようにプログラムしないと同時には終わらないよ
41 :
デフォルトの名無しさん :2005/03/29(火) 02:56:38
プログラム中で、クラスを作成し、プログラム終了時に、ブロックから抜けることによって破棄されます。 このクラスのデストラクタがランク0以外働かないのですが、何故なのでしょうか?
>38 mpiCCでいける
43 :
デフォルトの名無しさん :2005/03/29(火) 11:17:29
受け取る側のプロセスがまだrecv関数に到達していないときに、送信側がsendを送った場合、メッセージは破棄されてしまうのでしょうか?
45 :
デフォルトの名無しさん :2005/03/31(木) 07:23:49
MPIはC++には対応しているの?
G77などのフリーソフトでMPI関数で書かれたプログラム文を コンパイルする詳しい方法分かりますか?
47 :
46 :2005/04/06(水) 14:40:00
OSはwindowsXPです。 include 'mpif.h'で定義ファイルを読み込むんですよね?
48 :
デフォルトの名無しさん :2005/04/06(水) 15:41:26
49 :
46 :2005/04/06(水) 16:07:03
>>48 使えないです。unixでないとできませんか?
50 :
デフォルトの名無しさん :2005/04/06(水) 16:30:58
G77ってgnuのfortran?
51 :
46 :2005/04/06(水) 16:33:04
そうです。無理ですか?
52 :
デフォルトの名無しさん :2005/04/06(水) 22:37:29
Windows上でのfortranコンパイラは何使ってるの?
53 :
46 :2005/04/06(水) 23:35:21
主にG77でコンパイルしています。
54 :
デフォルトの名無しさん :2005/04/07(木) 14:03:18
MPIを使ってPDEを解きたいのですが、データはそれぞれのノードがデータの一部分を持つのでしょうか? threadを使ったプログラムは経験があるのですが、MPIでの作成方法がよくわかりません。
55 :
デフォルトの名無しさん :2005/04/11(月) 00:23:11
MPICH2使った人いる?MPICHは普通に動くのだけれどMIPCH2が全然機能してくれない。
56 :
デフォルトの名無しさん :2005/04/16(土) 01:49:10
mpichについていたπの計算するプログラムが理解できません。 なんでwhile(!done){}あたりのギミックが必要なの?
57 :
デフォルトの名無しさん :2005/04/16(土) 13:14:57
_、 _ ∩
( ∀`) 彡
>>56 教えてやってもいいが
((≡O ⊃
| | おまい!左腕を上下 右腕を前後
し⌒J 同時にやってみろ!話はそれからだ!
CPUは別々に稼動してるだろ。CPU1個が処理終わったからといって 他のn個のCPUが処理が完全同期で終わる保証はどこにもないだろ。 だったら全部の処理が終わるまで待つのは当たり前だろ。 それともそんなことすら解らないのか?プログラム組むの辞めろ。お前は もう、日本から出て行け
>>56 > なんでwhile(!done){}あたりのギミックが必要なの?
単にコードの書き方がまずいだけと思われ。
この内容ならもっと見やすくシンプルにできるよね。
60 :
デフォルトの名無しさん :2005/04/16(土) 21:35:10
56です。
なんかわかったような気がする。
コメントアウトの部分のソースを無視していました。
頭悪くてすみませんでした。
>>58 さん
MPI_Reduce()で全プロセスが終わるの待ってるのかと思ってたんですけど
違うんですか?
61 :
デフォルトの名無しさん :2005/04/30(土) 18:49:38
CPUが空いているマシンから優先的にジョブを割り当てるにはどうしたらよいのでしょうか?
62 :
デフォルトの名無しさん :2005/05/01(日) 01:56:36
エラーもなくコンパイルが終わり、プログラムを実行すると、ある時点で p5_30033: p4_error: interrupt SIGSEGV: 11 Broken pipe Broken pipe というエラーが出ます。これは何がいけないのでしょうか? 個人的には、ファイルアクセスで問題が起きていると思っているのですが、エラーの原因が未だつかめません。
63 :
デフォルトの名無しさん :2005/05/01(日) 02:18:46
64 :
デフォルトの名無しさん :2005/05/03(火) 11:48:06
>>62 配列の範囲外にアクセスしているとか
MPI以外のエラーを疑え
65 :
デフォルトの名無しさん :2005/05/05(木) 11:48:10
gccのバージョンの違うコンパイラでmakeしたMPIを別のバージョンgccでコンパイルするCプログラムで利用しても問題ないですか? 問題ないと思っていたのですが、gcc4にアップデートして以来、原因不明で0番プロセス以外が実行中に落ちます。
x86 向け gcc4 はまだバグありで危険じゃないのかな。 gcc3 を使ってた方が安全だよ。
67 :
デフォルトの名無しさん :2005/08/19(金) 18:09:30
MPICH2をインストールするのにちょっと苦戦してるんですが mpd.confにsecretwordを書いた後どうすればいいかちょっと分かりません 教えてもらえないでしょうか?
× 教えてもらえないでしょうか? ○ ちょっと教えてもらえないでしょうか?
69 :
デフォルトの名無しさん :2005/08/22(月) 05:24:37
これがちょっち?
SCore使って上げてヽ(;´Д`)ノ
71 :
デフォルトの名無しさん :2005/09/12(月) 22:52:56
ググってみましたが、情報が少ないですね。 C++でサーバアプリで計算しながら、クライアントアプリにソケット通信するようなシステムに 適用できますか? サーバー側は1000件/分ぐらいのトランザクションで、クライアント側はサマリー情報を 半リアルで表示させるだけといったかんじです。
余裕
73 :
デフォルトの名無しさん :2005/11/06(日) 16:40:07
mpiプログラミングの前にmpiの勉強をした方が(w
74 :
デフォルトの名無しさん :2005/11/17(木) 11:20:42
実行時に使用するコンピュータを指定することは出来ないのでしょうか?
できますよ
76 :
デフォルトの名無しさん :2005/11/17(木) 16:19:52
やり方を教えてください
方法はMPIの実装に依る
79 :
デフォルトの名無しさん :2006/01/12(木) 23:20:44
お客さんの16CPUマシン(8node, SMP 2way)向けにC言語でMPIプログラムを書いています。単純に差分法で計算するプログラムです。でも私の開発環境は、Pen4の1CPU、fedora3マシンなのです。その1CPUマシンで mpirun -c 16 myprog.exe で実行すると、16個のプロセスが動き始めるのですが、問題があります。 それは、プログラムを実行すると、データファイルを読み込んで、処理が始まるのですが、データファイルはいくつかの大きさのものを用意しているのですが、 あるデータファイルでは、正しく計算が完了するのですが、あるデータファイルでは 計算開始直後にエラーで終了してしまいます。調べたところ、MPI_Bcast()で エラーしていました。 また、正しく計算できるデータファイルを使って、 mpirun -c 8 myprog.exe のように変えるとエラーする場合もあります。 そこで教えていただきたいのですが、そもそも1CPUマシンで、このような並列計算を 実行することは、何か問題がありますでしょうか? よろしく。
基本的に動かないとまずい。 メモリ不足とかじゃなきゃ、プログラムのバグだろうね
81 :
デフォルトの名無しさん :2006/01/13(金) 11:50:49
アドバイスありがとうございます。 >基本的に動かないとまずい。 >メモリ不足とかじゃなきゃ、プログラムのバグだろうね やはりそうですか。 実際、プログラムを単純化して、単に16プロセスでMPI_Bcast()するだけというプログラムでは、問題なく動きます。 16以外のどんな数字でも問題ありません。なので、プログラムのバグの可能性が高いのですが、一つ気になる点は、 エラーするケースでも、エラーしないケースでも、いずれの場合でもプロセスをps -ef などでモニタしていると、 実行中に16プロセスそれぞれの親プロセスIDがころころ変わっているのが確認できるのですが、何かそのあたり に関係しているのではと思うのですが、どなたか詳しい方、ヒントなどお願いします。
mpichでもlamでも、実機でもなるってんだったら、 プログラムのバグ。 MPI_Barrier()で、きちんと同期とって MPI_Bcast()で起こってるなら MPI実装を疑ってもいい。 まあ、なんだ。 漏れには「FedoraのMPIでエラー終了」じゃ、 どのMPI環境なのかも どんな異常終了かもサパーリですよ。
83 :
デフォルトの名無しさん :2006/01/15(日) 14:56:36
>実際プログラムを単純化して、単に16プロセスでMPI_Bcast()するだけというプログラムでは、問題なく動きます (1) 単純化したプログラムと、エラーが起こる実プログラムで、 送信データの大きさは同じですか? (2)どういうエラーメッセージが出ますか? (3)mpi_bcastの前後にprintfでランクの値を書き出した場合、 どうなりますか? (全プロセスがmpi_bcast前しか表示しないのか、 それともプロセスによってはmpi_bcast後も表示するのか) (4)エラーが起こるデータファイルで、プロセス数が16より少ないときは どうなりますか?
84 :
デフォルトの名無しさん :2006/01/16(月) 00:57:31
皆さん、アドバイスありがとうございます。 >(1) 単純化したプログラムと、エラーが起こる実プログラムで、 >送信データの大きさは同じですか? はい。MPI_INTを一個です。 >(2)どういうエラーメッセージが出ますか? 今自宅なので、正確には覚えていませんが、英語のメッセージで、 『どれかのプロセスでエラーしました』とか言う感じだったと思います。 >(3)mpi_bcastの前後にprintfでランクの値を書き出した場合、 >どうなりますか? 正しく、自分のランク値が表示されます。 >(全プロセスがmpi_bcast前しか表示しないのか、 >それともプロセスによってはmpi_bcast後も表示するのか) 全プロセスで、MPI_Bcast前に正しいランク値が表示されますが、 MPI_Bcast後には、どのプロセスも何も表示されません。
85 :
デフォルトの名無しさん :2006/01/16(月) 00:58:31
>(4)エラーが起こるデータファイルで、プロセス数が16より少ないときは >どうなりますか? ええっと、その後、いろいろ試してみたら以下のようになりました。 分割数 大きいデータ 小さいデータ 2 OK エラー 4 OK OK 5 エラー エラー 6 エラー エラー 7 エラー エラー 8 エラー OK 9 エラー OK 10 エラー OK 11 エラー OK 12 OK OK 13 エラー OK 14 OK OK 15 エラー OK 16 エラー OK 20 エラー OK というわけで、よく分かりません。 ちなみに、MPI_Barrier同期は、まったく問題なく動きます。 今のところ、MPI_Bcastを使うのをやめて、MPI_Send/MPI_Recvで同等の処理を することで、エラーを回避できたようなのですが、MPI_Bcastがエラーする 原因が分からないので、ちょっと気がかりです。
86 :
デフォルトの名無しさん :2006/01/16(月) 04:45:45
(5) >はい。MPI_INTを一個です。 確認ですが、一個というのは、下記の2つ目の引数が1という意味ですか? MPI_Bcast(a,1,MPI_INT,〜); (6) 上記MPI_BCASTの4つ目の引数(送信元プロセスのランク値)は、 全プロセスで同じ値になっていますか? また、2,3つ目の引数(送受信バッファーの個数と型)も 全プロセスで同じ値になっていますか? (7)下記の表の意味ですが、1CPUで2プロセス(mpirun -np 2)で実行し、 小さいデータを入力させた場合でもエラーになるという意味ですか? またこれは何度やっても同じ結果ですか? (つまり同じケースでもOKになったりエラーになったりすることはないか) 分割数 大きいデータ 小さいデータ 2 OK エラー
87 :
デフォルトの名無しさん :2006/01/16(月) 04:50:20
(8) 問題のMPI_Bcastに到達する前に、MPIの他の通信は行っていますか? (9) 実プログラムが下記のような構成になっているとして (a)の部分をすべてコメントにすれば、 (単純化したプログラムではうまくいくとのことなので) うまく動くと思いますが、 その後で、(a)の部分を前半から少しずつ コメントをはずしてはテストしを繰り返せば、 どこかで再びエラーとなるはずです。 それによって、エラーの原因となっている個所が特定できるかもしれません。 あるいは逆に、(b)と同等の通信を(送信バッファーの中身は空でも可) まず(a)の直前で行い、うまくいったら、 (a)内を少しずつ後ろへずらしていっても同じテストができます。 MPI_Init(); (a) 入力ファイルの読み込み等 (b) MPI_Bcast(a,1,MPI_INT,〜); (c) 計算 MPI_Finalize();
88 :
デフォルトの名無しさん :2006/01/16(月) 05:13:37
(5)の訂正 >はい。MPI_INTを一個です。 確認ですが、一個というのは、下記の2つ目の引数が1という意味ですか? MPI_Bcast(a,1,MPI_INT,〜); また、下記の大きいデータの場合も小さいデータの場合も1ですか? 分割数 大きいデータ 小さいデータ 2 OK エラー
89 :
デフォルトの名無しさん :2006/01/16(月) 18:19:54
長文のアドバイスありがとうございます。 >(5)の訂正 >確認ですが、一個というのは、下記の2つ目の引数が1という意味ですか? >MPI_Bcast(a,1,MPI_INT,〜); はい、そうです。 >また、下記の大きいデータの場合も小さいデータの場合も1ですか? >分割数 大きいデータ 小さいデータ >2 OK エラー はい。 >(6) 上記MPI_BCASTの4つ目の引数(送信元プロセスのランク値)は、 >全プロセスで同じ値になっていますか? はい、そうなっています。printfで確認しました。 >また、2,3つ目の引数(送受信バッファーの個数と型)も >全プロセスで同じ値になっていますか? はい、同じです。 >(7)下記の表の意味ですが、1CPUで2プロセス(mpirun -np 2)で実行し、 >小さいデータを入力させた場合でもエラーになるという意味ですか? はいそうです。 >またこれは何度やっても同じ結果ですか? >(つまり同じケースでもOKになったりエラーになったりすることはないか) 再現されます。同じデータ、同じ分割数で、数回実験しましたが、その時は再現しました。 でも、何十回も同じ条件でテストしたわけではありません。 >(8) 問題のMPI_Bcastに到達する前に、MPIの他の通信は行っていますか? 他に行っているのは、MPI_Barrierのみです。同期をたくさん入れれば問題が解決するんじゃあ ないかと思って、たくさん入れました。 >(9) 実プログラムが下記のような構成になっているとして >(a)の部分をすべてコメントにすれば、 これらのテスト結果の報告は、後日させていただきます。
90 :
sage :2006/01/19(木) 03:41:50
mpichをインストールをしたいのですがconfigureで指定しなければならない オプションをちょっと教えていただけないでしょうか? osはfedora core4 コンパイラーにintel fortran compilar 9.0 mpich-1.2.7p1 を使用しています。 よろしくおねがいします。
91 :
デフォルトの名無しさん :2006/01/19(木) 17:54:06
こんなふうに、実数型と整数型を一緒にするとエラーがでます。 if ( myid .eq. 0 ) then call MPI_IRecv(retunum,90,MPI_REAL8,1,itag(myid+2),MPI_COMM_WORLD,ireq2,ierr) elseif ( myid .eq. 1 ) then call MPI_ISend(retunum,60,MPI_REAL8,0,itag(myid+1),MPI_COMM_WORLD,ireq2,ierr) end if if ( myid .eq. 0 ) then call MPI_IRecv(iretunum,90,MPI_INTEGER,1,itag(myid+2),MPI_COMM_WORLD,istaus,ierr) elseif ( myid .eq. 1 ) then call MPI_ISend(iretunum,60,MPI_INTEGER,0,itag(myid+1),MPI_COMM_WORLD,ierr) end if 以下のように、何故ですか?わかる人教えて下さい。 test-calcul2.f:99: warning: call MPI_IRecv(retunum,90,MPI_REAL8, 1 test-calcul2.f:106: (continued): call MPI_IRecv(iretunum,90,MPI_INTEGER, 2 Argument #1 of `mpi_irecv' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]
92 :
デフォルトの名無しさん :2006/01/19(木) 17:56:58
あ、タイプミスだ。 > if ( myid .eq. 0 ) then > call MPI_IRecv(iretunum,90,MPI_INTEGER,1,itag(myid+2),MPI_COMM_WORLD,istaus,ierr) > elseif ( myid .eq. 1 ) then > call MPI_ISend(iretunum,60,MPI_INTEGER,0,itag(myid+1),MPI_COMM_WORLD,ierr) > end if if ( myid .eq. 0 ) then call MPI_IRecv(iretunum,90,MPI_INTEGER,1,itag(myid+2),MPI_COMM_WORLD,ireq2,ierr) elseif ( myid .eq. 1 ) then call MPI_ISend(iretunum,60,MPI_INTEGER,0,itag(myid+1),MPI_COMM_WORLD,ireq2,ierr) end if です。
93 :
デフォルトの名無しさん :2006/01/20(金) 00:14:20
下記のプログラムでも同じエラーが出ますか? もし同じエラーが出たとしたら、 同じサブルーチンの同じ引数に異なる型を指定しているという 警告で、MPIとは関係ないと思います。 program test call sub(a) call sub(i) end subroutine sub(a) a=1 end
94 :
デフォルトの名無しさん :2006/01/20(金) 00:21:15
それから念のため補足ですが -2つのif文を1つにまとめた方がすっきりすると思います。 -例えばランク0プロセスが同じireq2を(mpi_waitする前に)2回使うのはまずいです。 片方を例えばireq1にしてください。 また2回のcall mpi_xxxの後でmpi_waitが2回必要となります。 あるいはmpi_sendrecvを使う手もあります。
95 :
91 :2006/01/23(月) 16:20:18
>>93 まさにそれでした。
>>94 なるほど、了解です。
ところで、送信バッファーに3次元の配列を持たせたいのですが
送受信がうまくいきません。何故かわかる方いますか?
if ( myid .eq. 0 ) then
call MPI_Recv(test(i,j,1),3,MPI_REAL8,1,itag,
& MPI_COMM_WORLD,istaus,ierr)
else
call MPI_Send(test(i,j,1),3,MPI_REAL8,0,itag,
& MPI_COMM_WORLD,ierr)
endif
test(1〜50,1〜100,1〜3)です。
96 :
デフォルトの名無しさん :2006/01/23(月) 18:40:47
(1) test(i,j,1)のiとjには何が指定されてますか? (2) 送る要素数は3個ですか? (3) istatusは大きさmpi_status_sizeで配列宣言してますか? (4) itagには何が指定されてますか? (5) 実行するとどういうエラーになりますか?
97 :
91 :2006/01/24(火) 11:15:33
>>96 (1) test(i,j,1)のiとjには何が指定されてますか?
i=1,100とj=1,300です。DOループで指定されます。
(2) 送る要素数は3個ですか?
はい、南北方向・東西方向・上下方向の意味なので、3個です。
(3) istatusは大きさmpi_status_sizeで配列宣言してますか?
integer istatus(MPI_STATUS_SIZE)で宣言しています。
(4) itagには何が指定されてますか?
itag=1です。
(5) 実行するとどういうエラーになりますか?
テストプログラムで行った結果、エラー文は出ませんでしたが
入っているはずの値が入っていませんでした。
たとえば、10.5が入るはずなのに、0.0のままであったりします。
動かない並列プログラムを無料でデバッグしてくれるスレはここですか?
99 :
デフォルトの名無しさん :2006/01/24(火) 18:46:04
例えばi=1,j=1のとき、送りたいデータは以下(A)(B)のどちらですか? (Fortranの場合は(A)が送られます。) (A) test(1,1,1) test(2,1,1) test(3,1,1) (B) test(1,1,1) test(1,1,2) test(1,1,3) 余談ですが、通信回数が多いと通信時間がかかるので、 普通は送りたいデータをまとめて1回で送るようにします。 従ってループ内で通信を行うということはあまりしません。
100 :
デフォルトの名無しさん :2006/01/26(木) 13:56:53
MPIf77でコンパイルできても MPIf90でコンパイルできねー!! ↓こんな感じのエラーしかでねー!! IPO Error: unresolved : mpi_type_dup_fn_ Referenced in newfile.o IPO Error: unresolved : mpi_win_dup_fn_ Referenced in newfile.o newfile.o(.text+0x20): In function `MAIN__': : undefined reference to `mpi_init_' newfile.o(.text+0x34): In function `MAIN__': : undefined reference to `mpi_comm_rank_' MPIのインストールの時おかしな事したのか?おれ
101 :
デフォルトの名無しさん :2006/01/31(火) 15:53:13
age
102 :
デフォルトの名無しさん :2006/01/31(火) 19:28:15
こんなエラーがでるんだが誰れか原因解かりますか? [root@clust-gri00 test]# mpif90 -o testfile testfile.f /usr/local/mpich-1.2.6/lib/libmpich.a(farg.o)(.text+0x7): In function `mpir_iargc__': : undefined reference to `f__xargc'
まあせめて中のコンパイラぐらい書こうな
あと大学名と担当教官名も
105 :
デフォルトの名無しさん :2006/02/01(水) 18:04:38
Intel Fortran Compiler 8.1 から Intel Fortran Compiler 9.0に入れ換えたらこんなのがでるようになった. glibcのヴァージョンが古いのか?動くっちゃ動くし結果も間違っていないが、何か気持ちわるい。 誰れか改善方法しりませんか? /opt/intel/fc/9.0/lib/libifcore.a(for_open_proc.o)(.text+0xc14): In function `for__compute_filename.': : warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/local/mpich-1.2.6/lib/libmpich.a(p4_secure.o)(.text+0x87): In function `start_slave': : warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/local/mpich-1.2.6/lib/libmpich.a(chnodename.o)(.text+0x29): In function `MPID_Node_name': : warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
106 :
デフォルトの名無しさん :2006/02/02(木) 04:11:56
めっせーじぱっしんぐってなあに?
読んで字の如く
108 :
デフォルトの名無しさん :2006/02/02(木) 05:39:40
いじわる><
>>109 ?
何が言いたいの?日本語わかる?
せめて会話くらいしろよ。キチガイ
111 :
デフォルトの名無しさん :2006/02/09(木) 13:02:07
age
112 :
デフォルトの名無しさん :2006/02/09(木) 14:40:46
MPICH2のC++バインドのクラス一覧が載ってるサイト知りませんか? ユーザーガイドにも載ってないし。
114 :
デフォルトの名無しさん :2006/03/02(木) 23:48:55
MPI初心者なんですけど、 MPICHダウンロードして、一緒についてきたサンプルプログラムを MPICH Configurationで参加するノードを設定してから実行すると Failed to launch the root process: "C:\Documents and Settings\XXXXX\cpi" LaunchProcess failed, LogonUser failed, ログオン失敗: ユーザー名を認識できないか 、またはパスワードが間違っています。 というエラーが返ってきます。 設定しなければローカルで動くんだけど、何でだろう?
116 :
114 :2006/03/03(金) 17:57:11
117 :
デフォルトの名無しさん :2006/03/07(火) 16:00:54
独学でisend bcastなどの基本的な関数は一通り使い方がわかったのですが、 なんか練習問題みたいなのはないですか? そんな大規模演算をする機会もないし、 練習用に何かお勧めなものはありますか?
118 :
デフォルトの名無しさん :2006/03/07(火) 17:20:48
sendとrecvだけでbcast,scatter,gather,allgatherと同じ機能を作る ヤコビ法の並列化 LU分解の並列化 2次元FFTの並列化
π計算の並列化 e計算の並列化
実用的なのは、 コマンド1 コマンド2 . . . コマンドN という独立したジョブが書いてあるテキストファイルを読み込んで、 P個のプロセッサで実行させるプログラム。 コマンドに依存関係つけるとなおよし。
121 :
デフォルトの名無しさん :2006/03/12(日) 16:05:09
MPI_Sendで送る際、相手が受け取るまでプログラムの実行を停止するにはどうしたらよいのでしょうか?
122 :
デフォルトの名無しさん :2006/03/12(日) 16:09:32
synchronous sendにすりゃいいのと違う?
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか? そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
C++BuilderでMPIを使うにはどうしたらよいのでしょうか?
126 :
デフォルトの名無しさん :2006/03/24(金) 20:00:53
MPICH2のWindows版を使っているのですが、 以下のようなプログラムでも時間が3秒かかります。(VC++、IntelC++とも) MPI_Finalizeの終了処理に時間がかかっているようですけど 対策をご存知の方いっらいしゃますすか。 #include "mpi.h" int main(int argc, char **argv) { MPI_Init(&argc, &argv); MPI_Finalize(); return 0; }
127 :
デフォルトの名無しさん :2006/04/13(木) 06:48:21
ノンブロッキング通信というのは、簡単に言うとどういうものなのでしょうか?
バックグラウンドで通信処理をさせることで 一度に複数の相手と通信したり、 通信中に別の計算させたりするもの
ほしゅしゅ
130 :
デフォルトの名無しさん :2006/05/11(木) 15:37:35
hoshu
131 :
デフォルトの名無しさん :2006/06/02(金) 08:31:40
あまり大きなサイズで一度に通信しようとすると、デッドロックするのは仕様ですか?
実装によるだろ そんな仕様はない
133 :
デフォルトの名無しさん :2006/07/30(日) 21:08:39
ちょ・・・こんな有益なスレがあったなんて。。 明日からmpi使うらしいんで勉強してきます
John the RipperのMPI対応版出たけど アレって単にプロセス間通信やるだけよね? プロセスレベルマルチタスクであってスレッドレベルマルチタスクじゃないよね?
135 :
デフォルトの名無しさん :2006/09/05(火) 22:49:52
Linuxにmpich-1.2.3を突っ込んで int main(int argc, char **argv){ int procs, id; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &id); MPI_Comm_size(MPI_COMM_WORLD, &procs); printf("#### %d, %d ####\n", id, procs); MPI_Finalize(); return 0; } なmain.cソースファイルを生成し, mpicc main.c mpirun -np 1 a.out したところ 0 - <NO ERROR MESSAGE> : Could not convert index 1140850688 into a pointer The index may be an incorrect argument. Possible sources of this problem are a missing "include 'mpif.h'", a misspelled MPI object (e.g., MPI_COM_WORLD instead of MPI_COMM_WORLD) or a misspelled user variable for an MPI object (e.g., com instead of comm). [0] Aborting program ! [0] Aborting program! p0_11706: p4_error: : 9039 と言われてしまいました. fortranプログラムでもないし,COMMをCOMと打ち間違えてもいないし……というわけで,原因・解決方法をご存知の方おりましたらご教授くださいませ.
136 :
135 :2006/09/05(火) 23:46:15
mpich-1.2.7拾ってきてぶっこんだら動きました. 吊ってきます.
保守党
138 :
デフォルトの名無しさん :2006/11/16(木) 01:19:10
MPICH2をFedora Core3にて実行しようとしています。 mpdはローカルであれば、正常に起動してicpiなどきちんつ動いているのですが、 ネットワーク越しのリモートで分散させようとすると(mpdboot, rshに書き換え済み) 動作しません。 failed to ping mpd ...といったエラーがでます。 ちなみにrshは単体ではパスワードなしで動作しています。 Fedoreの設定はファイヤーウォールはインストールしていますが、 「ファイヤーウォールは無効」でやっています。 むしろmpdというよりもFedoraの設定のような気がしますが、同様な症状を 経験された方はおられますでしょうか?
139 :
デフォルトの名無しさん :2006/11/28(火) 16:48:25
WindowsXPのVC環境で、3次元空間内におけるある種のシミュレーションプログラムを作って、 それをLinux fedora3のgccとMPI環境で並列化しました。 いまのところWin1CPU版とFedoraMPI版は同じ結果を出してくれるので、いいのですが、 ソースをメンテナンスするときに、まず1CPU版で試して、それをMPI版に移植する作業 が結構わずらわしいので困っています。 MPI版はシミュレーション空間をn分割(n≧2)する仕様になっているので、n=1として Windows上で動かすことはできません。 そこで思ったのですが、DUAL COREのWindowsマシンならば、そこにMPICH2をインストールして、 n=2で動かせば、CPUも2個使えるし、今後、MPI版のみメンテナンスすれば、fedoraでも Windowsでもソースを共通化できるので、楽になると思ったのですが、この作戦、 どうでしょうか?何か注意すべき点などありましたら、アドバイス御願いします。
>>139 mpi詳しくないけど
CPU二個とnode二個はぜんぜん違うからできないんじゃないの?
例え、1CPUでもたいがいのMPI実装は2プロセスで並列実行できる
142 :
デフォルトの名無しさん :2006/11/30(木) 10:50:29
>141 ありがとございます。やってみます。 ところで、MPIプログラムのデバッグって、皆さんどういうふうにやっていますか? 私にはとても難しいです。というのは、エラー発生しても、どこかのnodeでエラーが 起こった程度のことしかわからないので、怪しげなところにprintfを沢山いれて探し 出すという泥臭い方法でやっています。 一方WindowsのVCの環境だとDebuggerでSTEPで一行ずつ実行できるので、便利なのですが、 MPIプログラム開発でも、でも何かそういう統合的な開発環境や高性能なDebuggerって あるのでしょうか?
VCってMPIサポートしてたよね?確か
144 :
デフォルトの名無しさん :2006/12/02(土) 21:56:05
>143 ほんまかいな?
MPICH2のWin32バイナリってVC++で使えるんじゃなかったっけ
Windows Compute Cluster Server 2003 MS MPI あたりでぐぐりぇ
38度の熱が出てるのに俺元気だよなwwww
誤爆しますた><
149 :
デフォルトの名無しさん :2006/12/04(月) 11:56:46
>146 >Windows Compute Cluster Server 2003 これを買わないとWindowsXPでMPIはできないの?
150 :
デフォルトの名無しさん :2006/12/04(月) 15:24:37
mpiCCでHUGE_VALがあると、 huge-test.cpp(11): warning #1188: floating-point value cannot be represented exactly double a=HUGE_VAL; とワーニングが出るんだけど、どうしたらいいかな??
151 :
デフォルトの名無しさん :2006/12/24(日) 01:09:15
関数の引数として自分のタスクIDを渡して、その関数の中で受け取ったIDによって 判別して処理を書き換えるという方法に問題はあるでしょうか? また一般的ですか? それとも処理ごとに書き換えた関数を用意して、 呼び出す側でIDによって呼び出す関数を変えた方が良いのでしょうか? ご回答よろしくお願いします。
Mac OS X LAM-MPIの詳しい解説サイトない?
154 :
デフォルトの名無しさん :2007/01/14(日) 01:14:46
MPICH 1.2.5 でWindowsマシン2台でプログラムを動かそうとしたのですが、 以下のようなエラーを吐いてしまいました。 どなたか原因がわかる方いませんでしょうか。 pingでお互いのホストは認識されています。 >ERROR: The root process on "hostname" has unexpectedly exited. Exit code = -1073741515
>>154 [hostname]ユーザーが登録されてるクラスタのプロセスがおかしいって言ってるね
もうちょっと構成とか詳しく
156 :
デフォルトの名無しさん :2007/01/14(日) 16:33:20
>>155 レスありがとうございます。
大学の研究室のマシン(XP)で、お互い同じワークグループに入っているようです。
構成についてもっと詳しく書きたいのですが、
どのように調べてどういった情報を書けばいいのか教えていただけますか?
よろしくお願いします。
157 :
154 :2007/01/15(月) 19:54:35
154です。
調べたのですがやはりよくわかりません。
>>156 で同じワークグループだと書きましたが、それは関係ないみたいですね。
研究室のマシンがどのようにつながっているのか良くわからないのですが、
共有フォルダで互いのファイルを参照できたり同じワークグループに入って
いたりしたので、MPICHも問題なく動くものだと勘違いしていました。
WindowsでMPIを使う場合の構成の仕方が載ってるサイトの情報でも
とてもありがたいので、どなたかご教示願いいたします。
158 :
155 :2007/01/15(月) 22:07:54
159 :
154 :2007/01/16(火) 00:20:12
>>155 レスありがとうございます。
リンクのトップに出てくるサイトで設定をしていてできなかったのです。
で、いじくってて気づいたのですが、ユーザーズガイドのシステム要件を見たら、
WindowsのHOME EDITIONは使えないのですね・・・
これはMPICH2を使えばいいのでしょうか。
MPICH2のほうのユーザーズガイドみたら特にPROに限るような記述はなかったので
HOMEでもいけるのですかね?
あと、CPUですがPentium4を使っています。
161 :
154 :2007/01/23(火) 03:52:37
>>160 レス遅れてごめんなさい。
実はあれからMPICH2でやってみたところ、WindowsHomeでも動かすことができました!
たくさん相談にのっていただきありがとうございました。
ただ、今回4台で並列化行う予定なんですけど、
1台だけうまくいかないマシンがあってまた困っています。
他のマシンで2台でやってみると正常に実行できるのに、そのマシンを入れて行うと
"abort: Unable to connect to <hostname>"と出てしまいます。
設定は他のマシンと同じようにしてるつもりなのですが。
ようやくできるようになったと思ったのに、色々問題出てきますね・・・
163 :
154 :2007/01/24(水) 02:08:24
>>162 レスありがとうございます!
ご指摘のとおり、アカウント名が原因でした。
あとベンチマークですが、、、余裕があったらやってみます、スミマセン^^;
164 :
デフォルトの名無しさん :2007/01/30(火) 17:50:05
あるプロセッサが持っている行列内の1列をまとめて別のプロセッサに送りたいんですが どのような関数を使えばいいでしょうか?
165 :
デフォルトの名無しさん :2007/01/30(火) 22:47:50
166 :
デフォルトの名無しさん :2007/01/31(水) 15:24:23
共有変数を用意したいのですがどうすればいいですか?
MPICH2でwindowsを2台動かそうとしているんですが、 wmpiconfig.exeでapplyボタンを押しても <ホスト名> Credentials for <アカウント名> rejected connecting to <ホスト名> Aborting: Unable to connect to <ホスト名> と表示されて設定できません。 アカウント名とパスワードは2台とも同じものを設定していて、 ファイアーウォールも切っています。 pingでもお互いを認識しています。 どなたか原因分かる方よろしくおねがいしますm(_ _ )m マシン構成は winXP HOME PEN4 1.6GHz winXP PRO PENIII 800MHz です
MPI_Finalizeを呼んだら制御が返ってこなくなったんですが、
何か原因に心当たりのある方はおられませんか。
printf("before\n");
MPI_Finalize();
printf("after\n");
これをやったらbeforeしか表示されません。
ちなみに
[email protected] です。
設定がうまくいってないんだろ?
171 :
169 :2007/02/27(火) 03:48:13
NFSで共有していないファイルから問題設定を読んでいて、 PC毎にパラメタが変わってこけていたという罠。 吊ってきます Λ||Λ
並列計算に興味あるのですが、単に処理するデータを分割、各PCで計算、最後に統合するのでは なく、PC毎に別のデータを別の処理方法で行っていて、あるPCの処理結果が別の処理中のPCの処 理に割り込んで処理方法を変えるなどということは出来るのでしょうか?
173 :
デフォルトの名無しさん :2007/03/20(火) 23:06:11
自作のC++プログラムの並列化をしています。 MPI_Finalizeを呼ぶタイミングについて疑問があります。 MPI_Finalizeをmainの末尾で呼べば無事に終わるのですが、 Singletonクラスのデストラクタの中で呼んだら落ちてしまいました。 main を抜けた後に呼んではいけないでんしょうか? 環境は、MPICH2、Win XP SP2、Visual Studio 2005 です。
MPI_Gatherなどで、転送するデータタイプはMPI_DOUBLEなどで指定しますが、 データタイプがテンプレートに指定されたデータタイプによって変わる場合、 どのように設定したらよいのでしょうか?
175 :
デフォルトの名無しさん :2007/05/19(土) 08:51:23
平凡な方法ですが、 template<typename T> class MpiConst{}; template<double> struct MpiConst { static const int TYPE = MPI_DOUBLE; }; と特殊化をしておいてから、目的の template を作る のは、どうでしょう。 これは、MpiConstを隠蔽する改良案です。 class Base { protected: Base(); ~Base(); static const int TYPE = MPI_DOUBLE; // 以下、MpiConst の定義・特殊化 }; template<typename T> TargetClass: protected Base { ... };
176 :
デフォルトの名無しさん :2007/05/19(土) 09:14:10
↑すみません。class Base の中の static const ... の行を消し忘れました。
openmpの場合、#ifdef _OPENMPでopenmpを使ってコンパイルしている 場合とそうでない場合に別々のコードを書くことができますが、 MPIの場合はどのようにしたらよいのでしょうか?
178 :
デフォルトの名無しさん :2007/06/09(土) 16:58:36
このスレではPCクラスタのシステム障害(とくにハード)について経験ある方も 少なくないと思うので、お尋ねします。 1年前に構築した16ノードクラスタ(ディスクはNFS共有、ギザイーサ)が、 最近頻繁にp4_errorを起こすようになりました。 とりあえず疑わしいところからパーツを取り替えまくったのですが、全く改善しません。 特定ノードというより全体的にパラパラと障害が発生してるので、もしやネットワークかな と思ったのですが、ネットワークに問題があるなら、rloginやsshのセッションやNFS の読み書きにも障害が出ると思うのですが、特に問題は出ていないようです。 MPIで並列したときに限って発生します。 これからネットワークの交換を検討していますが、何かアドバイス頂けいたら幸いです。 ちなみに1年間はほぼ問題なく使えており、他の計算機でも実績があるので プログラム側の問題ではないです。
179 :
デフォルトの名無しさん :2007/06/22(金) 11:04:41
MPI_Finalizeを行わずに終了した場合、どのような問題が起きる可能性がありますか?
MPI_Finalize のソース読んだらいいんじゃね??
>>178 今頃気付いたが、ギザイーサワロス
巨大王墓間を高速インターコネクトで結んで世界の七不思議にでも入れたいノケ?
デッドロックを発生させない定石のようなものはありますか?
巨大王墓=ピラミッド
わかんねーよハゲwww
世界の七不思議=ギザのピラミッド他
ギザかわゆすwwwwwww
189 :
デフォルトの名無しさん :2007/07/02(月) 16:57:33
現在boostのuBlasを使って逆行列を解いています。 MPIを使ってさらに大規模な行列を計算させたいのですが、お薦めのライブラリを教えてください
どなたかPS3でmpich2やってるひといません? fedora5でひととおりmpich2をインストール、設定後に実行するとこんなんで て困ってます。 # mpirun -n 1 date mpiexec_ps3slave1 (send_dict_msg 632):send_dict_msg: sock= errmsg=:(32, 'Broken pipe'): mpdtb: /usr/local/bin/mpdlib.py, 632, send_dict_msg /usr/local/bin/mpirun, 250, mpiexec /usr/local/bin/mpirun, 1399, ? mpiexec_ps3slave1: mpd_uncaught_except_tb handling: exceptions.KeyError: 'cmd' /usr/local/bin/mpirun 255 mpiexec elif msg['cmd'] != 'response_get_mpdrun_values': /usr/local/bin/mpirun 1399 ? mpiexec() どなたか御力をおかしください。
191 :
190 :2007/09/03(月) 22:06:14
自己解決しました。Fedoroa 6を入れなおして、mpich2を入れなおしたら いけました。 他にps3でクラスタやってる人の例をネットなどでみていると、結構Fedora 5で やってる人がいるから、OSの違いでうまくいったというよりも、初回のmpiの インストール時の設定に問題があったのかもしれません。以上。
192 :
デフォルトの名無しさん :2007/09/10(月) 01:30:38
MPIでJUnitみないなテストできんの? 知ってるひといたら教えてくれい
193 :
デフォルトの名無しさん :2007/09/12(水) 04:50:40
194 :
デフォルトの名無しさん :2007/09/23(日) 03:05:43
誰かまともなチュートリアル書いてくれよ
>>195 チュートリアル書きたいが
どんな機能があるのがよくわからん
>>199 すまねえ
193の虎の巻がほしかったんだ
203 :
デフォルトの名無しさん :2007/09/30(日) 21:15:53
もっぺん書くけどさ、 ま と も な チュートリアルが欲しいんだよ。
205 :
デフォルトの名無しさん :2007/10/01(月) 03:36:48
みんなここで勉強したのかえ?
207 :
デフォルトの名無しさん :2007/10/04(木) 21:05:22
203のチュートリアルを直そうと思うんだけどここにはっていいよね? どうせLGPLだし 204氏はどんなチュートリアルが欲しいんだい?
boostにmpi入るからそれでいいじゃん
209 :
デフォルトの名無しさん :2007/10/11(木) 00:03:40
210 :
デフォルトの名無しさん :2007/10/17(水) 09:58:07
>>209 使ってるよ
プログラミングの効率が上がった
作者は岩手大学の学生か?
212 :
デフォルトの名無しさん :2007/10/26(金) 21:09:07
AUTHORSにそう書いてあるね
213 :
デフォルトの名無しさん :2007/11/02(金) 21:07:27
CentOS5.0にrpmで入ってたOpenMPIを使ってます。
$ rpm -qa |grep mpi
openmpi-devel-1.1.1-5.el5
openmpi-libs-1.1.1-5.el5
openmpi-libs-1.1.1-5.el5
openmpi-1.1.1-5.el5
openmpi-devel-1.1.1-5.el5
手元にX86_64のPCが2台とi386のPCがあるのですが、
異種アーキテクチャのバイナリの自動選択はどうやってするのでしょうか?
全部i386で揃えろって意見もあるかもしれませんが、64bit整数演算をする
ので64bitで動かしたいんですよね。
mpichは出来るみたいですね。
http://enrico.phys.cmu.edu/QCDcluster/mpi/mpirun_mpich.html というかOpenMPIはman マニュアル無くて悲しい。
Debian 4.0 etch AMD64のマシンを2台用意してMPICHで環境を整えようとしています。 2台ともデュアルコアなので、 /etc/mpich/machines.LINUX に cluster1:2 cluster2:2 と記述しています。 テストを行おうと mpirun -np 4 cpi をしてみたのですが、1分以上待ってもプロンプトが帰ってきません。しかし mpirun -np 3 cpi とするとcluster1に2スレッド、cluster2に1スレッド割り当てられ計算結果がすぐ返ってきます? 4コア使い切るためにはどうしたら良いでしょうか?
215 :
213 :2007/11/07(水) 00:40:14
色々試したが諦めた。次はPVMを試そうと思う。
SuSE Linux9.3 mpich-1.2.7p1 gcc, pgi 7.1 を使用していますが、emacsでmpiデバッグできませんかね。 gdbとpgdbgを使ってデバッグできますが、 pgdbgは使いにくいし、gdb単体も使いにくいので、できれば emacsからgdbを起動したいなと。
PVMってまだ使われてるの?
218 :
213 :2007/11/07(水) 14:06:12
>>217 しらんけど、CentOSに標準でパッケージが入ってたよ。
>>213 ローカルマシンに同じ名前のディレクトリを作る。
そこに機種毎のバイナリを置く。
これで桶。
>>219 補足。
機種毎のバイナリは同じ名前で作っておく。
mpirunはデフォでは同じ名前のユーザーの同じ名前のディレクトリにある
同じ名前のコマンドを実行するだけなので。
>>218 標準で入ってるんだ
昔はPVMが主流だったそうだけど、今はほとんどがMPIだよね
222 :
213 :2007/11/08(木) 00:36:34
>>219 ありがとう。しかしPVMのマニュアルをせっかく読み始めたので
こっちで行ってみます。MPIは出鼻をくじかれたので気に入らない。
223 :
214 :2007/11/10(土) 21:37:30
/etc/mpich/machines.LINUX の localhost:2 cluster2:2 となっていたのを cluster1:2 cluster2:2 にしたらいけました。3スレッドはできるので machines.LINUXは悪くないと決め付けてました。
224 :
デフォルトの名無しさん :2007/12/12(水) 06:13:16
MPIの並列計算で困っています。アドバイスお願いいたします。 ・4CPU/共有メモリの計算機でMPIによる並列計算を行っています。 しかし ・この計算機の場合、計算実時間が1CPUで計算している場合よりも 大幅に増えてしまいます。 (大学の大型計算機等で計算した場合、計算実時間は4CPUの場合、 1CPUの1/3.4ぐらいに短縮されますのでプログラム的には問題ないと考えています。) ・top コマンドで計算状況を監視していると、使用CPUが変動し、しばしば 同じCPUを2つのスレッドで競合しているようです。 ・使用CPUの数をいろいろと変えてみましたが必ず競合してしまうようです。 ・従って時間計測コマンドでCPU時間を測定すると、 下記のようにCPU時間は短縮されているが、実時間は増えてしまうという結果になるようです。 real time 1000.0 user time 250.0 ・計算機を納品した会社(H○C systems)に質問したところ、 設定は問題はない。プログラムの問題、あるいは通信時間がかかってしまうので 実時間が増える、といういい加減な返答しかきません。 似たような症状を経験したことのある方、対処法をご存知でしたら 教えてもらえないでしょうか。
sched_setaffinity(2) を使うと幸せになれるかも。
>>224 MPICHならconfigure時に --mem=shared を付けて構築すべし
通信が共有メモリを介したものになる(異ノード間は当然sshやrsh経由)。
実行時に ps -x してsshやrshでプロセスが起動してたら、わざわざ同一計算機内でTCP/IP通信しちゃってるので損。
OSやコンパイラに付属のMPICHはsharedで構築されていない例が多いので自分で構築してみよう。
4CPU/共有メモリって、いわゆる普通のマルチプロセッサのことだよね 今時シングルコアはないから、2コアの2CPUなんだろう
228 :
デフォルトの名無しさん :2007/12/28(金) 20:38:39
みなさまご助言ありがとうございます。
>>225 検索すると状況としてはこれが当てはまる感じなのですが、
私には使い方がよく分かりません。
詳しいサイト等ありましたら教えてもらえないでしょうか。
>>226 確かにps x コマンドで確認すると(ノード内の場合でも)
rsh が動いていました。
このコンピュータはMPIのインストール及び設定済みのものを
購入したのですが、業者がいいかげんということなのでしょうか?
複数ノード構成なのですが、この場合はどうなのでしょうか
業者の説明では例えば、machinefile に
node00:2 とすればSMPとなるとのことでした。
node00 node00 とすれば通信が発生するとのことでした。
>>227 シングルコアのItanium2:4CPUx4ノードの構成です。
(年度でわけて増設して購入したのでちょっと古いCPUになっています)
納品されたのは1年以上前なのですが、不具合ばかりです。
229 :
225 :2007/12/29(土) 00:39:48
こんな感じ。 #include <mpi.h> #include <sched.h> #include <stdio.h> int main(int argc, char *argv[]) { int rank; cpu_set_t mask; double t; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); __CPU_ZERO(&mask); __CPU_SET(rank, &mask); if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { perror("Failed to set CPU affinity"); goto error; } t = MPI_Wtime(); while (MPI_Wtime() - t < 10 + rank * 5) ; MPI_Finalize(); return 0; error: MPI_Finalize(); return -1; }
230 :
225 :2007/12/29(土) 00:46:50
>>226 の書き込み見て、--with-comm=shared というオプションをつけてMPICHを
コンパイルしてみたんだけど、逆に遅くなりました。共有メモリのほうが早く
なると思うんですけど、どうしてだろう?
CPUは Core 2 Quad 2.4GHz を使っています。
232 :
デフォルトの名無しさん :2008/01/09(水) 01:43:00
GridMPIについて、質問です。 GridMPIのMPI関数は、通信先によって、リモートノードなら、IMPI、 自ノードなら自ノード内のMPI(ベンダMPIなど)を呼び出して通信 するはずですが、GridMPIが提供しているMPI関数と(自ノードの) ベンダMPIの関数のシンボルが重複しないのはなぜでしょう? (最初は、GridMPIから発行するベンダMPIの関数は、MPI関数では なく、PMPI関数と思っていましたが、これは違いますよね・・・)
233 :
デフォルトの名無しさん :2008/01/10(木) 00:07:05
MPICH1.2.5について質問です。 MPICHのブロードキャストはTCPを用いて行われているようなのですが、 UDPによるブロードキャストを使用することはできるのでしょうか? ご存知の方がいらっしゃれば、よろしくお願いします。
234 :
デフォルトの名無しさん :2008/01/11(金) 10:27:42
普段はPVMでプログラミングをしているのですが、MPIでは 1.スレーブ(MPIでもこういう表現するんですかね)のマシンに 計算領域を割り当てて計算させる ↓ 2.マスタに計算結果を返す ↓ 1と2を繰り返す という流れはどういう風にソース上で実現させているのでしょうか。
>>234 スレーブとか言いません。
全く同じプログラムが複数走ります。
主従はなく、皆平等です。
MPI_Comm_rank関数を呼び出すと自分のノード番号がわかるので、
その番号に応じた振舞いをするようにプログラムを書きます。
たとえば、0から100までの足し算を2台の計算機でするときに、
ノード番号0なら0から49まで、ノード番号1なら50から100まで計算するようにしておきます。
通信は送信したいノード番号に向けて送信し、受信したいノード番号を指定して受信します。
WindowsCCSでHPLのベンチ取りたいんだけど参考になるwebとかありませんか?
237 :
デフォルトの名無しさん :2008/01/13(日) 11:21:47
>>235 そうやるんですか
PVMで同じようにする方法がさっぱりわからんもんで
参考になるかな、とは考えたのですが・・・
PVMってまだ使われてるのか?
239 :
デフォルトの名無しさん :2008/02/07(木) 17:31:34
おーい、このスレ生きてますか? 質問です。 class base { ... }; class derived1: base{ ... }; class derived2: base{ ... }; があって、 vector<base*> v; にノード0で v.push_back(new derived1()); v.push_back(new derived2()); ... などとして配列を作ります。 で、作った物を他のノードに配信したいのですが、どうやれば良いでしょうか? newで生成したderived1などのオブジェクトも一緒に配信したいわけで、単純にvのバイト列を送れば良いというわけには行かないわけで。 実際にはderived1等にもnewしたオブジェクトのポインタが存在して、それも他のノードで再現したいわけで...
死んでます
241 :
239 :2008/02/07(木) 20:05:46
死んでるのかよ! って、まあ置いといて、STLのstringなんかもオブジェクトのバイナリ丸コピじゃだめなんだよな。 ヒープからバッファ取ってるから。 となると、シリアライズして送信、受信側で再構築なんだろうけど、正直面倒臭いな。
MPI_File_xxでテキストファイルは扱えないのでしょうか?
学科の演習用端末更新終わった〜 Linux / Cele 420 / MEM 2GB / 26台 /hdd less という構成なんだが、手軽に遊ばせるMPIのサンプルないかな? ちなみに、午後6時に強制shutdownの設定になってるので、 長くても8時間程度のジョブの奴を頼む。
MPIプログラムによってネットワークがどのくらい使用されているかは、どのようにしてわかりますか? 環境はFedora8+Intel C++ 10です。
Windows用のものはありませんか?
MPICHにWindows版があるyp!
247 :
デフォルトの名無しさん :2008/04/17(木) 17:12:34
プログラムをコンパイルし実行するとsignal 6というエラーが出るのですが、これはどのようなエラーなのでしょうか?
どっかでabort()してるんじゃないの
MPIにおけるシグナルの使い方は実装依存なのじゃ。 同じエラーが出るミニプログラムを作ってうp汁
NPACI Rocksつこうてる人おる? どこのスレいけばいいか解らんくて 迷子してる
計算の進行状況をファイルに書いてたのだが、 ファイルがバッファリングされる関係で リアルタイムで更新されないので、fflushを つっこんだら、計算時間が倍になったぞ。 こういうのは難しいなぁ。
>>251 NFSとかSambaでリモートのファイルシステムに書いてない?
ローカルの /tmp あたりに書くようにすると速くなるかも。
というか、頻繁に確認しない限りそんな遅くならないんじゃないの?
254 :
251 :2008/05/23(金) 00:45:22
>>252 リモートファイルシステムです。
多分それで速くなると思いますが/tmpとか勝手に
使ったら怒られそう。大学共同利用のシステムなんで。
>>253 かなり頻繁に更新してますた。数秒に1回ぐらい。
進行状況を書いてただけなので、flush頻度を1/100
にしたら速度がだいたい元に戻りました。
255 :
デフォルトの名無しさん :2008/05/23(金) 01:30:25
>>254 普通の大学の計算機センターならローカルディスクぐらい用意してるよ。
聞いてみな
256 :
251 :2008/05/24(土) 18:29:49
計算の進行状況をlogに書くってのも一歩間違うと大変な事になるな。
計算で64bit Intetgerを使って、桁あふれ(2^64)が起きたら
「SKIPしますた」とlogファイルに書いて次ぎのデータ処理に入る
ようにしてたんだ。
今まで深さ4の処理をしてたんだが桁あふれが起きてなかった。
次に深さ5の処理に入ったんだ。とたんに桁あふれが増えて
「SKIPしますた。」でdisk使用制限が超えそうになっちまった。
テラヤバスで、20時間実行したjobを強制停止…
>>255 いや、他大学システムなんで、あまりくだらない質問したく
なくて。利用料金も私が出したんじゃなくて、教授のだし。
MPICHのMPI_Finalizeって常時ポーリングしてんのかな? 処理が終ってFinalize待ちのプロセッサの負荷が100%になってやがる。 割り込み使ってくだちゃい。
負荷100%といえば、 rank=0のタスクをjobのマネージメントだけにつかって rank=1以降を計算に使うプログラムを書いた。 rank=0とrank=1以降でも大してCPU使用率がかわらん かった。rank=0のタスクはMPI_RECVで待機してただけ なんだがな。
MPIで複数のCPUを使って計算させたときに、計算の速さ(結果)を秒数などで表示する 何か良いプログラムは無いでしょうか? 姫野ベンチやHPLだと、結果がFLOPSでしかでないので分かりにくいと言われ 体感的(秒数なもの)にわかるものにしてほしいと(´・ω・`) 思いつく簡単なベンチマークを例であげると、例えばスーパーπの104万桁を2つのCPUで 計算した場合は○○秒かかったけど、4つだと○秒だったよ!という感じです。(ベンチマーク じゃなくてもいいです。) よろしくお願いします。
>>259 自分で秒数に戻せばいい。そもそも計算速度(flop/sec)というのは
計算速度=計算量÷計算時間
として求めている。
計算量(浮動小数点演算の回数)はプログラムによって決まる。
ベンチマークプログラムなら解説文書に計算量が書いてあるはず。
計算量と計算速度が分かれば当然ながら
計算時間=計算量÷計算速度
で秒数が分かる。
>>260 アドバイスありがとうございます!
なるほど!
そういう風に求めるのですね。
助かりましたm(__)m
262 :
デフォルトの名無しさん :2008/06/21(土) 10:55:46
time mpirun -np 3 aho & でいいじゃん。 各ノードごとの時間を知りたければ mpirun -np 3 time aho & でできるぜ
263 :
259 :2008/06/26(木) 17:15:29
>>262 timeを使えば計算時間分かりますね!
アドバイスありがとうございますm(__)m
すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで
高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体
の計算なので何を計算しているのかイメージが付きにくいんじゃないか?
と、言われまして何かイメージが付きやすいプログラムというのは無い
でしょうかね・・・?
すいません、変な質問をして(汗
>>263 計算結果を可視化するところまでやるとか。
でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
>>263 迷路。
ノードごとに探索経路を色分けすればぐー
266 :
259 :2008/06/27(金) 11:53:25
>>264 >計算結果を可視化するところまでやるとか。
>でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
そうなんですよね〜
分子力学のプログラムで計算結果を可視化できるものがあったんですが
リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。
>あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
>並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば
オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね!
アドバイスありがとうございますm(__)m
>>265 >迷路。
すいません。
迷路というのは迷路を解くと言う事でしょうか?
267 :
デフォルトの名無しさん :2008/08/22(金) 20:08:51
すいません MPI初心者です。 windowsでMPIを実行しようとしているんですけどエラーがでて困っています。 インクルドのパスは切っています。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした というエラーがでます。 なんで何でしょう。いきなり初期設定でつまずいて恥ずかしいのですが だれかアドバイスしていただけないでしょうか。
268 :
デフォルトの名無しさん :2008/08/23(土) 08:45:51
>>267 それで他人になにか状況が伝わるとでも?
269 :
デフォルトの名無しさん :2008/08/23(土) 18:49:31
C:Program Files\MPICH2\lib C:Program Files\MPICH2\include を追加する。 最低これでエラーはなくなるはずのに認識できない。 メッセージは同様。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした 絶対windowsで同様なエラーが出ている人がいるはず。 MPICH2はwindowsでは無理なのか?
270 :
デフォルトの名無しさん :2008/08/23(土) 21:20:54
>>269 それで他人になにか状況が伝わるとでも?
ソースくらい出せ。
コンパイルオプションくらい出せ
271 :
デフォルトの名無しさん :2008/08/23(土) 21:22:39
windowsでMPICH2は「余裕で」動いてる。
272 :
デフォルトの名無しさん :2008/08/24(日) 14:46:18
わかりました。 ウィザードで作った雛形をつかってコピしていたからみたいです。 空のディレクトリをしてしてファイル追加してみるとできました。 ご声援ありがとうございました。何の役にもたたなかったけど(w
273 :
デフォルトの名無しさん :2008/08/24(日) 20:32:38
>>272 何の役にも立たないのは、お前がなんら情報を出さないからだろ。
自分の低能を棚上げしてイヤミで〆か。
新打法がいいね。
274 :
デフォルトの名無しさん :2008/08/25(月) 17:29:10
>>273 野球していたが打てなかったので1本足打法に変えました。
するとよく打てるようになりました。
そして解説者に言われました。
新打法がいいね。
自分の考えを人間にすら伝えられないバカは 自分の考えをコンピュータに伝えられるわけがない。 プログラムなんてやめた方がいいよ。
276 :
デフォルトの名無しさん :2008/09/16(火) 08:21:40
OpenMPIってVistaじゃ使えないの?
277 :
デフォルトの名無しさん :2008/09/17(水) 03:03:50
なんか荒れてる…w MPICH2いれてBoostのMPI使おうかと思ったが うまくいかね using mpi ; をusr-config.jamに書いたが パスが通ってないと言われる… いい解説サイト知っていたら教えてくださいませ
278 :
デフォルトの名無しさん :2008/11/01(土) 04:35:50
MPI対応のFFTで、2次元の場合はタイル状に、3次元の場合はブロック状に、 データ分割可能なもの知りませんか? fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
279 :
デフォルトの名無しさん :2008/12/01(月) 12:33:58
ちょっと質問なんですが MPI_Sendrecvってペアじゃないと使えないですかね? 片方がMPI_Sendrecv もう一方がMPI_SendだけとかMPI_Recvだけとか。 わかる方いたらご教授願いたいのですが。
280 :
デフォルトの名無しさん :2008/12/04(木) 16:33:04
シングルノードWinXP-Proの環境で、MPICH2に付属ので例題cpi.exeを実行してみたら動きませんでした。 エラーメッセージは特になく、タスクマネージャで確認するとCPUコア数分のcpi.exeが実行中であるのが 確認できるのでが、強制終了する以外コントロールできない状況です。MPICH1ではうまくゆくのですが。 どなたかご教示のほうよろしくお願いします。
281 :
デフォルトの名無しさん :2009/01/13(火) 08:26:39
MPI初心者です。MPICH2をMacOSXにインストールしました。 とりあえず以下のコードを実行しました。 $ mpicc test.c $ mpiexec -n 3 ./a.out #include <stdio.h> #include "mpi.h" int main(int argc, char **argv){ int nprocs; int mype; int proc_name_len; char proc_name[40]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mype); MPI_Get_processor_name(proc_name, &proc_name_len); printf("My name is : %s\n", proc_name); MPI_Finalize(); } すると、結果は My name is : tetsuya-sato-macbook.local My name is : tetsuya-sato-macbook.local My name is : tetsuya-sato-macbook.local となりました。全処理が自分の端末で実行されてしまっているということでしょうか。環境設定がうまくいっていないのでしょうか。 一応、自分の端末からssh経由でログイン出来るLinux端末が10台あるので、自分の端末のホームディレクトリ配下に mpd.hostsファイルを作成してそれら10台のマシンのホスト名を記述しました。次に、自分の端末で $ cd ~/.ssh $ ssh-keygen -t rsa $ cp ida_rsa.pub authorized_keys2 としました。それから、このauthorized_keys2ファイルをsshでログイン出来るLinux端末10台の ~/.ssh/配下にSCPにてコピーしました。この先、何をやればよいでしょうか?
283 :
281 :2009/01/15(木) 03:39:43
>>282 有り難うございます。出来ました。
別の質問なのですが、以下のコードを実行すると、結果は順不同で出力されます。
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv){
int nprocs;
int mype;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &mype);
printf("proc番号は : %d\n", mype);
MPI_Finalize();
}
<結果>
proc番号は : 0
proc番号は : 2
proc番号は : 1
これを必ず昇順の0、1、2のランクの順に出力したい場合はどう修正すればよいでしょうか?
>>283 別々のプロセスが勝手に出力を出しているのでそうなる。
ノード0 出力が終わったらノード1に何か情報を送る
ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信
・・・
という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
286 :
281 :2009/01/16(金) 09:59:35
>>285 どっちか一冊買ってみます。
>>284 こんな感じにしたのですが、順番に出力されません。書き方、まずいでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char **argv){
int nprocs;
int mype;
int dummy;
int i;
int tag=0;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &mype);
for(i=0; i<nprocs-1; i++) {
if(mype==i) {
printf("My proc is : %d\n", mype);
MPI_Send(&mype, 1, MPI_INT, i+1, tag, MPI_COMM_WORLD);}
if(mype==i+1) {
MPI_Recv(&dummy, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);}
}
if(mype==(nprocs-1)) {
printf("My proc is : %d\n", mype);}
MPI_Finalize();}
<実行>
mpirun -np 5 -machinefile mpd.hosts ./a.out
287 :
デフォルトの名無しさん :2009/01/16(金) 11:11:50
>>286 それ、最終ノードが受信してなくね?
printf後にfflushするといいかも
それとループするより素直に
ノード0
表示
送信
ノード 1...n-1
受信
表示
送信
ノード n
受信
表示
でバラして書いた方が見やすいと思う。
同じコードをたくさん書きたくなければ、受信、送信のところを条件分けで囲ったものの間に共通の表示処理を入れるか。
288 :
デフォルトの名無しさん :2009/01/30(金) 11:49:31
One of the processes 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, be sure to include a "return 0" or "exit(0)" in your C code before exiting the application. PID 13373 failed on node n0 (1**.1**.**.10) due to signal 9. とエラーが出ます。 パック、アンパックを利用して、何度も送受信出来ているんですけど、 5000回程度繰り返したところでエラーがでます。 考えれる原因などありますか?
>>288 プログラムのどっかでreturn 0かexit(0)してんだろ
質問 コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が No such fileって言われるんだけどこれはどう解決すればいいですか?
MPIみたいな、少なくとも大学院クラスの人間が数値解析で使うもののスレにしては エスパーを要請する質問が多いな。 そんな表現能力じゃ論文もかけないだろ。
292 :
デフォルトの名無しさん :2009/02/02(月) 21:48:56
>>289 return 0はmain関数の一番最後でしかやってません。
>>292 signal9だからSIGKILLだ。
自分で殺してないんだったら、誰かにプロセス殺されてるんじゃないのか。
時間貸しのスパコンとかだったら、一定時間来たらプロセス殺されるぞ。
どうせおまえさんんが書いたコードのバグだと思うけど
とりあえずソースさらしなよ
それで解決するかどうかは分からんけど、
少なくとも
>>289 みたいなアホは湧かなくなるよ
295 :
. :2009/02/03(火) 16:56:38
>>290 エスパー回答だが、コンパイル時にmpiccを使ってないとか?
スパコンのバッチファイルって、QUEUEに投入後書き換えても 反映されるのかな? ちょいスクリプトのタイポして、書き換えたい のだが… 64CPUなのにSIZEの所に8と書いてしまった… 今の時期、QUEUEに順番待ちが多くて、再投入すると多分一週間後 になるんだ。 --------- cd ${QSUB_WORKDIR} SIZE=64 C=1 while [ ${C} -lt 10 ]; do echo -n STEP${C}: ; date mpiexec -n ${SIZE} ./a.out ${C} let C=C+1 done echo -n DONE: ; date ----------
298 :
294 :2009/02/05(木) 10:25:41
みなさん、丁寧にありがとうございます。 2chにソースはあげたくないので、メール頂けると助かります。
>>298 どうせ卒論だろ。研究室の先輩に聞けよ。
マスタープロセスの処理内でMPI_Bcastしたいのですが、無理でしょうか?例えば以下のようなコードがあった場合(あまり意味がないコードですが)、 マスタが"TERMINATE"をタグにつけて送るまでの間、スレーブは無限ループでメッセージを受信し続ける。その間、一定の処理毎にマスターとスレーブの プロセス間で同期を取らせたい。しかし、同期を取らせたい処理はマスタープロセスのif文内にあるので、実行しても効果はない。(つまり、(1)でBcastをやっても反映されない。勿論(2)は反映される)何かいい方法はありますか? (コードは途中省略) MPI_Datatype newtype; MPI_Type_contiguous(sizeof(struct abc), MPI_BYTE, &newtype); MPI_Type_commit(&newtype); int k, j, r; srand((unsigned)time(NULL)); r=rand()%10+1; if(mype==0) { for(j=0; j<100; j++) { for(k=0; k<r; k++) { MPI_Send(&kp[0], 1, newtype, 1, CONTINUE, MPI_COMM_WORLD); } //(1) MPI_Bcast(kp, 3, newtype, 0, MPI_COMM_WORLD); } MPI_Send(&kp[0], 1, newtype, 1, TERMINATE, MPI_COMM_WORLD); } if(mype==1) { do { MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &stat); if(stat.MPI_TAG==CONTINUE) { MPI_Recv(&kp[0], 1, newtype, 0, CONTINUE, MPI_COMM_WORLD, &stat); } } while(stat.MPI_TAG==CONTINUE); } //(2) MPI_Bcast(kp, 3, newtype, 0, MPI_COMM_WORLD);
http://arkouji.cocolog-nifty.com/blog/mpich2/index.html 概ね、ここに書いてあるようにやりました。
(使いたいのはfortranなのでfortranの設定は別にやっときました)
ここの一番下のサンプルコードをビルドしようとすると以下のエラーが出ます。
warning C4627: '#include "mpi.h"': プリコンパイル済みヘッダーの使用を検索中にスキップされました 行;1
warning C4627: '#include <iostream>': プリコンパイル済みヘッダーの使用を検索中にスキップされました 行;2
fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? 行:18
また、fortranのコードを自分で書いてビルドしようとすると、以下のようなエラーが出ます。
fatal error LNK1181: 入力ファイル 'mpilib.obj' を開けません。
どこが間違ってるんでしょうか?環境はvisual studio2008とvisual fortran11です。
303 :
302 :2009/03/11(水) 02:59:26
> 使いたいのはfortran > #include <iostream> > int main(int argc,char **argv) これのどこがFortran…
>>304 いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。
「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。
分かりにくくて申し訳ないです。
>>302 プロジェクトのプロパティの
Configuration Properties → C/C++ → Precompiled Headers → Create/Use Precompiled Header
を Not Using Precompiled Headers にすればいいと思われ。
(VC++ で C のプログラムをコンパイルするときによくハマる罠です。)
これは英語版の VC++ 2008 の表記だけど日本語版にも該当する項目があるはず。
307 :
302 :2009/03/12(木) 20:45:54
>>306 Cの方は出来ました!ありがとうございます。
正直、Linux入れてmpif77とかmpiccとかのラッピングされたコマンド使ったほうが楽だろ。 ライブラリが足りないとかそんな次元が自己解決できないようなら。 KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
>>307 動いて良かったね。Fortran の方は俺は使ったことないので単なる予想だけど
mpi.lib の点(ピリオド)が抜けてて mpilib → mpilib.obj と解釈されてるのでは。
あと mpi.lib と一緒に fmpich2.lib も要るかも。
>>308 普段 Windows で暮らしていると実行してデバッグできる MPICH2 for Win32 は
とっても便利ですよー。多少苦労しても使う価値があると思います。Windows
マシンはありふれているので手近の PC をかき集めて“なんちゃってクラスタ”を
作るといったことも案外簡単にできます。
>>308 もともと、リモートにlinuxが入っててmpiが使える計算機はあるんですが、ちょっと楽して
開発したかったので。情けない話ですがCUIは苦手なんで出来る限り避けてます…
と言おうと思ったらKNOPPIXってGUIなんですね。そんなのもあったんですね。
>>309 全ておっしゃるとおりでした。お恥ずかしいです。
後から僕のようなレベルの人がここに来た場合のために経過を書いときます。
mpi.libに直したところ、未解決のシンボル云々というエラーが出てきたので、
fmpich2.libを追加したらビルドが成功しました。その後、実行しようとすると、
mpiexec.exeが見つかりません、と出ました。C:\Program Files\MPICH2\bin\への
パスは通っているので、プロジェクトのプロパティ→コマンド のところにはmpiexec.exe
とだけ書いておいたんですが、念のためC:\Program Files\MPICH2\bin\mpiexec.exeと
フルパスにするとちゃんと動きました。パスが通ってても上の指定じゃだめなんですね。
ちなみにデバッグ無しで実行すると問題なく出来るけど、デバッグ開始を選択すると
デバッグ情報が見つからないか、または一致しませんってエラーが出ました。
要するにブレークポイントとか関数ウオッチとかあのあたりが使えないってことですかね。
もはやmpiの質問でも無さそうなんで、も少し調べてみることにします。
ところで参考までにお聞きしたいんですが、309さんはどういう環境で使ってらっしゃるんでしょうか?
311 :
302 :2009/03/13(金) 07:02:25
というかマニュアルに思い切りfortranの場合fmpich2.libを追加してね、と 書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
>>310 309ですが使っている環境は何の変哲もないですよ。
Windows XP に MPICH2 と Visual Studio 2008 Express Edition を入れてます(あと MinGW も)。
用途は数値シミュレーションで、Windows PC で小さな問題サイズで実行できるところまで作って、
Linux クラスタに移して大きな問題サイズで実行、実験データを採るというパタンが多いです。
クラスタの計算ノードはマルチコアなので OpenMP も併用しています。
最近書いたコードは、逐次、OpenMP 並列、MPI 並列、OpenMP + MPI ハイブリッド並列の
4つのバージョンを同じソースから条件コンパイルで生成できるようにしました。
VS 2008 EE では OpenMP をサポートしているので、MPICH2 と組み合わせることで
複数の並列化の方法を実際に試して性能のいいものを選ぶという芸当が Windows 上でもできます。(^^)
ああ、そうだ、Windows 上で実行できることのメリットを1つ思い出しました。
上述のコードは逐次プログラムとしてコンパイルしたときにはデバッグ用の GUI を表示して
操作できるようにしました。同じことは Linux クラスタから X の窓を飛ばすことで実現できますが
クラスタの計算ノードに X ライブラリが入っていなかったり Windows 側に X サーバが必要だったりで
何かと面倒です。かかる手間が少ないという点で Windows で実行できることに意味があると思いました。
MPI2のMPI_Put/MPI_Getを使いたいので早速簡単なコードを書いたのですが、思うように
動作しません。日本語の文献が極端に少ないので英語のサイトを見ながらやっているのですが、
サンプルコードが難しいものが多く理解出来ていません。まずはシンプルに、プロセス1の変数aを単純にプロセス0
の変数aにコピーしたいだけなのですが、MPI_Send/MPI_Recvを使わずにMPI_Getを使うにはどのように書けばいいでしょうか?
下のコードのどこがおかしいのかご指摘下さい。
ttp://www.dotup.org/uploda/www.dotup.org1347.c.html
314 :
313 :2009/03/14(土) 05:12:50
他んとこに聞いてみます
315 :
302 :2009/03/14(土) 18:05:44
>>312 ありがとうございます。
あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな…
OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに
してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで
これからは多少そのへんも自分で勉強してみます。
レス番号をまちがえました。316は
>>315 宛てです。
VS 2008 のExpress EditionはOpen MP非対応じゃなかたか。
320 :
デフォルトの名無しさん :2009/04/02(木) 20:54:42
初めまして、MPIを勉強中の者で、使用言語はGFORTRANを使っています。 メイン又はサブにMPI_INIT〜MPI_FINALIZE及び計算式を一括して含む場合は 問題なくプログラムは動きますが、メインにMPI_INIT〜MPI_SIZEを サブにMPI_SEND、MPI_RECV、MPI_BCAST等と計算式を分離した場合、 リンクはできますが、実行時OSがエラーを発行し動きません。 そこで’MPI_COMM_WORLD’をメインでラベルつきCOMMONで確保し サブに渡すと、OSからのエラーメッセージはなく実行は出来ますが、 今度は’MPI_COMM_WORLD’からINVARID DATA TYPEが発行され、 値が上手く通信できません。ご指導願います。
質問です。1〜300の分子のうち今、rank0が分子を1~100個目、rank1が101~205個目、 rank2が205~300個目の速度の計算を受け持ったとします。で、計算が終わった後、 自分が受け持った分の分子の速度をそれぞれ別の全てのプロセスに渡したいとします。 ちなみにそれぞれのプロセスが受け持つ個数も総数も計算中に変動するので、 それぞれのプロセスの最初の分子の番号をista_mol、もってる個数をnum_mol n個目の分子の速度をvel_mol(n)として、 do n=1,3 CALL MPI_BCAST(vel_mol(ista_mol),num_mol,MPI_REAL8,n,MPI_COMM_WORLD,IERR) end do とやらかすと、それぞれのプロセスが持っているista_mol,num_molの値が違うので絵 受信側と送信側のアドレスと要素数がずれて困ったことになりますね。 この場合、ista_mol(n),num_mol(n)とでもしてそれぞれ別の値として持たせて、 (ista_mol(1)にrank0の値を、ista_mol(2)にrank1の値を…) do n=1,3 CALL MPI_BCAST(vel_mol(ista_mol(n)),num_mol(n),MPI_REAL8,n,MPI_COMM_WORLD,IERR) end do とでもしないとダメなんでしょうか?どう考えてももっとスマートなやりかたが ありそうなんですがどうなんでしょうか?どなたか教えていただけませんか?
お答え頂き有難うございます。ただ、ほとんど基本的なサブルーチンしか使ってないので MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の 位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に 関してはこの通信の前に教えてやる必要があるということになるでしょうか?
なるほど、大体分かりました。mpi_allgathervを使う場合、 num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。 mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので 送信の開始アドレスをずらして指定して大丈夫なんですよね? それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか? あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが… キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
コード例を示したほうが良さげですね。こういう具合です。 int num_mol; // 各プロセスが持つ分子の数 double vel_mol[...]; // 分子の速度の配列。要素数は num_mol int recvbuf_num_mol[NUM_PROCS]; int displs_vel_mol[NUM_PROCS]; double recvbuf_vel_mol[TOTAL_NUM_MOL]; // 1. まず各プロセスが自分の num_mol を他のプロセスに送る // recvbuf_num_mol[i] にはランク i の num_mol が入る MPI_Allgather(&num_mol, 1, MPI_INT, recvbuf_num_mol, 1, MPI_INT, MPI_COMM_WORLD); // 2. recvbuf_num_mol から ALLGATHERV に必要な displs_vel_mol を作る count = 0; for (i = 0; i < NUM_PROCS; i++) { displs_vel_mol[i] = count; count = count + recv_num_mol[i]; } // 3. 上記 1. で得た recvbuf_num_mol と 2. で得た displs_vel_mol を使って // 各プロセスが自分の vel_mol (サイズ不定の配列) を他のプロセスに送る MPI_Allgatherv (vel_mol, num_mol, MPI_DOUBLE, recvbuf_vel_mol, recvbuf_num_mol, displs_vel_mol, MPI_DOUBLE, MPI_COMM_WORLD); マルチコアマシン1台で並列実行する場合は -machinefile オプションに与えるファイルに localhost:4 のように記述するか -machinefile オプションを使わずに mpirun -localonly 4 のように実行すると 良いような気がします。
あるある
328 :
デフォルトの名無しさん :2009/06/03(水) 17:15:01
PVMからMPIに鞍替えしようと思って勉強を始めようと思うのだが 今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
>>328 MPIの実装に依存するようなプログラムでも作る気かい?
330 :
お願いします :2009/06/18(木) 20:47:03
MPIでどうしてもわかりません。 f(x)=x*xの0~1の積分なんですが、答えが通常0.3333となるはずですが なぜ以下のプログラムだと違った答えがでるのでしょうか? すみません、どなたか教えていただけないでしょうか? ちなみにプログラムはよくあるMPI(倍風館)の本のものです。 実行すると0.000488のような値がでてきます。困っています。 どうやれば0.3333みたいな値を得ることができるでしょうか?
331 :
お願いします :2009/06/18(木) 20:53:12
#include <stdio.h> #include <mpi.h> main(int argc, char** argv) { int my_rank; /* カレントプロセスのランク */ int p; /* プロセスの数 */ float a = 0.0; /* 全積分区間の左端 */ float b = 1.0; /* 全積分区間の右端 */ int n = 1024; /* 台形の全個数 */ float h; /* 台形の底辺の長さ */ float local_a; /* 本プロセスの積分区間の左端 */ float local_b; /* 本プロセスの積分区間の右端 */ int local_n; /* 本プロセスの台形の数 */ float integral; /* 本プロセスの積分 */ float total; /* 全積分値 */ int source; /* 積分を送るプロセス */ int dest = 0; /* すべてのメッセージは0へ */
332 :
お願いします :2009/06/18(木) 20:53:55
int tag = 0; MPI_Status status; /* ローカルな積分を計算する */ float Trap(float local_a, float local_b, int local_n, float h); /* MPIの初期化 */ MPI_Init(&argc, &argv); /* カレントプロセスのランクを求める */ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* プロセスの数を求める */ MPI_Comm_size(MPI_COMM_WORLD, &p); h = (b-a)/n; /* hはすべてのプロセスで同じ */ local_n = n/p; /* したがって台形の数も同じ */ /* 各プロセスの積分区間の長さはlocal_n*hである。 */ /* 本区間は次から始まる */ local_a = a + my_rank*local_n*h; local_b = local_a + local_n*h; integral = Trap(local_a, local_b, local_n, h);
333 :
お願いします :2009/06/18(木) 20:54:39
/* 各プロセスの積分を加算する */ if (my_rank == 0) { total = integral; for (source = 1; source < p; source++) { MPI_Recv(&integral, 1, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); total = total + integral; } } else { MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD); } /* 結果のプリント */ if (my_rank == 0) { printf("With n = %d trapezoids, our estimate\n", n); printf("of the integral from %f to %f = %f\n", a, b, total); } /* MPIを閉じる */ MPI_Finalize(); } /* main */
334 :
お願いします :2009/06/18(木) 20:55:45
float Trap( float local_a /* 入力 */, float local_b /* 入力 */, int local_n /* 入力 */, float h /* 入力 */){ float integral; /* 積分値 */ float x; int i; float f(float x); /* 被積分関数 */ integral = (f(local_a) + f(local_b))/2.0; x = local_a; for (i = 1; i <= local_n-1; i++) { x = x + h; integral = integral + f(x); } integral = integral*h; return integral; } /* Trap */ float f(float x) { float return_val; /* f(x) を計算する */ /* return_val に計算結果を入れる */ return_val = x * x; return return_val; } /* f */
335 :
お願いします :2009/06/18(木) 20:57:04
まず各ノードのintegralを送信せずに表示してみろよ。 積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。 この程度のことくらいやってから他人に聞けば?
>>330 手元で実行してみたが
$ mpirun -np 2 ./a.out
With n = 1024 trapezoids, our estimate
of the integral from 0.000000 to 1.000000 = 0.333333
となったぞ。ハードウェアの構成は何だ?
338 :
お願いします :2009/06/19(金) 19:45:20
ありがとうございます。 PCクラスタ環境は Fujitsu PRIMERGY RS200 ×16台 Xeon 3.20GHz/L3:1MB ×2 2GBメモリ 146.8GB HDD ×2(RAID1利用のため実効はこの半分) 73GB HDD ×5(RAID5利用のため実効はこの4/5) こんな感じです。
339 :
お願いします :2009/06/19(金) 20:10:05
見直したんですがやっぱり出てくる答えは0.000488になって正しくないです。
>>339 だからよ、まずは積分単体が戻す答えを見て見ろっての。
どうせなにかの打ち間違いだろ。
341 :
デフォルトの名無しさん :2009/06/19(金) 21:04:22
MPIがおかしいと思うなら、そんな積分した答えじゃなく、1とか単純な値を送信しろよ。 自分で問題切り分ける意思がゼロだな。
本当にコピペしたコードそのままで打ち間違いが無いのなら、 まずはMPI部分を全部削って1CPUで動かしてみろよ。
343 :
お願いします :2009/06/20(土) 12:43:17
MPI部分なしでやれば0.333でます
344 :
デフォルトの名無しさん :2009/06/20(土) 18:44:42
Mac用のMPIはどこで手に入りますか?
MacにはOpenMPIが入っているが
346 :
デフォルトの名無しさん :2009/06/21(日) 07:22:30
通常のGigabitイーサネットとInfiniBandではMPIを使った際にどの程度差が出ますか? もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
>>346 自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、
InfiniBand環境でどれくらい改善するか、予測が付くだろう。
あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、
並列化効率がでない場合も多いので、この点も注意した方がいい。
348 :
デフォルトの名無しさん :2009/07/06(月) 06:59:07
MPIの本を読むとSendとReceiveって奇数ノードと偶数ノードそれぞれ順序を逆にして書かないとデッドロックが発生するようなのですが、 今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。 OSか何かに依存するのでしょうか?
MPI_SendとMPI_Recvは送受信が完了するまで戻ってきませんが。 MPIの仕様なのでOSには依存しません。 別に偶数ノードと奇数ノードとか関係ありません。 送信と受信が対になって実行されないといけないだけです。 ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、 別の関数で送受信が完了しているか確認をとる必要があります。
そういえば、標準モードでMPIが勝手にバッファリングモードを使用していたら対応する受信が起動ていなくても戻ってくるか。 そういう意味ではMPIの実装依存でデッドロックが起きていないということになるわな。
352 :
デフォルトの名無しさん :2009/07/07(火) 16:32:14
n 行 n 列 の整数二次元配列 A(i, j) のうち、i = 1 の成分 (A(1, 1), A(1, 2), A(1, 3), ..., A(1, n-1), A(1, n)) だけを j = 1 から m 個ローカルプロセスの B(j) に集めたいと思います。 そこで、mpi_gather を使って以下のように書いたのですが、 このままでは m/n 個しか B(j) に渡されないようなのです。 call mpi_gather(A(1, 1), m, mpi_integer, B(1), m, mpi_integer, 0, mpi_comm_world, ierr) fortran で書いていますので、この原因がメモリ上でのデータの 並び方(データがメモリ上で A(1, 1), A(2, 1), A(3, 1), ..., A(n, 1), A(1, 2), ... と並ぶ)なのだろうと思いますが、もし 飛び飛びでデータを選ぶ(j だけ m 個 ローカルに渡す)方法を ご存じでしたら教えて頂けないでしょうか? 初心的な質問ですみません。
354 :
デフォルトの名無しさん :2009/07/07(火) 20:32:32
>> 353 神様、仏様、353様! 早速お教え頂きありがとうございました。
355 :
デフォルトの名無しさん :2009/07/24(金) 16:46:11
MPICH2とOpenMPIを使い分ける基準ってなんなのだろう 構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
356 :
355 :2009/07/24(金) 16:49:25
ちなみに自分のはMac OS XなのでOpenMPIが標準で入っているそうですが (XgridもOpenMPIを通して使うそうですね) MPICH2のほうはどうなのか、ちと気になりましてw
357 :
デフォルトの名無しさん :2009/09/06(日) 10:48:01
mpif77 でコンパイルは出来るのですが、 実行時 に mpirun -np 4 tttt と入力すると error while loading shared libraries : libompi_f77.so.o cannot open云々 となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
>>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 だとファイル名が違うかも知れない。
359 :
デフォルトの名無しさん :2009/09/06(日) 13:37:28
サンプルプログラムを実行することができました。有難うございます
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 ってやって使っても問題ないでしょうか?
好きにせぇや
すいません、Visual studioのスレで聞いたんですが、
こっちで聞いた方が良いとのことでこっちにきました。
Visual studio2008+MPICH2+ifortranを使ってます。
ブレークポイントやステップ実行などが使いたいのですが、
デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。
http://msdn.microsoft.com/ja-jp/library/ms164731.aspx 上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、
デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、
また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています)
ちなみにデバッグなしで開始なら問題なく実行できますが…
今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、
さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、
どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって
足りない情報などあればご指摘ください。
>>362 VSスレの方がいいんじゃねーかな。
windowsでMPI使う物好きは少ないと思うし。
つーか、モロにVSの使い方だし。
質問です。fortranで配列の要素数をプロセス数に応じて決めたいのですが、 どのように宣言したらよいのでしょうか?allocateを使うしかないでしょうか? 77では無理ですか?
365 :
デフォルトの名無しさん :2009/10/14(水) 11:12:10
call mpiplay(n) subroutine mpiplay(n) real data(n) とか、かな。Initializeやfinalizeはメイン階層でしてね。 もっとも今は77とそれ以降を混ぜて書いても解釈してくれるから allocate でがんがんやっても良いと思うけど。
>>365 なるほど。動的配列を使うまでもなくそれでいいのですか。
ありがとうございます。もう一つお聞きしたいのですが、
メインでもその配列を使いたいときはどうすればよいでしょう?
rank等の取得の前に宣言部が来るのでそのやり方では出来ないでしょうか?
ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
367 :
365 :2009/10/15(木) 05:59:50
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)階層ですることになるね。
368 :
デフォルトの名無しさん :2009/10/15(木) 06:29:09
そんなわけで、fortran77コンパチで且つ前もって配列サイズを決めなくて良い、というのは できるけど。めんどいよねw. 自分自身はコマンドラインの引数を使いたい、 計算コード自身は77で書いてしまった、の2つの理由で メイン階層のWrapperをCでつくる事が多いけど。上の例は良くつかう。 やはり、というか配列サイズが前もって決まっていないタイプのコードは 最適化が抑制されるのか、遅いね。まあいちいちコード編集&コンパイルの 手間がかからないから楽といえば楽だけど。
369 :
デフォルトの名無しさん :2009/10/15(木) 06:37:31
だらだら書いてしまったけど・・・・
>>366 ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
にYes!と書けば終わりだったな・・・・w
早起きはするものではないね。
>>369 いえ、結構怪しかったんで具体的に書いてもらって助かります。
丁寧に教えてくれてありがとう。
すみません、もう一つ質問なんですが、 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まで) 基本的に通信回数は減らした方がパフォは上がるという認識で良いですよね?
・・・ラグランジュ法的な粒子なのね。 隣接関係(最近接の粒子番地)がころころかわるから厄介そう。 前半最後の2行が王道だとおもう。型の同じ変数は一つの配列名のに付けてから一度に送受信。 いっそ、最初からvelpos(6,m)みたいに位置や速度の情報を一つの大きめの配列にまとめちゃう方が いいかもね。vi(m) とか sed だと、 1,$s/pos(1/velposi(4/g 1,$s/pos(m/velposi(3+m/g みたいな感じでわりと一括置換が効きやすそうだし。 ・・・・・恐いけどw
>>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とかの話あまり分かりません。
でもそれで置換出来るならプログラム書く効率あがりそうですね。覚えた方がいいと思いつつ…
統合環境がそういう複雑な置換装備してくれたらいいのにな。甘えすぎですか。
>>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
第一添字(右端) ↓ 第一添字(左端)
376 :
デフォルトの名無しさん :2009/10/20(火) 06:46:25
インテルコンパイラだけど、MPI使うには、インテルの売ってるやつを使わないといけないの?
何でもええ。 ライブラリがリンクできれば。
MPI はコンパイラもだけど mpirun がないと。 自宅で文法チェックするだけなら -I -L
max plunk institute !
>>374 遅くなったけど本当にどうもありがとう。うまくできました。
ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで
3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?
最近HyperThreading対応の4coreのCPUが家庭向けの値段まで落ちてきたので 購入したのだが、ここまでスレッド数が多くなるとメモリ帯域か何かが溢れて 評価しないと使えないな。 同じプログラムが、 Pentium4 2.8GHz(1core * 2スレッド)ではMPIで2プロセス走らせると1.6倍ぐらい速くなったけど、 Corei7-860(4core * 2スレッド)ではMPIで8プロセス走らせると4プロセスに比べて0.9倍 ぐらいに遅くなったよ。
382 :
デフォルトの名無しさん :2009/10/26(月) 06:36:28
core i7か・・・いいな。このお金持ちめw いくらだった? 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? 職場での印象では mpirun がメモリアクセスのスケジューリングを うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。 やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。 ・・・・OpenMPだともう少しマシな数字がでてくるのかな?
>>381 CPU とプロセス(またはスレッド)のアフィニティはどうしてる?
プロセス数が多くなればなるほど、きっちり固定してやらないと
パフォーマンス低下の原因になる希ガス。
384 :
382 :2009/10/26(月) 07:00:00
OpenMPはデフォだとうろうろするのは知ってたけど。 MPIも固定しないのか・・・知らんかった・・・。
windowsだとOSがウロウロさせるんだけど。 高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。 LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
386 :
381 :2009/10/26(月) 23:47:19
ふと4とか8プロセスとかとか切りのよい数字じゃなくて5とか6プロセスで 実行したらどうなるんだろうと思った。 現在1〜8プロセスの全てのパターンをベンチ中。多分終わるのは明日。 > core i7か・・・いいな。このお金持ちめw いくらだった? 再利用などしたので、マザボとメモリとCPUしか買ってませんが、46,675円 > 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? そういう事です。 > CPU とプロセス(またはスレッド)のアフィニティはどうしてる? そのあたり詳しくないのでほとんど設定変更せず使ってます。 ちなみにOpenMPI/CentOS5.4です。
Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。 マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、 マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
388 :
デフォルトの名無しさん :2009/10/28(水) 02:43:34
Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?
HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。 アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、 コア間で依存性があった場合は注意が必要だと思う。 HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。 ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
>>384 そりゃそうでしょ。MPIだってコアの指定をしないとだめ。
もちろんPthreadでも。
いわれるとそりゃそうだわ、なんだけど 383のを見るまで気づかんかったw OpenMPだと dplace や taskset で固定できるけど、 これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?
392 :
381 :2009/10/28(水) 21:52:47
>>386 悪禁になってしまったのだが結果だけかくと
5プロセスで走らせると最速のようです
>>392 それだとメモリアクセスが一番のボトルネックじゃない?
ちょうど5コアでいい感じでメモリ帯域を食ってくれて、それ以下だと使い切れなくて、
それ以上だといっぱいになってしまう。
という感じに思える。
394 :
デフォルトの名無しさん :2009/10/29(木) 03:41:16
そんな感じっぽいね。381氏の実験に感謝。 最近はベクトル化を意識してループを短くして,(メモリでかくなったから)配列に中間結果を格納して・・・ というのがスパコンでは流行、というか推奨されるけど、HTでは ループ内での処理が冗長なベクトル化をあまり意識してないw古いタイプの コードが並列化では利得が大きいかも・・という事なのかな。 いまはCacheも大きいからたいがいループ内が長くても収まるし。
395 :
デフォルトの名無しさん :2009/12/04(金) 22:16:21
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...の メッセージが表示されますが、何故か原因が解らないのです。よろしくお願いします。
>>395 サブルーチンMAINSUBの中でmpif.hのインクルードしてる?
397 :
デフォルトの名無しさん :2009/12/05(土) 07:53:23
395 ですがやっていません。やってみます。
398 :
デフォルトの名無しさん :2009/12/05(土) 08:04:52
395 ですが、動きました。どうも有難うございます。
399 :
デフォルトの名無しさん :2009/12/12(土) 13:25:37
WindowsでMPIをつこうたプログラムをコンパイルしたいのですが、 Windows XP+Vistal C++ 2008 Express以外に、どれをインストールすればよいのでしょうか?
MPICH
401 :
デフォルトの名無しさん :2009/12/20(日) 02:28:58
MPIってユーザーグループの会とか友の会とかないんですかね?? もしなかったら作ってみたいなっと思いまして.2ヶ月に一度くらい勉強会とかライトニングトークしあう的な規模のもので.
あんなもん、一旦意味がわかればマニュアル見るだけでOKなので 2ヶ月に一度とかタルいことしてたら、次の勉強会までにプログラムできるようになっている。 てか、それでできない人間だけ集まっても意味ないし、できる人間は参加してもタルいだけだろう。
プログラムのほとんどを1スレッドで走らせ、一部を並列計算させたい場合、 その一部以外を if(myrank==0) で囲えばいいの?
404 :
デフォルトの名無しさん :2009/12/20(日) 13:09:48
うん、たいていそれでいいよ。 非並列処理部分の結果を並列部分で使いたい時だったら ちゃんと伝達するのを忘れないように><
ですよね なんとなく「プログラムのほとんどが if 文」ってのが違和感なんだけど 他に書き方ないよね
そうそう、なんかif (myrank .....が冗長に出てくるのがなんかイヤw 並列の出入口でやることが決まっていれば関数に押し込めるけど、そういう事ってあまり多くないし 引数受渡し部分でちょんぼすることあるし・・・><
407 :
デフォルトの名無しさん :2009/12/23(水) 09:49:25
現在勉強中で、Send、Recvを使って簡単なプログラムを作って動かしていますが、送るデータの個数が 500以下だと問題なく送受でき、送受結果を画面に表示できるのですが、500個を超えると送受結果が 画面に表示できません。プログラムが暴走したような状態になってしまうんです。 データの型は倍精度浮動小数点なんですが、解決策は無いでしょうか?使用している mpiは openmpiです。
408 :
デフォルトの名無しさん :2009/12/23(水) 10:52:26
受信側のメモリを確保しているのかと3秒問いつめたい
409 :
デフォルトの名無しさん :2009/12/23(水) 12:40:54
407ですが、受け側でも送り側と同じ配列だけメモリーは設定しております。 当初は配列をアロケートしていましたが、疑問に思い、配列を設定して 再コンパイルして実行しても同じなんですが。
他人に自分の意志を伝えられない奴が コンピュータに自分の意志を伝えるプログラミングができるわけがない。 ソースもなしに・・・エスパーも求もと書いとけ。
openfabrics.orgがつながらない、、、
412 :
デフォルトの名無しさん :2009/12/28(月) 22:57:30
先日、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でも同様なんですが、どうやった良いのか原因も何も解りません。どうかご指導ください
413 :
デフォルトの名無しさん :2009/12/28(月) 23:06:52
失礼しました、 Scatterで...,b(1),20,の後にMPI_DOUBLE_Precision,を書き漏らしております。 質問時の記入ミスです。すみません。
414 :
デフォルトの名無しさん :2010/01/06(水) 09:09:27
これで出力が出ます。 それと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
415 :
デフォルトの名無しさん :2010/02/08(月) 17:39:36
PCだと大丈夫なんですが、大規模な計算機にジョブを投げたとき、 あるプロセスからの出力だけ途中で止まることがあります。 PCはintel fortran+mpich、大規模計算機はPGIfortran+Voltaire MPIです。 例えばプロセスごとにoutput00,output01,output02,output03のように 別のファイルに出力させているんですが、何かの拍子にいくつかが出力 されなくなったりします。ループの途中にbcastやbarrier等の同期があるので、 出力がないプロセスも計算そのものが停止しているということはないと思うのですが、 別のファイルや標準出力への出力も停止するのでうまく調べきれず、定かではありません。 かなり情報が少なくて申し訳ないのですが、考えうる原因、調査法、解決法もしくは それに至らなくとも何か思いついたことでもあれば教えて頂けませんか?
>>415 2桁のファイル名を決める整数が
違うプロセスで同じ整数になっちゃって・・・とか
とびとびになってしまって、とかは無いのかな?
PCとスパコンで違う並列数でやっておかしくなったのなら
同じ並列数(2とかw)でやってテストしてみては?
CPUが自分のプロセス番号(例題でよく変数名Myrankになるやつ)
を決める部分のチェックとかもやるといいかも。
とあるシステムでちゃんと動いてるので415さんのMPIの
(データ転送とかの)部分にミスがあるとは考えにくい、
という推定からすると他にはあまり思いつかないな。
>>415 ノードローカルのディスクに書いてるとかいうオチならブチキレ
でもたいていのシステムではジョブ終了時に一箇所にまとめるから 少なくともジョブ終了後にユーザーがファイルを移動する操作を する必要は無いような気もするけど・・・・ その可能性は大いにあるね。
419 :
デフォルトの名無しさん :2010/02/10(水) 18:08:04
問題のプロセスはファイル出力はせずに計算はちゃんと終了してるの? mpi_finalizeを実行せずに終了してるのでは?
MPI_Finalizeとファイル出力はなんも関係ない
MPI_Finalizeとファイル出力はなんも関係ない => MPIとファイル出力はなんも関係ない => このスレとファイル出力はなんも関係ない
アホかいな MPI_Finalizeしなくても、ファイル出力していればファイルはできてるし、ジョブが死ぬときにファイルがクローズされるからそのときにフラッシュされるわけで MPI_Finalizeしないことがファイルができないこととは無関係だっつってんだよ。
LAM/MPIか何かでMPI_Finalizeを呼ばずにプログラムの実行を終了すると 次回以降のプログラムの実行がおかしくなることがあった希ガス。 確かlambootし直すと正しく実行できるようになったから、裏方のプロセスが 狂ったんだろうな。そういう状況ではファイル入出力が一部おかしくなっても 不思議ではない。
標準入出力はともかく、ファイル入出力をリダイレクトなんかしてませんよ。 途中でプロセスを頃したらmpichでもおかしくなることがあるが、あくまで通信に失敗すると言う次元のおかしくなり方だから。
Finalizeを指定しなかったために通信がおかしくなって、 それによってプログラムの動き(例えば通信結果によってif文の判定を行っている)が変り、 ファイルへの書き出し部分を通過しなくなったというのは?
先に他のジョブが終わるってこと? つーか、その程度のミスならPCでマトモに動くとは思えないけど。
他のジョブとは関係なく、 一つのジョブで、MPI_Finalizeを指定しないで終了するプロセスがあると 通信がおかしくなることがあったと思う。
>>428 メインプロセスがチャイルドプロセスを立ち上げる。
実装によるが、そのとき引数にチャイルドプロセスの情報を加える。
MPI_Initでargc, argvが要求されるのはそのため。
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って言われました どうすればいいの?
>>430 MPIの前にCの勉強をしろカス
といいたいところだが親切な俺様が教えてやろう
C89, C++では動的配列は使えない。
mallocかnewで確保汁!
432 :
デフォルトの名無しさん :2010/03/20(土) 18:01:31
三次元空間での拡散方程式の解法でお薦めのものを教えてください。 格子は150x150x150で、線形の拡散方程式です。
433 :
デフォルトの名無しさん :2010/03/24(水) 06:27:04
自分で作るw ・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。 MPI版あったような・・・気がする。気がする、ばかりでなんだが。 それを元にして、というのも。 ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
434 :
デフォルトの名無しさん :2010/03/24(水) 10:20:58
コンパイルオプションで倍精度を指定した場合ってmpiの関数が送受信する データはどうなりますか?書き換えが必要ですか?
>>434 Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、
自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って
そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど
・・・・忘れたwときがイヤなのであまり満足していない。
プリプロセスもクレバーに使えばコンパイル時に
とあるオプションが使われたときにだけONになるように出来るハズだけど
使い方がいまいちわからんw
この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても
しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
面倒くさいのでMPI_BYTEで送ってる。 個数を配列の長さ*sizeof(TYPE)にして。 fortranでこんなことができるか知らんけど。 エンディアンがあってないと大変なことになるが気にしない。
437 :
435 :2010/03/25(木) 03:25:12
賢者あらわる。なるほど。ためしに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 は単精度か倍精度かの判定用のダミー、のつもり。 値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
438 :
434 :2010/03/26(金) 17:48:06
>>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)
439 :
436 :2010/03/26(金) 19:38:08
俺がやってるのは
double a[N];
MPI_Send(... N, MPI_DOUBLE, ...)
の代わりに
MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...)
なんだが。
これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。
>>437 だと新しい型を増やす度に条件分岐が増える。
> MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...) なるほど!
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
442 :
デフォルトの名無しさん :2010/04/04(日) 09:08:14
ダグ番号って例題だと0だけど、複数の通信がシステム全体で走ってるときも0でいいのかな? ・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、 同じタグ番号でも困らないような気はするけど。
443 :
デフォルトの名無しさん :2010/04/14(水) 10:18:20
ubuntu9.10にOpenMPIをapt-getでインストールしました 。 インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか? 何か設定で切り替える方法があれば教えてください
windows版のmpichはmingw gccでもリンクできるからgccで作った方が早い。 mpi自体の設定もLinuxの方が簡単。
最近勉強を始めました。
並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。
とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか?
http://codepad.org/13tw3pKS アドバイスお願いします。
448 :
デフォルトの名無しさん :2010/04/30(金) 06:33:21
$200
449 :
デフォルトの名無しさん :2010/05/10(月) 05:36:11
OpenMPIとMPICH、どちらをインストールしたらよいのでしょうか それぞれの利点欠点を教えてください
450 :
デフォルトの名無しさん :2010/06/12(土) 19:14:06
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 &
>>450 メッセージに書かれている通りのことをやればいいだけ
452 :
デフォルトの名無しさん :2010/06/13(日) 04:24:41
>>451 ありがとうございました。確かに入力用にこれを指定すると出なくなりました。
しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、
このようにしたのですが、それはマルチノードの設定の問題でしょうか。
何をやったらどんなエラーが出たのか書けよ
PhenomII x6 1090Tを3.2GHzから4GHzにOCして、MPIでバカ並列の数値計算 プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。 殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、 計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。 ふと、OCやめて定格に戻したら、まともな速度が出るようになった。 なんてこった。どうやらOCで逆に遅くなる事があるようだ。 OCする場合とOCしないときと速度比較してみる価値あるかもよ。
MPI使った計算なんて遊びじゃないんだからOCなんて普通しねーっての
まぁそうだな。奇特な人向けの情報です。
遊びじゃないのにOCするのってダメなのかな 通常のOCのリスク(熱・故障等)以外に、結果が狂うとかある?
>>457 狂った事あるよ。
デカイファイルが出力されるプログラムを実行させてたときに
./a.out | gzip > out.txt.gz
とかやってたんだが、out.txt.gz をgzip -d で解凍させたら壊れて
ますとエラーが出たので気が付いた。OCでgzipがまともに動作し
なかった模様。多分計算結果も壊れてたんだろうな。
てかgzipで圧縮してなかったら計算結果が壊れてる事に気がついて
なかった罠。
いやしかし、そろそろMPIに厳しい時期になりましたなぁ。 そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている から1100Wの電熱器付けているようなもんだからなぁ。
>>459 台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w
(一台あたりの話)
作業配列をunsignedからunsigned charにしただけで、1.2倍。
昔のCPUは1byteアクセスはペナルティ高かったような…
PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
コンパイラや最適化の影響があるかも知れない。 単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
462 :
460 :2010/07/10(土) 23:39:18
>>461 単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。
CPUがPhenom II 945だしインテルコンパイラーつかえねー
463 :
460 :2010/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
464 :
デフォルトの名無しさん :2010/07/14(水) 03:12:44
>>458 そんなこともあるんですか
あまり欲張らないでおこう
MPIを使わずに馬鹿並列をする簡単なフレームワークないですかね? MPIをインストールするのめどい。 やって欲しい事は、32coreのマシンと、数千個のファイルがある。 .a.outにこのファイルを一つづつ渡して実行してほしい。処理が終 わったら続いてファイルを渡して処理をして欲しい。同時に32個 のa.outを実行しつつ、処理が終わったa.outがあったら残りの ファイルをa.outで処理してほしい。
↑ それぞれのa.outは処理時間が一定ではありません。
妥当なところは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); } 結構適当に書いたけど、こんな感じ?
ありがとうございます。OpenMPでそんな事ができるんですね。 gccも4系はサポートしているみたいですので、試してみます。
470 :
デフォルトの名無しさん :2010/09/12(日) 06:01:26
465-466 で処理量が一定でないとの事だから、
>>467 さんの schedule(dynamic,1)
は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。
頑張ってね〜。
MPI導入の話なのですが… MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。 日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
472 :
デフォルトの名無しさん :2010/10/12(火) 03:47:24
MPIでコンパイルしているかどうかをコンパイル中に#ifdefで判別したいのですが、 どれがdefineされているかを調べれば良いのでしょうか?
473 :
デフォルトの名無しさん :2010/10/22(金) 10:35:24
Ubuntuでintelコンパイラを使ってMPIプログラムをコンパイルしたいのですが、 apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する 方法がわかりません。 やり方を教えてください
476 :
デフォルトの名無しさん :2010/11/11(木) 06:38:52
ご存知の方教えてください。 MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか? よろしくお願いします。
なんか答えにくい質問だなぁ・・ たとえば x86 なCPU で linux 上で、とかなら .o ファイルかき集めて最後にリンクできて・・なら、 たぶんだけど意図したとおりに動くんじゃないかな? コードはあげないけど中間ファイルならあげるよ、という人たちから いろいろもらって一まとめで使う、とかなの?
478 :
デフォルトの名無しさん :2010/11/12(金) 14:02:34
>>477 すみません質問がいい加減すぎました。
ノード1がCygwinでgcc_4.3.4を使っていて、
ノード2がUbuntuでgcc_4.4.4を使っています。
CPUはともにx86系です。
このようなときに、
MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。
よろしくお願いします。
mpirun mpiexec の気分次第w まあ、動くかと。 gcc と intel は割と相性イイから インテルも混ぜてあげよう
480 :
デフォルトの名無しさん :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 を入れました。
482 :
デフォルトの名無しさん :2011/01/26(水) 19:07:42
行列行列積のやり方が全くわかりません A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。 Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。 行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。 誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
483 :
デフォルトの名無しさん :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 ---
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 とエラーが出てしまい実行出来ません。検索しても有効な解決策が見つかりませんでした。 どなたか解決策を教えていただけないでしょうか?
Intel mpi(impi)使ってる人います? 自分でコンパイルしたのより速い?
そりゃ人間がコンパイルするより速いだろ
機械語直打ちw やだな・・・罰ゲームだ
>>486 ,487
そんなくだらない煽りが来るとは思わなかった.
mpichってconfigure makeしません?
数値計算メインで使ってるなら,
効率考えて,コンパイラ変えたりするでしょ.
mpi関係ないコンパイラの速度って,
icc>1.1倍>gcc4
>>1 .8倍>>gcc3
ぐらいのイメージなんで,(Linux x86_64)
ifortやiccでmpichコンパイルしたのとどっちが早いかな
と思ったんですが.
impiだと,
mpicc -cc=icc
て出来ることがわかったので,自己解決しました.
>>481 環境変数はbash_profileのほうがふつうじゃない?
>>484 mpd立てた?
listenportの設定は適切?
付属のサンプルプログラムは流れた?
>>488 「自分でコンパイル」に該当する環境をきちんと定義しないからさ。
コンパイラは?gcc?icc?それ以外?
mpiライブラリは?計算内容は?
まぁどれにしてもmpiコンパイラって基本的に適当なライブラリをくっつけて
ビルドするスクリプトだから、実際やってる内容を出力するオプションあるし
それで1つ1つ確認すればいいんじゃない?
>>490 回答ありがとう.たしかにあやふやな質問だったと思う.
偏見かもしれんが,まともなwindowsクラスタってあるの?
数値計算を32bitで行うのは論外でしょ.
でIntel Compilerを入れる時点で,アーキテクチャほぼ決まると思いますが.
impiのデフォルトコンパイラはgcc&gfortranです.
mpiライブラリの意味がわからん.
impiの前はmpichを使ってた.(これで回答になっている?)
計算内容は有限差分とモンテカルロ.
続く
>>490 続き
適当なライブラリが-lmpi -lpthread -lmとかを言っているなら,
libmpiをコンパイルする必要があると思いますが.
このライブラリをIntelがチューニングしてくれたら,
自分でコンパイルするより早いでしょうし.
デフォルトのgccとかでやられてたら,
自分でコンパイルしたほうが速そうじゃない?
実際やってる内容ってのは,mpiccやmpifcのスクリプトの中身のこと?
それとも別の何かを指しているの?
493 :
デフォルトの名無しさん :2011/08/28(日) 05:28:03.47
ブロードキャストってネットワークの送受信量を減らすことができるのですか? それとも単に便利なだけというだけなのでしょうか?
MPIってテキストからデータ読み込んだ時に、 MPI_SendやMPI_Recvを使って送受信可能にするためには変換が必要だったりしますか? double型のデータなんですが。
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
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次元座標的には読みにくい入力データが必要。
497 :
495 :2011/09/04(日) 09:45:19.22
>>496 さんの言った通り直しても通りませんでした…。
正直自分の知識じゃ限界を感じているので
代わりにやってくれる方がいれば報酬払ってもいいです。
最大2万円までしか出せませんが…。メール待ってます。
498 :
デフォルトの名無しさん :2011/11/15(火) 11:36:05.43
openmpi使ってるんだがnohupが効かねぇ・・・ 端末PC落とすと計算やめちゃうんだが
499 :
デフォルトの名無しさん :2011/11/19(土) 16:31:12.60
へえ
500 :
デフォルトの名無しさん :2011/11/24(木) 19:56:37.29
MPIの勉強始めようと思うんだけどMPI3ってのはまだ出てないの?
501 :
デフォルトの名無しさん :2012/05/16(水) 14:34:19.07
OpemMPとの違いを教えてください
MPI 妖精がいっぱい同時に働く。 拍子を合わせそこなうと、ぐだぐだ。 プログラムは最初から並列前提で書く方が いいかもしてない。非並列からの移行は面倒臭い。 OpenMP 手がいっぱいある妖精が独りで頑張る。 並列化はかなり楽。 混在できるけどね。 gfortran とか無料コンパイラがOpenMPに 対応しているし、マルチコアCPUが 普通になってきた今日、 小規模から中規模ならOpenMPがオススメ。 大規模スパコン使う可能性があるなら、 MPI で最初から組むべし。
503 :
デフォルトの名無しさん :2012/06/21(木) 09:40:29.85
MPIにおすすめのスイッチングハブを教えてください
504 :
デフォルトの名無しさん :2012/08/03(金) 08:01:03.03
LANポートにあきがあるならノードでリングベース組むのが勉強になるで 俺は混在は結構ありだとおもうで クラスタとかなら通信時間削減が期待できる
506 :
デフォルトの名無しさん :2012/11/23(金) 18:27:19.04
gigabit ethernetからInfiniBandに変えた場合のベンチマーク結果とかありますか? アプリケーションにも依るとは思うのですが、ある程度、どのくらい向上するのか知りたいのですが ♪∧,,∧ ♪∧,,∧・ ω・) ∧,,∧・ ω・) )っ (・ ω・) )っ__フ (っ )っ__フ(_/彡 ( __フ(_/彡 (_/彡♪
www.science-academy.jp/showcase/11/pdf/P-108_showcase2012.pdf ↑こいつとか、国泰寺高校もそうだけど、学生でもこういうMPIのシステムを構築できる時代なんだな。 ただ、それゆえに性能測定しかしていない。 テーマを持たないと意味ないよな。 それに関して指導できる教師が高校にいるものだろうか?
動的に確保する要素を含む構造体のデータタイプを作るにはどうしたらいいのでしょうか。 int MPI_Type_struct(int count, int blocklens[], MPI_Aint indices[], MPI_Datatype old_types[], MPI_Datatype *newtype) のMPI_Aint indices[]のアドレス計算部分で構造体の動的に確保した要素のせいで アドレスが一部分に固まってないのでよくわかりません。
>>508 要素を一つずつ配布するしかないんじゃないか
多体問題とか計算させて可視化とか ありきたりだけどインパクトはあるよね そんなに難しくないし
みなさんI/O(特に出力)はどうしてますか? netCDFとかやんないといけないんですかね
初めてMPIプログラムをしたのですが、しばらく動いた後に何回も通っている MPI::COMM_WORLD.Isend で Segmentation fault が出てしまいます。 Debian(wheezy)の OpenMPI 1.4.5 を使っています。どのような時にこのエラーが出るのでしょうか? テストプログラムを組んで第1引数をポインタのみで実態が無いように組んでみましたが、一発でエラーが出て 出方が違っていました。この時のエラーは次のように出ます。 [hostname:7247] *** An error occurred in MPI_Isend [hostname:7247] *** on communicator MPI_COMM_WORLD [hostname:7247] *** MPI_ERR_BUFFER: invalid buffer pointer [hostname:7247] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) もし宜しければアドバイスお願いします
mpi_err_buffer invalid buffer pointer でググると、 Stackoverflows上のQ&Aなどの情報が見つけられるね
514 :
512 :2013/10/22(火) 20:15:27.18
>>513 レス有難うございます。
ググってみましたが、英語が堪能でないため理解できていない状態です orz
ですがテストプログラムで起きる条件を見つけることが出来ました。
スレッドでRecvで待ち受けている状態で同じランク内でIsend, Irecvで
色々送受信する時にエラーが発生するようです。
RecvをIrecvに変更してタグを分ければエラーが発生しないようですが、
まだ良く見ていないのでなんとも言えない状態です。
コミュニケータとかタグをよく理解していなくてよく分からないのですが、
何となく通信を分けれればいいな程度ならタグで分けるでOKです?
ランクを指定してfinalizeに到達したか調べる方法はないですか?
516 :
デフォルトの名無しさん :2013/12/04(水) 11:39:20.69
MPI の勉強のために、コードの主要部分は C で書かれていて、 具体的な計算部分は fortran77 で書かれたサブルーチンを 呼んでいる混在コードを MPI 並列化したいと思っています。 当面の目標は、MPI の初期化・終了部分などを C の部分で書いて、 fortran で書かれている部分に具体的な指示行を入れて並列化を することなのですが、私の勉強不足で、最初からつまづいている 状態です。 C の部分に MPI_Init(&argc, &argv); MPI_Finalize(); を入れて、
517 :
デフォルトの名無しさん :2013/12/04(水) 11:41:00.26
fortran のサブルーチンに MPI のヘッダや変数定義、MPI 関数 #include <mpi.h> integer nprocs, myrank, ierr call MPI_Comm_size( MPI_COMM_WORLD, nprocs, ierr ) call MPI_Comm_rank( MPI_COMM_WORLD, myrank, ierr ) write(*, *) nprocs, myrank を入れてコンパイルし、4並列の MPI 計算をしてみたところ、 全てのプロセスで nprocs と myrank が 0 と表示されて しまいました。fortran 部分で新規に nprocs と myrank を 定義しているのが原因なのではないかと思っていますが、 C から正しく fortran 側に情報を伝えて、正しく表示させる (nprocs = 4 など)には、どのようにすればよろしいでしょうか。 MPI の基礎が分かっておらず、全くの素人質問で申し訳ありませんが、 ご助言など頂けますと助かります。
FORTRANはしばらく触っていないけど、includeは正しいの? 私もMPIプログラムは素人だけど疑問は何点か有るよ 疑問1、MPIを含まないCとFORTRANの混成は問題なく作れるのか? 疑問2、C又はFORTRAN単独言語の時にMPIのプログラムは作れるのか? 疑問3、C、FORTRAN、MPIのバージョンはいくつ?また実装系は何ですか? で話は少し変わってくるんじゃないかな
519 :
デフォルトの名無しさん :2013/12/04(水) 13:35:33.96
アドバイス頂きありがとうございます。 1 についてですが、MPI を含まない C と FORTRAN の混成で 作られたコードは問題なく動いていまして、そのコードを これから MPI 化したいと思っています。 2 についてですが、現在の C と FORTRAN の混成で作られた コードの規模が割と大きいため、C 又は FORTRAN 単独言語に 書き換えるのが容易ではありませんが、仮にできたとすると 単独言語用の一般的な方法で MPI 化できると思っています。 3 についてですが、C と FORTRAN、MPI のバージョンはそれぞれ icc (ICC) 12.1.4 20120410 mpiifort (IFORT) 12.1.4 20120410 Intel MPI 4.0.3 です。 また、実装系は intel のワークステーションです。 現時点では FORTRAN 側での include ファイルは mpi.h だけですが、それが正しいかどうかは自信がありません。 何かご助言などありましたらお教え頂けるとありがたいです。
includeはC言語の書き方に見えたんで書いたんだけど・・・ include 'mpif.h' とか書くんじゃない? intelのコンパイラは使ったこと無いからわからないけどね 疑問2については簡単なプログラムを(rankを表示する)書いてみたらいいんじゃないと言う意味で書きました
521 :
デフォルトの名無しさん :2013/12/04(水) 16:27:50.33
説明不足ですみませんが、先の include は FORTRAN の部分に挿入した ものです。別途 C の部分には、既に #include "mpi.h" と書いていますが、 もしかして、include 文は C の部分に書いておけば、あらためて FORTRAN の部分には書く必要はないのでしょうか??? 2 については、C も FORTRAN も簡単なプログラムを書くことで、 MPI が動作する(rank が表示される)ことを確認しています。 ただ、今回のような C の中に FORTRAN が入れ子になっている状態での MPI の書き方がわからず(FORTRAN の subroutine を呼んでいる箇所の 前後で MPI の指示文を書いてもダメなのでしょうね?)、困っています。
テストしていないので話半分で聞いて下さい。 まずFORTRANに書くincludeの書き方が間違っている includeはファイルが分割されているとそれ毎に書く必要がある なので ----- main.c ----- #include <mpi.h> int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); fortran_subroutine(); MPI_Finalize(); return 0; } ----- fortran_subroutine.f ----- include 'mpif.h' sobroutine fortran_subroutine() integer nprocs, myrank, ierr call MPI_Comm_size( MPI_COMM_WORLD, nprocs, ierr ) call MPI_Comm_rank( MPI_COMM_WORLD, myrank, ierr ) write(*, *) nprocs, myrank end subroutine fortran_subroutine こんな書き方になると思います(FORTRAN忘れましたw) 小さなプログラムで書き方をテストしてからやった方がいいのでは?
523 :
522 :2013/12/04(水) 21:43:48.10
Linux 環境でOpenMPI 1.4.5 gcc 4.7.2 でコンパイルすると実行時にエラーが出てしまうね。
この環境で混在できるのだろうか? ここ人が少なくで答えてくれる人居ないだろうな
>>521 さんも環境に依存する部分なので上手く行くと良いですね
前のプログラムにタイポと抜けがあったので修正しました
% mpif77 -c rank.f
% mpicc -o test02 main.c rank.o -l:/usr/lib/gcc/i486-linux-gnu/4.7/libgfortran.a -lmpi_f77
でコンパイルしました
----- main.c -----
#include <mpi.h>
void rank_();
int main( int argc, char *argv[] ) {
MPI_Init( &argc, &argv );
rank_();
MPI_Finalize();
return 0;
}
----- rank.f -----
C include 'mpif.h'
subroutine rank
integer nprocs, myrank, ierr
call MPI_Comm_size( MPI_COMM_WORLD, nprocs, ierr )
call MPI_Comm_rank( MPI_COMM_WORLD, myrank, ierr )
write(*, *) nprocs, myrank
end subroutine rank
524 :
522 :2013/12/04(水) 22:18:07.46
includeをsubroutineの後に持ってきたら実行も上手く行きました orz... ----- rank.f ----- subroutine rank include 'mpif.h' integer nprocs, myrank, ierr call MPI_Comm_size( MPI_COMM_WORLD, nprocs, ierr ) call MPI_Comm_rank( MPI_COMM_WORLD, myrank, ierr ) write(*, *) nprocs, myrank end subroutine rank
525 :
デフォルトの名無しさん :2013/12/06(金) 01:28:12.82
>> 522 さん ご返信が遅くなり大変申し訳ありませんでした。 この度はコードのご指導まで頂き、本当にありがとうございました! 私の環境は intel 環境で、不勉強もありなかなか上手くいきません でしたが、参考にさせて頂きつつ、なんとか mpiifort -c rank.f mpiicc -o a.out main.c rank.o -lifcore -limf mpirun -np 4 a.out で動きました!嬉しいです!! この度は、ご助言頂き本当にありがとうございました!!
過疎っているな・・・おるか?
おるでw 最近はMPIのインストール方法とか使用方法とかを説明する記事やドキュメントが多いから、わざわざ2ちゃんのスレにカキコするまでもないのではないかな…
528 :
デフォルトの名無しさん :2014/09/25(木) 20:37:56.94 ID:77m4KJC/
プログラミング初心者ですが質問させてください。 フリーウェアだけでfortranのmpiを用いた並列計算環境って用意できますか? OSはwindowsです。色々解説サイトを回ったのですが、OSがwinで フリーウェアという条件に一致するものがありません。 解説サイトか、フリーウェアを紹介していただけたら幸いです。
WindowsにVirtualboxをインストール VirtualboxにLinuxをインストール ゲストOSでmpi環境構築 以上
530 :
デフォルトの名無しさん :2014/09/25(木) 23:09:57.41 ID:77m4KJC/
>>529 さん回答ありがとうございます。
早速試してきます。
531 :
デフォルトの名無しさん :2014/09/26(金) 00:43:22.36 ID:w0XQeQM8
すみません。再度質問します。 とりあえず、並列計算を行える環境にはなったのですが、 8コアで計算させていたら全てのコアで使用率が100%となりました。 計算速度は犠牲にしてよいので、使用率を50%程に低下させつつ動作させることは 可能でしょうか?
ゲストOSが使用するCPU数を4コアに設定 4/8でCPU使用率50% 以上
うんこ