Message Passing Interface (MPI) 統合スレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGとりあえず本家
http://www-unix.mcs.anl.gov/mpi/
0002デフォルトの名無しさん
NGNGhttp://www.h7.dion.ne.jp/~matsu/pc_cluster/mpi/intro/intro.html
0003デフォルトの名無しさん
NGNGhttp://p-grp.nucleng.kyoto-u.ac.jp/~uchida/mpi/
0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNG0007デフォルトの名無しさん
NGNG高校生でもこれほどの環境を手に入れられる時代になったのですね。
素晴らしい。
0008デフォルトの名無しさん
NGNGhttp://www.lam-mpi.org/
SMPP > PCクラスタ超入門
http://mikilab.doshisha.ac.jp/dia/smpp/
「スカラー・チューニング講習会」 「並列プログラミング(MPI)講習会」で配布したテキスト
http://accc.riken.jp/HPC/training/text.html
OOMPI
http://www.osl.iu.edu/research/oompi/
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNGとりあえず9までにいくつかある
0012デフォルトの名無しさん
NGNGMPI自体はほんとに難しいことはないから、リンク先でも読めばすぐにわかるよ。
0013デフォルトの名無しさん
NGNGmpiccを実行した後、mpirunすると
0 - MPI_SEND : Invalid rank 2
p0_23956: p4_error: : 8262
[0] Aborting program !
[0] Aborting program!
パイプ破壊
とエラーがでてしまいます。
何がいけないのでしょうか?;;
0014デフォルトの名無しさん
NGNG他のMPIプログラムはちゃんと動いたの?
もし動いたのなら、今回動かなかったプログラムのソースは載せられる?
0015デフォルトの名無しさん
NGNG> 0 - MPI_SEND : Invalid rank 2
Invalid rankなんだから、"2" に対応するpeがMPI_Sendで使用したコミュニケー
タに無いんじゃないの?
001613
NGNG>>14
他のプログラム(πの計算)などはできました。
今回のは↓にUPしました。
http://www.geocities.jp/cirque55510/cellmpi.c
>>15
ちょっと
0018デフォルトの名無しさん
NGNGfor(source=1;source<mb;source++){
多分ここでしょ。でもmbをpに直しても間違いのような・・・
突っ込みどころたくさんあるんだけど、もうちょい勉強してみて。
0019デフォルトの名無しさん
NGNGこれでも読んでください。
同志社大学の人が授業で使っている講義資料かな?
あそこは設備があるしね。。
http://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/PDF/chapter02.pdf
002213
NGNG「MPI並列プログラミング」(P.パチェコ著)も買ってみたんですが
結構難しくてちゃんと理解できるか不安に・・・。
0023デフォルトの名無しさん
NGNG日時:12月28日 13:30-
場所:同志社大学 京田辺校地 香知館 3F会議場
ttp://www.is.doshisha.ac.jp/SMPP/meetings/2004/041228.html
0024デフォルトの名無しさん
NGNGかなり行き詰まってきた;;
<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!
0025デフォルトの名無しさん
NGNG原因がわかりません…ご教授のほどを
他のプログラムはプロセス数に限らず動いたんだけどなぁ
0026デフォルトの名無しさん
NGNG多分MPIの通信ルーチンの所だと思うけどね。
0027デフォルトの名無しさん
05/02/15 02:50:23どういう状況でとまるのか書かないとわかりにくいッす。
愚考ながら、1のときと3のときでは止まる原因が違う、ということも。
ところで、MPICHのWIN版設定ってやってるページ少ないですね。
GUIのmpirunは接続異常は表示しないし…
0028デフォルトの名無しさん
05/02/18 03:07:35MPICHって、GlobalArrays実装してますか?
英文必死こいて読んで見たけど、らしき記述が見当たらないのです。
・・・いや、職場で異様に自信満々で「共有メモリ使える」と逝ってる香具師がいるもんで。
そもそも分散型プロセス通信の為の規格っつーか仕様ですよね?>MPI
0029デフォルトの名無しさん
05/02/18 11:13:13まさか「共有メモリ」なんて無いですよ。MPIって "Message Passing Interface" ですもん。
プロセッサ間のやりとりはすべてメッセージの送受信ですよ。
> ・・・いや、職場で異様に自信満々で「共有メモリ使える」と逝ってる香具師がいるもんで。
ずいぶんと不幸な職場環境ですね……
003028
05/02/18 21:09:43・・・やっぱり?
おかしいとは思ったんですわ。
まあ、もうちょっと読み進めては見ますがせっかくだし。
それはそれとして、RMAのある実装って何かありますか?
MPICHにはないようで。
うまく使えばかなりおいしそうなんで、いじってみたい・・・
0031デフォルトの名無しさん
05/02/22 10:09:380032デフォルトの名無しさん
05/02/24 03:22:52ハード的にはネットワークの使えるパソコン数台と、ルーター
ソフト系は上のほうの紹介サイトぐるっと回ってライブラリをとってくる。
あとはメインのプログラムの開発環境、これぐらい?
0033デフォルトの名無しさん
05/03/09 17:16:270034デフォルトの名無しさん
2005/03/28(月) 08:43:19何がいけないのでしょうか?解決方法を教えてください。
/tmp/ccGU5ztX.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
0035デフォルトの名無しさん
2005/03/28(月) 08:45:490036デフォルトの名無しさん
2005/03/28(月) 08:57:360037デフォルトの名無しさん
2005/03/28(月) 09:11:02g++でコンパイルやリンクしてる?
0038デフォルトの名無しさん
2005/03/28(月) 09:12:400039デフォルトの名無しさん
2005/03/28(月) 16:28:410040デフォルトの名無しさん
2005/03/28(月) 16:30:000041デフォルトの名無しさん
2005/03/29(火) 02:56:38このクラスのデストラクタがランク0以外働かないのですが、何故なのでしょうか?
0042デフォルトの名無しさん
2005/03/29(火) 10:25:22mpiCCでいける
0043デフォルトの名無しさん
2005/03/29(火) 11:17:290044デフォルトの名無しさん
2005/03/29(火) 11:53:30まずはMPIの仕様書を読もうよ
0045デフォルトの名無しさん
2005/03/31(木) 07:23:490046デフォルトの名無しさん
2005/04/06(水) 14:28:48コンパイルする詳しい方法分かりますか?
004746
2005/04/06(水) 14:40:00include 'mpif.h'で定義ファイルを読み込むんですよね?
0048デフォルトの名無しさん
2005/04/06(水) 15:41:26Unixは使えないのですか?
004946
2005/04/06(水) 16:07:03使えないです。unixでないとできませんか?
0050デフォルトの名無しさん
2005/04/06(水) 16:30:58005146
2005/04/06(水) 16:33:040052デフォルトの名無しさん
2005/04/06(水) 22:37:29005346
2005/04/06(水) 23:35:210054デフォルトの名無しさん
2005/04/07(木) 14:03:18threadを使ったプログラムは経験があるのですが、MPIでの作成方法がよくわかりません。
0055デフォルトの名無しさん
2005/04/11(月) 00:23:110056デフォルトの名無しさん
2005/04/16(土) 01:49:10なんでwhile(!done){}あたりのギミックが必要なの?
0057デフォルトの名無しさん
2005/04/16(土) 13:14:57( ∀`) 彡 >>56 教えてやってもいいが
((≡O ⊃
| | おまい!左腕を上下 右腕を前後
し⌒J 同時にやってみろ!話はそれからだ!
0058デフォルトの名無しさん
2005/04/16(土) 13:52:56他のn個のCPUが処理が完全同期で終わる保証はどこにもないだろ。
だったら全部の処理が終わるまで待つのは当たり前だろ。
それともそんなことすら解らないのか?プログラム組むの辞めろ。お前は
もう、日本から出て行け
0059デフォルトの名無しさん
2005/04/16(土) 16:24:45> なんでwhile(!done){}あたりのギミックが必要なの?
単にコードの書き方がまずいだけと思われ。
この内容ならもっと見やすくシンプルにできるよね。
0060デフォルトの名無しさん
2005/04/16(土) 21:35:10なんかわかったような気がする。
コメントアウトの部分のソースを無視していました。
頭悪くてすみませんでした。
>>58さん
MPI_Reduce()で全プロセスが終わるの待ってるのかと思ってたんですけど
違うんですか?
0061デフォルトの名無しさん
2005/04/30(土) 18:49:380062デフォルトの名無しさん
2005/05/01(日) 01:56:36p5_30033: p4_error: interrupt SIGSEGV: 11
Broken pipe
Broken pipe
というエラーが出ます。これは何がいけないのでしょうか?
個人的には、ファイルアクセスで問題が起きていると思っているのですが、エラーの原因が未だつかめません。
0064デフォルトの名無しさん
2005/05/03(火) 11:48:06配列の範囲外にアクセスしているとか
MPI以外のエラーを疑え
0065デフォルトの名無しさん
2005/05/05(木) 11:48:10問題ないと思っていたのですが、gcc4にアップデートして以来、原因不明で0番プロセス以外が実行中に落ちます。
0066デフォルトの名無しさん
2005/05/07(土) 03:33:52gcc3 を使ってた方が安全だよ。
0067デフォルトの名無しさん
2005/08/19(金) 18:09:30mpd.confにsecretwordを書いた後どうすればいいかちょっと分かりません
教えてもらえないでしょうか?
0068デフォルトの名無しさん
2005/08/19(金) 18:42:55○ ちょっと教えてもらえないでしょうか?
0069デフォルトの名無しさん
2005/08/22(月) 05:24:370070デフォルトの名無しさん
2005/09/09(金) 19:38:130071デフォルトの名無しさん
2005/09/12(月) 22:52:56C++でサーバアプリで計算しながら、クライアントアプリにソケット通信するようなシステムに
適用できますか?
サーバー側は1000件/分ぐらいのトランザクションで、クライアント側はサマリー情報を
半リアルで表示させるだけといったかんじです。
0072デフォルトの名無しさん
2005/09/13(火) 07:18:440073デフォルトの名無しさん
2005/11/06(日) 16:40:070074デフォルトの名無しさん
2005/11/17(木) 11:20:420075デフォルトの名無しさん
2005/11/17(木) 13:12:490076デフォルトの名無しさん
2005/11/17(木) 16:19:520077デフォルトの名無しさん
2005/11/17(木) 16:56:140078デフォルトの名無しさん
2005/12/21(水) 23:26:52http://www-lab.imr.tohoku.ac.jp/~t-nissie/computer/wolfchen/doc/HomeWolfchenProject.html
0079デフォルトの名無しさん
2006/01/12(木) 23:20:44mpirun -c 16 myprog.exe
で実行すると、16個のプロセスが動き始めるのですが、問題があります。
それは、プログラムを実行すると、データファイルを読み込んで、処理が始まるのですが、データファイルはいくつかの大きさのものを用意しているのですが、
あるデータファイルでは、正しく計算が完了するのですが、あるデータファイルでは
計算開始直後にエラーで終了してしまいます。調べたところ、MPI_Bcast()で
エラーしていました。
また、正しく計算できるデータファイルを使って、
mpirun -c 8 myprog.exe
のように変えるとエラーする場合もあります。
そこで教えていただきたいのですが、そもそも1CPUマシンで、このような並列計算を
実行することは、何か問題がありますでしょうか?
よろしく。
0080デフォルトの名無しさん
2006/01/13(金) 06:41:19メモリ不足とかじゃなきゃ、プログラムのバグだろうね
0081デフォルトの名無しさん
2006/01/13(金) 11:50:49>基本的に動かないとまずい。
>メモリ不足とかじゃなきゃ、プログラムのバグだろうね
やはりそうですか。
実際、プログラムを単純化して、単に16プロセスでMPI_Bcast()するだけというプログラムでは、問題なく動きます。
16以外のどんな数字でも問題ありません。なので、プログラムのバグの可能性が高いのですが、一つ気になる点は、
エラーするケースでも、エラーしないケースでも、いずれの場合でもプロセスをps -ef などでモニタしていると、
実行中に16プロセスそれぞれの親プロセスIDがころころ変わっているのが確認できるのですが、何かそのあたり
に関係しているのではと思うのですが、どなたか詳しい方、ヒントなどお願いします。
0082デフォルトの名無しさん
2006/01/15(日) 08:59:30プログラムのバグ。
MPI_Barrier()で、きちんと同期とって
MPI_Bcast()で起こってるなら
MPI実装を疑ってもいい。
まあ、なんだ。
漏れには「FedoraのMPIでエラー終了」じゃ、
どのMPI環境なのかも
どんな異常終了かもサパーリですよ。
0083デフォルトの名無しさん
2006/01/15(日) 14:56:36(1) 単純化したプログラムと、エラーが起こる実プログラムで、
送信データの大きさは同じですか?
(2)どういうエラーメッセージが出ますか?
(3)mpi_bcastの前後にprintfでランクの値を書き出した場合、
どうなりますか?
(全プロセスがmpi_bcast前しか表示しないのか、
それともプロセスによってはmpi_bcast後も表示するのか)
(4)エラーが起こるデータファイルで、プロセス数が16より少ないときは
どうなりますか?
0084デフォルトの名無しさん
2006/01/16(月) 00:57:31>(1) 単純化したプログラムと、エラーが起こる実プログラムで、
>送信データの大きさは同じですか?
はい。MPI_INTを一個です。
>(2)どういうエラーメッセージが出ますか?
今自宅なので、正確には覚えていませんが、英語のメッセージで、
『どれかのプロセスでエラーしました』とか言う感じだったと思います。
>(3)mpi_bcastの前後にprintfでランクの値を書き出した場合、
>どうなりますか?
正しく、自分のランク値が表示されます。
>(全プロセスがmpi_bcast前しか表示しないのか、
>それともプロセスによってはmpi_bcast後も表示するのか)
全プロセスで、MPI_Bcast前に正しいランク値が表示されますが、
MPI_Bcast後には、どのプロセスも何も表示されません。
0085デフォルトの名無しさん
2006/01/16(月) 00:58:31>どうなりますか?
ええっと、その後、いろいろ試してみたら以下のようになりました。
分割数 大きいデータ 小さいデータ
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がエラーする
原因が分からないので、ちょっと気がかりです。
0086デフォルトの名無しさん
2006/01/16(月) 04:45:45>はい。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 エラー
0087デフォルトの名無しさん
2006/01/16(月) 04:50:20(9) 実プログラムが下記のような構成になっているとして
(a)の部分をすべてコメントにすれば、
(単純化したプログラムではうまくいくとのことなので)
うまく動くと思いますが、
その後で、(a)の部分を前半から少しずつ
コメントをはずしてはテストしを繰り返せば、
どこかで再びエラーとなるはずです。
それによって、エラーの原因となっている個所が特定できるかもしれません。
あるいは逆に、(b)と同等の通信を(送信バッファーの中身は空でも可)
まず(a)の直前で行い、うまくいったら、
(a)内を少しずつ後ろへずらしていっても同じテストができます。
MPI_Init();
(a) 入力ファイルの読み込み等
(b) MPI_Bcast(a,1,MPI_INT,〜);
(c) 計算
MPI_Finalize();
0088デフォルトの名無しさん
2006/01/16(月) 05:13:37>はい。MPI_INTを一個です。
確認ですが、一個というのは、下記の2つ目の引数が1という意味ですか?
MPI_Bcast(a,1,MPI_INT,〜);
また、下記の大きいデータの場合も小さいデータの場合も1ですか?
分割数 大きいデータ 小さいデータ
2 OK エラー
0089デフォルトの名無しさん
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)の部分をすべてコメントにすれば、
これらのテスト結果の報告は、後日させていただきます。
0090sage
2006/01/19(木) 03:41:50オプションをちょっと教えていただけないでしょうか?
osはfedora core4 コンパイラーにintel fortran compilar 9.0
mpich-1.2.7p1 を使用しています。
よろしくおねがいします。
0091デフォルトの名無しさん
2006/01/19(木) 17:54:06if ( 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]
0092デフォルトの名無しさん
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
です。
0093デフォルトの名無しさん
2006/01/20(金) 00:14:20もし同じエラーが出たとしたら、
同じサブルーチンの同じ引数に異なる型を指定しているという
警告で、MPIとは関係ないと思います。
program test
call sub(a)
call sub(i)
end
subroutine sub(a)
a=1
end
0094デフォルトの名無しさん
2006/01/20(金) 00:21:15-2つのif文を1つにまとめた方がすっきりすると思います。
-例えばランク0プロセスが同じireq2を(mpi_waitする前に)2回使うのはまずいです。
片方を例えばireq1にしてください。
また2回のcall mpi_xxxの後でmpi_waitが2回必要となります。
あるいはmpi_sendrecvを使う手もあります。
009591
2006/01/23(月) 16:20:18まさにそれでした。
>>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)です。
0096デフォルトの名無しさん
2006/01/23(月) 18:40:47(2) 送る要素数は3個ですか?
(3) istatusは大きさmpi_status_sizeで配列宣言してますか?
(4) itagには何が指定されてますか?
(5) 実行するとどういうエラーになりますか?
009791
2006/01/24(火) 11:15:33(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のままであったりします。
0098デフォルトの名無しさん
2006/01/24(火) 18:43:500099デフォルトの名無しさん
2006/01/24(火) 18:46:04(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回で送るようにします。
従ってループ内で通信を行うということはあまりしません。
0100デフォルトの名無しさん
2006/01/26(木) 13:56:53MPIf90でコンパイルできねー!!
↓こんな感じのエラーしかでねー!!
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のインストールの時おかしな事したのか?おれ
0101デフォルトの名無しさん
2006/01/31(火) 15:53:130102デフォルトの名無しさん
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'
0103デフォルトの名無しさん
2006/02/01(水) 06:24:470104デフォルトの名無しさん
2006/02/01(水) 08:24:550105デフォルトの名無しさん
2006/02/01(水) 18:04:38glibcのヴァージョンが古いのか?動くっちゃ動くし結果も間違っていないが、何か気持ちわるい。
誰れか改善方法しりませんか?
/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
0106デフォルトの名無しさん
2006/02/02(木) 04:11:560107デフォルトの名無しさん
2006/02/02(木) 04:29:290108デフォルトの名無しさん
2006/02/02(木) 05:39:400109デフォルトの名無しさん
2006/02/02(木) 19:20:57>103-104
0110デフォルトの名無しさん
2006/02/06(月) 13:03:09?
何が言いたいの?日本語わかる?
せめて会話くらいしろよ。キチガイ
0111デフォルトの名無しさん
2006/02/09(木) 13:02:070112デフォルトの名無しさん
2006/02/09(木) 14:40:46ユーザーガイドにも載ってないし。
0113デフォルトの名無しさん
2006/03/01(水) 11:53:27インテルのサイトにも書いた?
http://softwareforums.intel.com/ids/board/message?board.id=11&message.id=3060
0114デフォルトの名無しさん
2006/03/02(木) 23:48:55MPICHダウンロードして、一緒についてきたサンプルプログラムを
MPICH Configurationで参加するノードを設定してから実行すると
Failed to launch the root process:
"C:\Documents and Settings\XXXXX\cpi"
LaunchProcess failed, LogonUser failed, ログオン失敗: ユーザー名を認識できないか
、またはパスワードが間違っています。
というエラーが返ってきます。
設定しなければローカルで動くんだけど、何でだろう?
0115デフォルトの名無しさん
2006/03/03(金) 10:12:08Q. Why do I get this error, "Logon failure: unknown user name or bad password"?
Q. Why do I get this error, "LaunchProcess failed, CreateProcessAsUser failed, The system cannot find the file specified."?
0116114
2006/03/03(金) 17:57:11ありがとう!
やってみるね!
0117デフォルトの名無しさん
2006/03/07(火) 16:00:54なんか練習問題みたいなのはないですか?
そんな大規模演算をする機会もないし、
練習用に何かお勧めなものはありますか?
0118デフォルトの名無しさん
2006/03/07(火) 17:20:48ヤコビ法の並列化
LU分解の並列化
2次元FFTの並列化
0119デフォルトの名無しさん
2006/03/07(火) 17:27:38e計算の並列化
0120デフォルトの名無しさん
2006/03/07(火) 19:24:56コマンド1
コマンド2
.
.
.
コマンドN
という独立したジョブが書いてあるテキストファイルを読み込んで、
P個のプロセッサで実行させるプログラム。
コマンドに依存関係つけるとなおよし。
0121デフォルトの名無しさん
2006/03/12(日) 16:05:090122デフォルトの名無しさん
2006/03/12(日) 16:09:320123デフォルトの名無しさん
2006/03/12(日) 21:03:03↓にモードの説明が。
http://www.mpi-forum.org/docs/mpi-11-html/node40.html
MPI_Ssendがない実装もあるようだし、返答をMPI_RecvかMPI_Barrierするのが確実じゃない?
バンド幅を測るとかの場合、受信が完全に終了したのを確認するにはこれしか方法がなさげ。
0124http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 21:10:21もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
0125デフォルトの名無しさん
2006/03/19(日) 11:52:280126デフォルトの名無しさん
2006/03/24(金) 20:00:53以下のようなプログラムでも時間が3秒かかります。(VC++、IntelC++とも)
MPI_Finalizeの終了処理に時間がかかっているようですけど
対策をご存知の方いっらいしゃますすか。
#include "mpi.h"
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
MPI_Finalize();
return 0;
}
0127デフォルトの名無しさん
2006/04/13(木) 06:48:210128デフォルトの名無しさん
2006/04/13(木) 08:13:11一度に複数の相手と通信したり、
通信中に別の計算させたりするもの
0129デフォルトの名無しさん
2006/05/08(月) 21:15:200130デフォルトの名無しさん
2006/05/11(木) 15:37:350131デフォルトの名無しさん
2006/06/02(金) 08:31:400132デフォルトの名無しさん
2006/06/03(土) 01:56:38そんな仕様はない
0133デフォルトの名無しさん
2006/07/30(日) 21:08:39明日からmpi使うらしいんで勉強してきます
0134・∀・)っ-○◎● ◆R.I.S.K.0.
2006/07/30(日) 22:45:31アレって単にプロセス間通信やるだけよね?
プロセスレベルマルチタスクであってスレッドレベルマルチタスクじゃないよね?
0135デフォルトの名無しさん
2006/09/05(火) 22:49:52int 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と打ち間違えてもいないし……というわけで,原因・解決方法をご存知の方おりましたらご教授くださいませ.
0136135
2006/09/05(火) 23:46:15吊ってきます.
0137デフォルトの名無しさん
2006/10/25(水) 11:29:000138デフォルトの名無しさん
2006/11/16(木) 01:19:10mpdはローカルであれば、正常に起動してicpiなどきちんつ動いているのですが、
ネットワーク越しのリモートで分散させようとすると(mpdboot, rshに書き換え済み)
動作しません。
failed to ping mpd ...といったエラーがでます。
ちなみにrshは単体ではパスワードなしで動作しています。
Fedoreの設定はファイヤーウォールはインストールしていますが、
「ファイヤーウォールは無効」でやっています。
むしろmpdというよりもFedoraの設定のような気がしますが、同様な症状を
経験された方はおられますでしょうか?
0139デフォルトの名無しさん
2006/11/28(火) 16:48:25それを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でもソースを共通化できるので、楽になると思ったのですが、この作戦、
どうでしょうか?何か注意すべき点などありましたら、アドバイス御願いします。
0140デフォルトの名無しさん
2006/11/29(水) 18:55:13mpi詳しくないけど
CPU二個とnode二個はぜんぜん違うからできないんじゃないの?
0141デフォルトの名無しさん
2006/11/29(水) 20:04:150142デフォルトの名無しさん
2006/11/30(木) 10:50:29ありがとございます。やってみます。
ところで、MPIプログラムのデバッグって、皆さんどういうふうにやっていますか?
私にはとても難しいです。というのは、エラー発生しても、どこかのnodeでエラーが
起こった程度のことしかわからないので、怪しげなところにprintfを沢山いれて探し
出すという泥臭い方法でやっています。
一方WindowsのVCの環境だとDebuggerでSTEPで一行ずつ実行できるので、便利なのですが、
MPIプログラム開発でも、でも何かそういう統合的な開発環境や高性能なDebuggerって
あるのでしょうか?
0143デフォルトの名無しさん
2006/12/01(金) 00:13:290144デフォルトの名無しさん
2006/12/02(土) 21:56:05ほんまかいな?
0145・∀・)っ-○◎● ◆DanGorION6
2006/12/02(土) 22:26:170146デフォルトの名無しさん
2006/12/03(日) 19:00:27MS MPI
あたりでぐぐりぇ
0147・∀・)っ-○◎● ◆R.I.S.K.0.
2006/12/03(日) 19:07:050148・∀・)っ-○◎● ◆R.I.S.K.0.
2006/12/03(日) 19:07:200149デフォルトの名無しさん
2006/12/04(月) 11:56:46>Windows Compute Cluster Server 2003
これを買わないとWindowsXPでMPIはできないの?
0150デフォルトの名無しさん
2006/12/04(月) 15:24:37huge-test.cpp(11): warning #1188: floating-point value cannot be represented exactly
double a=HUGE_VAL;
とワーニングが出るんだけど、どうしたらいいかな??
0151デフォルトの名無しさん
2006/12/24(日) 01:09:15判別して処理を書き換えるという方法に問題はあるでしょうか?
また一般的ですか?
それとも処理ごとに書き換えた関数を用意して、
呼び出す側でIDによって呼び出す関数を変えた方が良いのでしょうか?
ご回答よろしくお願いします。
0152デフォルトの名無しさん
2006/12/24(日) 14:18:16スレタイ嫁
0153デフォルトの名無しさん
2007/01/03(水) 16:11:550154デフォルトの名無しさん
2007/01/14(日) 01:14:46以下のようなエラーを吐いてしまいました。
どなたか原因がわかる方いませんでしょうか。
pingでお互いのホストは認識されています。
>ERROR: The root process on "hostname" has unexpectedly exited. Exit code = -1073741515
0155デフォルトの名無しさん
2007/01/14(日) 13:35:32[hostname]ユーザーが登録されてるクラスタのプロセスがおかしいって言ってるね
もうちょっと構成とか詳しく
0156デフォルトの名無しさん
2007/01/14(日) 16:33:20レスありがとうございます。
大学の研究室のマシン(XP)で、お互い同じワークグループに入っているようです。
構成についてもっと詳しく書きたいのですが、
どのように調べてどういった情報を書けばいいのか教えていただけますか?
よろしくお願いします。
0157154
2007/01/15(月) 19:54:35調べたのですがやはりよくわかりません。
>>156で同じワークグループだと書きましたが、それは関係ないみたいですね。
研究室のマシンがどのようにつながっているのか良くわからないのですが、
共有フォルダで互いのファイルを参照できたり同じワークグループに入って
いたりしたので、MPICHも問題なく動くものだと勘違いしていました。
WindowsでMPIを使う場合の構成の仕方が載ってるサイトの情報でも
とてもありがたいので、どなたかご教示願いいたします。
0158155
2007/01/15(月) 22:07:54ttp://www.google.co.jp/search?num=100&hl=ja&rls=GGGL%2CGGGL%3A2006-29%2CGGGL%3Aja&as_qdr=all&q=MPI+windows+filetype%3Apdf&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
googleでpdf検索すればどう設定すればいいか結構でてくるよ
あとMPIプログラミングやるなら虎の巻は読んどいた方がいいね、まあ健闘を祈る!
ところでCPUは何使ってる?
0159154
2007/01/16(火) 00:20:12レスありがとうございます。
リンクのトップに出てくるサイトで設定をしていてできなかったのです。
で、いじくってて気づいたのですが、ユーザーズガイドのシステム要件を見たら、
WindowsのHOME EDITIONは使えないのですね・・・
これはMPICH2を使えばいいのでしょうか。
MPICH2のほうのユーザーズガイドみたら特にPROに限るような記述はなかったので
HOMEでもいけるのですかね?
あと、CPUですがPentium4を使っています。
0160デフォルトの名無しさん
2007/01/16(火) 02:37:19Homeか・・・そりゃ無理だ
デュアルブートでLinux入れる気無い?何に使うかわからんがWindows環境を捨てるのも
一つの手だよ、ただMPIを動かしたいんならKnoppix MPIとか使うと簡単に起動できる
ttp://kagakububuturi.hp.infoseek.co.jp/
・・・つーかこれ高校生が作ったにしちゃあよくできてるよな
後Knoppix-MPIで使ってるMPIはLAM-MPIのほうだからMPICH使いたいならあわないかも
ttp://www20.atwiki.jp/mynote/?page=mpi
適当ですまん (;´Д`)/
0161154
2007/01/23(火) 03:52:37レス遅れてごめんなさい。
実はあれからMPICH2でやってみたところ、WindowsHomeでも動かすことができました!
たくさん相談にのっていただきありがとうございました。
ただ、今回4台で並列化行う予定なんですけど、
1台だけうまくいかないマシンがあってまた困っています。
他のマシンで2台でやってみると正常に実行できるのに、そのマシンを入れて行うと
"abort: Unable to connect to <hostname>"と出てしまいます。
設定は他のマシンと同じようにしてるつもりなのですが。
ようやくできるようになったと思ったのに、色々問題出てきますね・・・
0162デフォルトの名無しさん
2007/01/23(火) 15:13:21WinのMPICH2は使った事無いが<hostname>って言うノードが登録されてないんじゃないか?
ttp://www.imslab.co.jp/Product/eem/parallel/faq.htm
上のページの一番下が原因かも
あとMPI組んだならHPL(Linpack)ベンチマーク走らせて結果うp!
0163154
2007/01/24(水) 02:08:24レスありがとうございます!
ご指摘のとおり、アカウント名が原因でした。
あとベンチマークですが、、、余裕があったらやってみます、スミマセン^^;
0164デフォルトの名無しさん
2007/01/30(火) 17:50:05どのような関数を使えばいいでしょうか?
0165デフォルトの名無しさん
2007/01/30(火) 22:47:50http://pc10.2ch.net/test/read.cgi/tech/1170150974/
0166デフォルトの名無しさん
2007/01/31(水) 15:24:230167デフォルトの名無しさん
2007/02/02(金) 19:26:04つ ny
0168デフォルトの名無しさん
2007/02/05(月) 09:33:01wmpiconfig.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
です
0169デフォルトの名無しさん
2007/02/26(月) 22:15:01何か原因に心当たりのある方はおられませんか。
printf("before\n");
MPI_Finalize();
printf("after\n");
これをやったらbeforeしか表示されません。
ちなみに[email protected]です。
0170デフォルトの名無しさん
2007/02/27(火) 01:07:310171169
2007/02/27(火) 03:48:13PC毎にパラメタが変わってこけていたという罠。
吊ってきます
Λ||Λ
0172デフォルトの名無しさん
2007/03/13(火) 00:51:59なく、PC毎に別のデータを別の処理方法で行っていて、あるPCの処理結果が別の処理中のPCの処
理に割り込んで処理方法を変えるなどということは出来るのでしょうか?
0173デフォルトの名無しさん
2007/03/20(火) 23:06:11MPI_Finalizeを呼ぶタイミングについて疑問があります。
MPI_Finalizeをmainの末尾で呼べば無事に終わるのですが、
Singletonクラスのデストラクタの中で呼んだら落ちてしまいました。
main を抜けた後に呼んではいけないでんしょうか?
環境は、MPICH2、Win XP SP2、Visual Studio 2005 です。
0174デフォルトの名無しさん
2007/05/06(日) 03:28:13データタイプがテンプレートに指定されたデータタイプによって変わる場合、
どのように設定したらよいのでしょうか?
0175デフォルトの名無しさん
2007/05/19(土) 08:51:23template<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
{ ... };
0176デフォルトの名無しさん
2007/05/19(土) 09:14:10static const ... の行を消し忘れました。
0177デフォルトの名無しさん
2007/05/21(月) 07:56:54場合とそうでない場合に別々のコードを書くことができますが、
MPIの場合はどのようにしたらよいのでしょうか?
0178デフォルトの名無しさん
2007/06/09(土) 16:58:36少なくないと思うので、お尋ねします。
1年前に構築した16ノードクラスタ(ディスクはNFS共有、ギザイーサ)が、
最近頻繁にp4_errorを起こすようになりました。
とりあえず疑わしいところからパーツを取り替えまくったのですが、全く改善しません。
特定ノードというより全体的にパラパラと障害が発生してるので、もしやネットワークかな
と思ったのですが、ネットワークに問題があるなら、rloginやsshのセッションやNFS
の読み書きにも障害が出ると思うのですが、特に問題は出ていないようです。
MPIで並列したときに限って発生します。
これからネットワークの交換を検討していますが、何かアドバイス頂けいたら幸いです。
ちなみに1年間はほぼ問題なく使えており、他の計算機でも実績があるので
プログラム側の問題ではないです。
0179デフォルトの名無しさん
2007/06/22(金) 11:04:410180デフォルトの名無しさん
2007/06/23(土) 23:33:500181デフォルトの名無しさん
2007/06/24(日) 14:51:42今頃気付いたが、ギザイーサワロス
巨大王墓間を高速インターコネクトで結んで世界の七不思議にでも入れたいノケ?
0182デフォルトの名無しさん
2007/06/24(日) 15:17:250183デフォルトの名無しさん
2007/06/26(火) 08:00:52中川しょ(ry
0184デフォルトの名無しさん
2007/06/27(水) 15:30:14日本語でおk
0185デフォルトの名無しさん
2007/06/27(水) 23:51:220186デフォルトの名無しさん
2007/06/28(木) 02:15:450187デフォルトの名無しさん
2007/06/28(木) 22:45:570188・∀・)っ-○◎●
2007/06/29(金) 02:42:040189デフォルトの名無しさん
2007/07/02(月) 16:57:33MPIを使ってさらに大規模な行列を計算させたいのですが、お薦めのライブラリを教えてください
0190デフォルトの名無しさん
2007/08/12(日) 20:42:39fedora5でひととおり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()
どなたか御力をおかしください。
0191190
2007/09/03(月) 22:06:14いけました。
他にps3でクラスタやってる人の例をネットなどでみていると、結構Fedora 5で
やってる人がいるから、OSの違いでうまくいったというよりも、初回のmpiの
インストール時の設定に問題があったのかもしれません。以上。
0192デフォルトの名無しさん
2007/09/10(月) 01:30:38知ってるひといたら教えてくれい
0193デフォルトの名無しさん
2007/09/12(水) 04:50:40こんなのあった
自分は使ったことないが
ttps://sourceforge.jp/projects/mpiunit/
0194デフォルトの名無しさん
2007/09/23(日) 03:05:43つかってみたぞ
いがいとべんりだった
0195デフォルトの名無しさん
2007/09/24(月) 00:57:560196デフォルトの名無しさん
2007/09/26(水) 16:47:33チュートリアル書きたいが
どんな機能があるのがよくわからん
0197デフォルトの名無しさん
2007/09/27(木) 00:30:55虎の巻じゃだめかね
0198デフォルトの名無しさん
2007/09/27(木) 01:59:38虎の巻をたのむ
0199デフォルトの名無しさん
2007/09/27(木) 09:50:27ttp://accc.riken.jp/HPC/training/text.html
0200デフォルトの名無しさん
2007/09/27(木) 15:07:25すまねえ
193の虎の巻がほしかったんだ
0201デフォルトの名無しさん
2007/09/30(日) 00:21:40パッケージの中にあるじゃん
0202デフォルトの名無しさん
2007/09/30(日) 12:28:39あるけどわかりにくくない?
0203デフォルトの名無しさん
2007/09/30(日) 21:15:53http://sourceforge.jp/projects/mpiunit/wiki/Tutorial
0204デフォルトの名無しさん
2007/09/30(日) 21:37:27ま と も な
チュートリアルが欲しいんだよ。
0205デフォルトの名無しさん
2007/10/01(月) 03:36:48作者に直で言うしかないな
0206デフォルトの名無しさん
2007/10/01(月) 23:01:280207デフォルトの名無しさん
2007/10/04(木) 21:05:22どうせLGPLだし
204氏はどんなチュートリアルが欲しいんだい?
0208デフォルトの名無しさん
2007/10/05(金) 12:19:320209デフォルトの名無しさん
2007/10/11(木) 00:03:400210デフォルトの名無しさん
2007/10/17(水) 09:58:07使ってるよ
プログラミングの効率が上がった
0211デフォルトの名無しさん
2007/10/20(土) 20:55:500212デフォルトの名無しさん
2007/10/26(金) 21:09:070213デフォルトの名無しさん
2007/11/02(金) 21:07:27$ 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 マニュアル無くて悲しい。
0214デフォルトの名無しさん
2007/11/04(日) 15:00:582台ともデュアルコアなので、
/etc/mpich/machines.LINUX に
cluster1:2
cluster2:2
と記述しています。
テストを行おうと
mpirun -np 4 cpi
をしてみたのですが、1分以上待ってもプロンプトが帰ってきません。しかし
mpirun -np 3 cpi
とするとcluster1に2スレッド、cluster2に1スレッド割り当てられ計算結果がすぐ返ってきます?
4コア使い切るためにはどうしたら良いでしょうか?
0215213
2007/11/07(水) 00:40:140216デフォルトの名無しさん
2007/11/07(水) 11:28:47mpich-1.2.7p1
gcc, pgi 7.1
を使用していますが、emacsでmpiデバッグできませんかね。
gdbとpgdbgを使ってデバッグできますが、
pgdbgは使いにくいし、gdb単体も使いにくいので、できれば
emacsからgdbを起動したいなと。
0217デフォルトの名無しさん
2007/11/07(水) 13:26:160219デフォルトの名無しさん
2007/11/07(水) 15:42:53ローカルマシンに同じ名前のディレクトリを作る。
そこに機種毎のバイナリを置く。
これで桶。
0220デフォルトの名無しさん
2007/11/07(水) 15:44:35補足。
機種毎のバイナリは同じ名前で作っておく。
mpirunはデフォでは同じ名前のユーザーの同じ名前のディレクトリにある
同じ名前のコマンドを実行するだけなので。
0221デフォルトの名無しさん
2007/11/07(水) 15:59:06標準で入ってるんだ
昔はPVMが主流だったそうだけど、今はほとんどがMPIだよね
0223214
2007/11/10(土) 21:37:30localhost:2
cluster2:2
となっていたのを
cluster1:2
cluster2:2
にしたらいけました。3スレッドはできるので machines.LINUXは悪くないと決め付けてました。
0224デフォルトの名無しさん
2007/12/12(水) 06:13:16・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)に質問したところ、
設定は問題はない。プログラムの問題、あるいは通信時間がかかってしまうので
実時間が増える、といういい加減な返答しかきません。
似たような症状を経験したことのある方、対処法をご存知でしたら
教えてもらえないでしょうか。
0225デフォルトの名無しさん
2007/12/13(木) 07:08:530226デフォルトの名無しさん
2007/12/27(木) 14:48:26MPICHならconfigure時に --mem=shared を付けて構築すべし
通信が共有メモリを介したものになる(異ノード間は当然sshやrsh経由)。
実行時に ps -x してsshやrshでプロセスが起動してたら、わざわざ同一計算機内でTCP/IP通信しちゃってるので損。
OSやコンパイラに付属のMPICHはsharedで構築されていない例が多いので自分で構築してみよう。
0227デフォルトの名無しさん
2007/12/27(木) 14:59:25今時シングルコアはないから、2コアの2CPUなんだろう
0228デフォルトの名無しさん
2007/12/28(金) 20:38:39>>225
検索すると状況としてはこれが当てはまる感じなのですが、
私には使い方がよく分かりません。
詳しいサイト等ありましたら教えてもらえないでしょうか。
>>226
確かにps x コマンドで確認すると(ノード内の場合でも)
rsh が動いていました。
このコンピュータはMPIのインストール及び設定済みのものを
購入したのですが、業者がいいかげんということなのでしょうか?
複数ノード構成なのですが、この場合はどうなのでしょうか
業者の説明では例えば、machinefile に
node00:2 とすればSMPとなるとのことでした。
node00 node00 とすれば通信が発生するとのことでした。
>>227
シングルコアのItanium2:4CPUx4ノードの構成です。
(年度でわけて増設して購入したのでちょっと古いCPUになっています)
納品されたのは1年以上前なのですが、不具合ばかりです。
0229225
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;
}
0230225
2007/12/29(土) 00:46:50sar コマンドを使って、例えば
> sar -P ALL 1 1000
とやると各プロセスがランクと同じ番号の CPU で走り続けてランク順に終了していく様子が観察できる。
参考にしたページ:http://d.hatena.ne.jp/naoya/20070824/1187945715
0231デフォルトの名無しさん
2008/01/08(火) 18:31:33の書き込み見て、--with-comm=shared というオプションをつけてMPICHを
コンパイルしてみたんだけど、逆に遅くなりました。共有メモリのほうが早く
なると思うんですけど、どうしてだろう?
CPUは Core 2 Quad 2.4GHz を使っています。
0232デフォルトの名無しさん
2008/01/09(水) 01:43:00GridMPIのMPI関数は、通信先によって、リモートノードなら、IMPI、
自ノードなら自ノード内のMPI(ベンダMPIなど)を呼び出して通信
するはずですが、GridMPIが提供しているMPI関数と(自ノードの)
ベンダMPIの関数のシンボルが重複しないのはなぜでしょう?
(最初は、GridMPIから発行するベンダMPIの関数は、MPI関数では
なく、PMPI関数と思っていましたが、これは違いますよね・・・)
0233デフォルトの名無しさん
2008/01/10(木) 00:07:05MPICHのブロードキャストはTCPを用いて行われているようなのですが、
UDPによるブロードキャストを使用することはできるのでしょうか?
ご存知の方がいらっしゃれば、よろしくお願いします。
0234デフォルトの名無しさん
2008/01/11(金) 10:27:421.スレーブ(MPIでもこういう表現するんですかね)のマシンに
計算領域を割り当てて計算させる
↓
2.マスタに計算結果を返す
↓
1と2を繰り返す
という流れはどういう風にソース上で実現させているのでしょうか。
0235デフォルトの名無しさん
2008/01/11(金) 20:48:46スレーブとか言いません。
全く同じプログラムが複数走ります。
主従はなく、皆平等です。
MPI_Comm_rank関数を呼び出すと自分のノード番号がわかるので、
その番号に応じた振舞いをするようにプログラムを書きます。
たとえば、0から100までの足し算を2台の計算機でするときに、
ノード番号0なら0から49まで、ノード番号1なら50から100まで計算するようにしておきます。
通信は送信したいノード番号に向けて送信し、受信したいノード番号を指定して受信します。
0236デフォルトの名無しさん
2008/01/12(土) 20:56:170237デフォルトの名無しさん
2008/01/13(日) 11:21:47そうやるんですか
PVMで同じようにする方法がさっぱりわからんもんで
参考になるかな、とは考えたのですが・・・
0238デフォルトの名無しさん
2008/01/16(水) 23:13:340239デフォルトの名無しさん
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したオブジェクトのポインタが存在して、それも他のノードで再現したいわけで...
0240デフォルトの名無しさん
2008/02/07(木) 18:19:400241239
2008/02/07(木) 20:05:46って、まあ置いといて、STLのstringなんかもオブジェクトのバイナリ丸コピじゃだめなんだよな。
ヒープからバッファ取ってるから。
となると、シリアライズして送信、受信側で再構築なんだろうけど、正直面倒臭いな。
0242デフォルトの名無しさん
2008/03/01(土) 05:39:370243デフォルトの名無しさん
2008/03/06(木) 23:33:27Linux / Cele 420 / MEM 2GB / 26台 /hdd less
という構成なんだが、手軽に遊ばせるMPIのサンプルないかな?
ちなみに、午後6時に強制shutdownの設定になってるので、
長くても8時間程度のジョブの奴を頼む。
0244デフォルトの名無しさん
2008/03/18(火) 08:12:50環境はFedora8+Intel C++ 10です。
0245デフォルトの名無しさん
2008/03/29(土) 13:32:000246デフォルトの名無しさん
2008/04/05(土) 15:00:580247デフォルトの名無しさん
2008/04/17(木) 17:12:340248デフォルトの名無しさん
2008/04/17(木) 18:43:410249デフォルトの名無しさん
2008/04/18(金) 21:06:07同じエラーが出るミニプログラムを作ってうp汁
0250デフォルトの名無しさん
2008/04/22(火) 00:04:00どこのスレいけばいいか解らんくて
迷子してる
0251デフォルトの名無しさん
2008/05/21(水) 23:38:11ファイルがバッファリングされる関係で
リアルタイムで更新されないので、fflushを
つっこんだら、計算時間が倍になったぞ。
こういうのは難しいなぁ。
0252デフォルトの名無しさん
2008/05/22(木) 06:37:45NFSとかSambaでリモートのファイルシステムに書いてない?
ローカルの /tmp あたりに書くようにすると速くなるかも。
0253デフォルトの名無しさん
2008/05/22(木) 09:17:590254251
2008/05/23(金) 00:45:22リモートファイルシステムです。
多分それで速くなると思いますが/tmpとか勝手に
使ったら怒られそう。大学共同利用のシステムなんで。
>>253
かなり頻繁に更新してますた。数秒に1回ぐらい。
進行状況を書いてただけなので、flush頻度を1/100
にしたら速度がだいたい元に戻りました。
0255デフォルトの名無しさん
2008/05/23(金) 01:30:25普通の大学の計算機センターならローカルディスクぐらい用意してるよ。
聞いてみな
0256251
2008/05/24(土) 18:29:49計算で64bit Intetgerを使って、桁あふれ(2^64)が起きたら
「SKIPしますた」とlogファイルに書いて次ぎのデータ処理に入る
ようにしてたんだ。
今まで深さ4の処理をしてたんだが桁あふれが起きてなかった。
次に深さ5の処理に入ったんだ。とたんに桁あふれが増えて
「SKIPしますた。」でdisk使用制限が超えそうになっちまった。
テラヤバスで、20時間実行したjobを強制停止…
>>255
いや、他大学システムなんで、あまりくだらない質問したく
なくて。利用料金も私が出したんじゃなくて、教授のだし。
0257デフォルトの名無しさん
2008/05/26(月) 19:24:36処理が終ってFinalize待ちのプロセッサの負荷が100%になってやがる。
割り込み使ってくだちゃい。
0258デフォルトの名無しさん
2008/05/27(火) 21:52:46rank=0のタスクをjobのマネージメントだけにつかって
rank=1以降を計算に使うプログラムを書いた。
rank=0とrank=1以降でも大してCPU使用率がかわらん
かった。rank=0のタスクはMPI_RECVで待機してただけ
なんだがな。
0259デフォルトの名無しさん
2008/06/20(金) 22:58:08何か良いプログラムは無いでしょうか?
姫野ベンチやHPLだと、結果がFLOPSでしかでないので分かりにくいと言われ
体感的(秒数なもの)にわかるものにしてほしいと(´・ω・`)
思いつく簡単なベンチマークを例であげると、例えばスーパーπの104万桁を2つのCPUで
計算した場合は○○秒かかったけど、4つだと○秒だったよ!という感じです。(ベンチマーク
じゃなくてもいいです。)
よろしくお願いします。
0260デフォルトの名無しさん
2008/06/20(金) 23:17:57自分で秒数に戻せばいい。そもそも計算速度(flop/sec)というのは
計算速度=計算量÷計算時間
として求めている。
計算量(浮動小数点演算の回数)はプログラムによって決まる。
ベンチマークプログラムなら解説文書に計算量が書いてあるはず。
計算量と計算速度が分かれば当然ながら
計算時間=計算量÷計算速度
で秒数が分かる。
0261デフォルトの名無しさん
2008/06/21(土) 01:48:01アドバイスありがとうございます!
なるほど!
そういう風に求めるのですね。
助かりましたm(__)m
0262デフォルトの名無しさん
2008/06/21(土) 10:55:46でいいじゃん。
各ノードごとの時間を知りたければ
mpirun -np 3 time aho &
でできるぜ
0263259
2008/06/26(木) 17:15:29timeを使えば計算時間分かりますね!
アドバイスありがとうございますm(__)m
すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで
高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体
の計算なので何を計算しているのかイメージが付きにくいんじゃないか?
と、言われまして何かイメージが付きやすいプログラムというのは無い
でしょうかね・・・?
すいません、変な質問をして(汗
0264デフォルトの名無しさん
2008/06/26(木) 22:30:47計算結果を可視化するところまでやるとか。
でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
0265デフォルトの名無しさん
2008/06/27(金) 01:51:51迷路。
ノードごとに探索経路を色分けすればぐー
0266259
2008/06/27(金) 11:53:25>計算結果を可視化するところまでやるとか。
>でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
そうなんですよね〜
分子力学のプログラムで計算結果を可視化できるものがあったんですが
リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。
>あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
>並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば
オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね!
アドバイスありがとうございますm(__)m
>>265
>迷路。
すいません。
迷路というのは迷路を解くと言う事でしょうか?
0267デフォルトの名無しさん
2008/08/22(金) 20:08:51windowsでMPIを実行しようとしているんですけどエラーがでて困っています。
インクルドのパスは切っています。
error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。
error C3861: 'Init': 識別子が見つかりませんでした
というエラーがでます。
なんで何でしょう。いきなり初期設定でつまずいて恥ずかしいのですが
だれかアドバイスしていただけないでしょうか。
0268デフォルトの名無しさん
2008/08/23(土) 08:45:51それで他人になにか状況が伝わるとでも?
0269デフォルトの名無しさん
2008/08/23(土) 18:49:31C:Program Files\MPICH2\include
を追加する。
最低これでエラーはなくなるはずのに認識できない。
メッセージは同様。
error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。
error C3861: 'Init': 識別子が見つかりませんでした
絶対windowsで同様なエラーが出ている人がいるはず。
MPICH2はwindowsでは無理なのか?
0270デフォルトの名無しさん
2008/08/23(土) 21:20:54それで他人になにか状況が伝わるとでも?
ソースくらい出せ。
コンパイルオプションくらい出せ
0271デフォルトの名無しさん
2008/08/23(土) 21:22:390272デフォルトの名無しさん
2008/08/24(日) 14:46:18ウィザードで作った雛形をつかってコピしていたからみたいです。
空のディレクトリをしてしてファイル追加してみるとできました。
ご声援ありがとうございました。何の役にもたたなかったけど(w
0273デフォルトの名無しさん
2008/08/24(日) 20:32:38何の役にも立たないのは、お前がなんら情報を出さないからだろ。
自分の低能を棚上げしてイヤミで〆か。
新打法がいいね。
0274デフォルトの名無しさん
2008/08/25(月) 17:29:10野球していたが打てなかったので1本足打法に変えました。
するとよく打てるようになりました。
そして解説者に言われました。
新打法がいいね。
0275デフォルトの名無しさん
2008/08/25(月) 23:55:04自分の考えをコンピュータに伝えられるわけがない。
プログラムなんてやめた方がいいよ。
0276デフォルトの名無しさん
2008/09/16(火) 08:21:400277デフォルトの名無しさん
2008/09/17(水) 03:03:50MPICH2いれてBoostのMPI使おうかと思ったが
うまくいかね
using mpi ; をusr-config.jamに書いたが
パスが通ってないと言われる…
いい解説サイト知っていたら教えてくださいませ
0278デフォルトの名無しさん
2008/11/01(土) 04:35:50データ分割可能なもの知りませんか?
fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
0279デフォルトの名無しさん
2008/12/01(月) 12:33:58MPI_Sendrecvってペアじゃないと使えないですかね?
片方がMPI_Sendrecv
もう一方がMPI_SendだけとかMPI_Recvだけとか。
わかる方いたらご教授願いたいのですが。
0280デフォルトの名無しさん
2008/12/04(木) 16:33:04エラーメッセージは特になく、タスクマネージャで確認するとCPUコア数分のcpi.exeが実行中であるのが
確認できるのでが、強制終了する以外コントロールできない状況です。MPICH1ではうまくゆくのですが。
どなたかご教示のほうよろしくお願いします。
0281デフォルトの名無しさん
2009/01/13(火) 08:26:39とりあえず以下のコードを実行しました。
$ 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にてコピーしました。この先、何をやればよいでしょうか?
0282デフォルトの名無しさん
2009/01/14(水) 00:08:03mpiexec -machinefile mpd.hosts -n 3 a.out
http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.0.8-userguide.pdf
0283281
2009/01/15(木) 03:39:43有り難うございます。出来ました。
別の質問なのですが、以下のコードを実行すると、結果は順不同で出力されます。
#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のランクの順に出力したい場合はどう修正すればよいでしょうか?
0284デフォルトの名無しさん
2009/01/15(木) 10:36:11別々のプロセスが勝手に出力を出しているのでそうなる。
ノード0 出力が終わったらノード1に何か情報を送る
ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信
・・・
という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
0285デフォルトの名無しさん
2009/01/15(木) 14:13:53http://www.amazon.co.jp/dp/456301544X/
http://www.amazon.co.jp/dp/4621047736/
0286281
2009/01/16(金) 09:59:35どっちか一冊買ってみます。
>>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
0287デフォルトの名無しさん
2009/01/16(金) 11:11:50それ、最終ノードが受信してなくね?
printf後にfflushするといいかも
それとループするより素直に
ノード0
表示
送信
ノード 1...n-1
受信
表示
送信
ノード n
受信
表示
でバラして書いた方が見やすいと思う。
同じコードをたくさん書きたくなければ、受信、送信のところを条件分けで囲ったものの間に共通の表示処理を入れるか。
0288デフォルトの名無しさん
2009/01/30(金) 11:49:31code. 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回程度繰り返したところでエラーがでます。
考えれる原因などありますか?
0289デフォルトの名無しさん
2009/01/30(金) 20:45:55プログラムのどっかでreturn 0かexit(0)してんだろ
0290デフォルトの名無しさん
2009/01/30(金) 22:40:48コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が
No such fileって言われるんだけどこれはどう解決すればいいですか?
0291デフォルトの名無しさん
2009/01/30(金) 23:51:35エスパーを要請する質問が多いな。
そんな表現能力じゃ論文もかけないだろ。
0292デフォルトの名無しさん
2009/02/02(月) 21:48:56return 0はmain関数の一番最後でしかやってません。
0293デフォルトの名無しさん
2009/02/02(月) 21:52:31signal9だからSIGKILLだ。
自分で殺してないんだったら、誰かにプロセス殺されてるんじゃないのか。
時間貸しのスパコンとかだったら、一定時間来たらプロセス殺されるぞ。
0294デフォルトの名無しさん
2009/02/03(火) 13:14:23とりあえずソースさらしなよ
それで解決するかどうかは分からんけど、
少なくとも>>289みたいなアホは湧かなくなるよ
0296デフォルトの名無しさん
2009/02/04(水) 21:26:54エスパー回答だが、コンパイル時にmpiccを使ってないとか?
0297デフォルトの名無しさん
2009/02/04(水) 21:43:21反映されるのかな? ちょいスクリプトのタイポして、書き換えたい
のだが… 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
----------
0298294
2009/02/05(木) 10:25:412chにソースはあげたくないので、メール頂けると助かります。
0299デフォルトの名無しさん
2009/02/05(木) 13:19:21いくら払うんだ?
0300デフォルトの名無しさん
2009/02/05(木) 22:34:17どうせ卒論だろ。研究室の先輩に聞けよ。
0301デフォルトの名無しさん
2009/02/22(日) 17:59:18マスタが"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);
0302デフォルトの名無しさん
2009/03/11(水) 02:46:50概ね、ここに書いてあるようにやりました。
(使いたいのは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です。
0303302
2009/03/11(水) 02:59:26http://ums.futene.net/wiki/Paralell/4D5049434832206F6E2057696E646F7773204C6F63616C.html
0304デフォルトの名無しさん
2009/03/12(木) 02:12:20> #include <iostream>
> int main(int argc,char **argv)
これのどこがFortran…
0305デフォルトの名無しさん
2009/03/12(木) 18:40:57いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。
「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。
分かりにくくて申し訳ないです。
0306デフォルトの名無しさん
2009/03/12(木) 19:24:10プロジェクトのプロパティの
Configuration Properties → C/C++ → Precompiled Headers → Create/Use Precompiled Header
を Not Using Precompiled Headers にすればいいと思われ。
(VC++ で C のプログラムをコンパイルするときによくハマる罠です。)
これは英語版の VC++ 2008 の表記だけど日本語版にも該当する項目があるはず。
0308デフォルトの名無しさん
2009/03/12(木) 21:26:09ライブラリが足りないとかそんな次元が自己解決できないようなら。
KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
0309デフォルトの名無しさん
2009/03/12(木) 23:17:29動いて良かったね。Fortran の方は俺は使ったことないので単なる予想だけど
mpi.lib の点(ピリオド)が抜けてて mpilib → mpilib.obj と解釈されてるのでは。
あと mpi.lib と一緒に fmpich2.lib も要るかも。
>>308
普段 Windows で暮らしていると実行してデバッグできる MPICH2 for Win32 は
とっても便利ですよー。多少苦労しても使う価値があると思います。Windows
マシンはありふれているので手近の PC をかき集めて“なんちゃってクラスタ”を
作るといったことも案外簡単にできます。
0310デフォルトの名無しさん
2009/03/13(金) 07:00:15もともと、リモートに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さんはどういう環境で使ってらっしゃるんでしょうか?
0311302
2009/03/13(金) 07:02:25書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
0312デフォルトの名無しさん
2009/03/13(金) 10:23:00309ですが使っている環境は何の変哲もないですよ。
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 で実行できることに意味があると思いました。
0313デフォルトの名無しさん
2009/03/13(金) 19:04:32動作しません。日本語の文献が極端に少ないので英語のサイトを見ながらやっているのですが、
サンプルコードが難しいものが多く理解出来ていません。まずはシンプルに、プロセス1の変数aを単純にプロセス0
の変数aにコピーしたいだけなのですが、MPI_Send/MPI_Recvを使わずにMPI_Getを使うにはどのように書けばいいでしょうか?
下のコードのどこがおかしいのかご指摘下さい。
ttp://www.dotup.org/uploda/www.dotup.org1347.c.html
0314313
2009/03/14(土) 05:12:500315302
2009/03/14(土) 18:05:44ありがとうございます。
あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな…
OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに
してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで
これからは多少そのへんも自分で勉強してみます。
0316デフォルトの名無しさん
2009/03/14(土) 19:15:30312に書いたアプリの場合は、実環境で試したところ OpenMP+MPI は素の MPI よりわずかに
遅いかほとんど同じという結果でした。
もっとも、どちらの性能がいいかは問題、ハードウェア、ソフトウェアなどに依存しますし、
最終的にはやってみないと分かりませんので、可能性があると思ったら試す価値があります。
ハイブリッド並列化に興味があるのでしたら次の記事が参考になると思います。
T2Kオープンスパコン(東大)チューニング連載講座(その5)
OpenMPによる並列化のテクニック:Hybrid並列化に向けて
http://www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
0317デフォルトの名無しさん
2009/03/14(土) 19:17:510318デフォルトの名無しさん
2009/03/21(土) 22:47:300319デフォルトの名無しさん
2009/03/22(日) 05:57:00Windows SDK for Windows Server 2008 and .NET Framework 3.5 を一緒に入れると使えます。
参考:http://tech.ckme.co.jp/vc.shtml
0320デフォルトの名無しさん
2009/04/02(木) 20:54:42メイン又はサブに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が発行され、
値が上手く通信できません。ご指導願います。
0321デフォルトの名無しさん
2009/04/03(金) 03:39:48rank2が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
とでもしないとダメなんでしょうか?どう考えてももっとスマートなやりかたが
ありそうなんですがどうなんでしょうか?どなたか教えていただけませんか?
0322デフォルトの名無しさん
2009/04/03(金) 12:07:030323デフォルトの名無しさん
2009/04/05(日) 04:03:40MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の
位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に
関してはこの通信の前に教えてやる必要があるということになるでしょうか?
0324デフォルトの名無しさん
2009/04/05(日) 08:34:210325デフォルトの名無しさん
2009/04/05(日) 15:13:03num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。
mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので
送信の開始アドレスをずらして指定して大丈夫なんですよね?
それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って
mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか?
あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが…
キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
0326デフォルトの名無しさん
2009/04/06(月) 02:44:25int 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 のように実行すると
良いような気がします。
0327デフォルトの名無しさん
2009/04/08(水) 01:08:390328デフォルトの名無しさん
2009/06/03(水) 17:15:01今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう
Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが
MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
0329デフォルトの名無しさん
2009/06/03(水) 23:59:12MPIの実装に依存するようなプログラムでも作る気かい?
0330お願いします
2009/06/18(木) 20:47:03f(x)=x*xの0~1の積分なんですが、答えが通常0.3333となるはずですが
なぜ以下のプログラムだと違った答えがでるのでしょうか?
すみません、どなたか教えていただけないでしょうか?
ちなみにプログラムはよくあるMPI(倍風館)の本のものです。
実行すると0.000488のような値がでてきます。困っています。
どうやれば0.3333みたいな値を得ることができるでしょうか?
0331お願いします
2009/06/18(木) 20:53:12#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へ */
0332お願いします
2009/06/18(木) 20:53:55MPI_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);
0333お願いします
2009/06/18(木) 20:54:39if (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 */
0334お願いします
2009/06/18(木) 20:55:45float 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 */
0335お願いします
2009/06/18(木) 20:57:04http://tetralog.in/t/?date=20060118
本当よろしくお願いします。
0336デフォルトの名無しさん
2009/06/19(金) 00:14:35積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。
この程度のことくらいやってから他人に聞けば?
0337デフォルトの名無しさん
2009/06/19(金) 14:08:34手元で実行してみたが
$ mpirun -np 2 ./a.out
With n = 1024 trapezoids, our estimate
of the integral from 0.000000 to 1.000000 = 0.333333
となったぞ。ハードウェアの構成は何だ?
0338お願いします
2009/06/19(金) 19:45:20PCクラスタ環境は
Fujitsu PRIMERGY RS200 ×16台
Xeon 3.20GHz/L3:1MB ×2
2GBメモリ
146.8GB HDD ×2(RAID1利用のため実効はこの半分)
73GB HDD ×5(RAID5利用のため実効はこの4/5)
こんな感じです。
0339お願いします
2009/06/19(金) 20:10:050340デフォルトの名無しさん
2009/06/19(金) 21:01:54だからよ、まずは積分単体が戻す答えを見て見ろっての。
どうせなにかの打ち間違いだろ。
0341デフォルトの名無しさん
2009/06/19(金) 21:04:22自分で問題切り分ける意思がゼロだな。
0342デフォルトの名無しさん
2009/06/20(土) 04:41:49まずはMPI部分を全部削って1CPUで動かしてみろよ。
0343お願いします
2009/06/20(土) 12:43:170344デフォルトの名無しさん
2009/06/20(土) 18:44:420345デフォルトの名無しさん
2009/06/20(土) 18:45:150346デフォルトの名無しさん
2009/06/21(日) 07:22:30もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
0347デフォルトの名無しさん
2009/06/27(土) 19:20:41自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、
InfiniBand環境でどれくらい改善するか、予測が付くだろう。
あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、
並列化効率がでない場合も多いので、この点も注意した方がいい。
0348デフォルトの名無しさん
2009/07/06(月) 06:59:07今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。
OSか何かに依存するのでしょうか?
0349デフォルトの名無しさん
2009/07/06(月) 21:10:54MPIの仕様なのでOSには依存しません。
別に偶数ノードと奇数ノードとか関係ありません。
送信と受信が対になって実行されないといけないだけです。
ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、
別の関数で送受信が完了しているか確認をとる必要があります。
0350デフォルトの名無しさん
2009/07/06(月) 21:46:09どの本のどういう記述よ
0351デフォルトの名無しさん
2009/07/07(火) 14:04:08そういう意味ではMPIの実装依存でデッドロックが起きていないということになるわな。
0352デフォルトの名無しさん
2009/07/07(火) 16:32:14(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 個 ローカルに渡す)方法を
ご存じでしたら教えて頂けないでしょうか?
初心的な質問ですみません。
0353デフォルトの名無しさん
2009/07/07(火) 19:07:19つ MPI_TYPE_VECTOR
0354デフォルトの名無しさん
2009/07/07(火) 20:32:32神様、仏様、353様!
早速お教え頂きありがとうございました。
0355デフォルトの名無しさん
2009/07/24(金) 16:46:11構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
0356355
2009/07/24(金) 16:49:25(XgridもOpenMPIを通して使うそうですね)
MPICH2のほうはどうなのか、ちと気になりましてw
0357デフォルトの名無しさん
2009/09/06(日) 10:48:01実行時 に mpirun -np 4 tttt と入力すると
error while loading shared libraries : libompi_f77.so.o cannot open云々
となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
0358デフォルトの名無しさん
2009/09/06(日) 11:37:43実行時に .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 だとファイル名が違うかも知れない。
0359デフォルトの名無しさん
2009/09/06(日) 13:37:280360デフォルトの名無しさん
2009/09/18(金) 16:07:43勝手に
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
ってやって使っても問題ないでしょうか?
0361デフォルトの名無しさん
2009/09/18(金) 18:29:390362デフォルトの名無しさん
2009/09/19(土) 00:13:13こっちで聞いた方が良いとのことでこっちにきました。
Visual studio2008+MPICH2+ifortranを使ってます。
ブレークポイントやステップ実行などが使いたいのですが、
デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。
http://msdn.microsoft.com/ja-jp/library/ms164731.aspx
上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、
デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、
また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています)
ちなみにデバッグなしで開始なら問題なく実行できますが…
今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、
さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、
どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって
足りない情報などあればご指摘ください。
0363デフォルトの名無しさん
2009/09/24(木) 17:43:11VSスレの方がいいんじゃねーかな。
windowsでMPI使う物好きは少ないと思うし。
つーか、モロにVSの使い方だし。
0364デフォルトの名無しさん
2009/10/13(火) 21:53:16どのように宣言したらよいのでしょうか?allocateを使うしかないでしょうか?
77では無理ですか?
0365デフォルトの名無しさん
2009/10/14(水) 11:12:10subroutine mpiplay(n)
real data(n)
とか、かな。Initializeやfinalizeはメイン階層でしてね。
もっとも今は77とそれ以降を混ぜて書いても解釈してくれるから
allocate でがんがんやっても良いと思うけど。
0366デフォルトの名無しさん
2009/10/14(水) 19:51:56なるほど。動的配列を使うまでもなくそれでいいのですか。
ありがとうございます。もう一つお聞きしたいのですが、
メインでもその配列を使いたいときはどうすればよいでしょう?
rank等の取得の前に宣言部が来るのでそのやり方では出来ないでしょうか?
ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
0367365
2009/10/15(木) 05:59:50呪文はメイン階層でもする必要があるけど。
>>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)階層ですることになるね。
0368デフォルトの名無しさん
2009/10/15(木) 06:29:09できるけど。めんどいよねw. 自分自身はコマンドラインの引数を使いたい、
計算コード自身は77で書いてしまった、の2つの理由で
メイン階層のWrapperをCでつくる事が多いけど。上の例は良くつかう。
やはり、というか配列サイズが前もって決まっていないタイプのコードは
最適化が抑制されるのか、遅いね。まあいちいちコード編集&コンパイルの
手間がかからないから楽といえば楽だけど。
0369デフォルトの名無しさん
2009/10/15(木) 06:37:31>>366 ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
にYes!と書けば終わりだったな・・・・w
早起きはするものではないね。
0370デフォルトの名無しさん
2009/10/17(土) 05:54:20いえ、結構怪しかったんで具体的に書いてもらって助かります。
丁寧に教えてくれてありがとう。
0371デフォルトの名無しさん
2009/10/17(土) 20:52:34vel(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まで)
基本的に通信回数は減らした方がパフォは上がるという認識で良いですよね?
0372デフォルトの名無しさん
2009/10/18(日) 05:40:13隣接関係(最近接の粒子番地)がころころかわるから厄介そう。
前半最後の2行が王道だとおもう。型の同じ変数は一つの配列名のに付けてから一度に送受信。
いっそ、最初からvelpos(6,m)みたいに位置や速度の情報を一つの大きめの配列にまとめちゃう方が
いいかもね。vi(m) とか sed だと、
1,$s/pos(1/velposi(4/g
1,$s/pos(m/velposi(3+m/g
みたいな感じでわりと一括置換が効きやすそうだし。
・・・・・恐いけどw
0373デフォルトの名無しさん
2009/10/18(日) 06:45:10うーん、やっぱそうですか。たびたびありがとうございます。
ちなみに代入は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とかの話あまり分かりません。
でもそれで置換出来るならプログラム書く効率あがりそうですね。覚えた方がいいと思いつつ…
統合環境がそういう複雑な置換装備してくれたらいいのにな。甘えすぎですか。
0374デフォルトの名無しさん
2009/10/18(日) 09:38:00例では第一添え字が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
0375デフォルトの名無しさん
2009/10/18(日) 09:39:35↓
第一添字(左端)
0376デフォルトの名無しさん
2009/10/20(火) 06:46:250377デフォルトの名無しさん
2009/10/20(火) 22:03:31ライブラリがリンクできれば。
0378デフォルトの名無しさん
2009/10/21(水) 02:41:08自宅で文法チェックするだけなら -I -L
0379デフォルトの名無しさん
2009/10/22(木) 02:52:210380デフォルトの名無しさん
2009/10/25(日) 06:45:10遅くなったけど本当にどうもありがとう。うまくできました。
ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで
3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?
0381デフォルトの名無しさん
2009/10/25(日) 20:05:53購入したのだが、ここまでスレッド数が多くなるとメモリ帯域か何かが溢れて
評価しないと使えないな。
同じプログラムが、
Pentium4 2.8GHz(1core * 2スレッド)ではMPIで2プロセス走らせると1.6倍ぐらい速くなったけど、
Corei7-860(4core * 2スレッド)ではMPIで8プロセス走らせると4プロセスに比べて0.9倍
ぐらいに遅くなったよ。
0382デフォルトの名無しさん
2009/10/26(月) 06:36:281 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事?
職場での印象では mpirun がメモリアクセスのスケジューリングを
うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。
やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。
・・・・OpenMPだともう少しマシな数字がでてくるのかな?
0383デフォルトの名無しさん
2009/10/26(月) 06:42:32CPU とプロセス(またはスレッド)のアフィニティはどうしてる?
プロセス数が多くなればなるほど、きっちり固定してやらないと
パフォーマンス低下の原因になる希ガス。
0384382
2009/10/26(月) 07:00:00MPIも固定しないのか・・・知らんかった・・・。
0385デフォルトの名無しさん
2009/10/26(月) 09:46:19高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。
LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
0386381
2009/10/26(月) 23:47:19実行したらどうなるんだろうと思った。
現在1〜8プロセスの全てのパターンをベンチ中。多分終わるのは明日。
> core i7か・・・いいな。このお金持ちめw いくらだった?
再利用などしたので、マザボとメモリとCPUしか買ってませんが、46,675円
> 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事?
そういう事です。
> CPU とプロセス(またはスレッド)のアフィニティはどうしてる?
そのあたり詳しくないのでほとんど設定変更せず使ってます。
ちなみにOpenMPI/CentOS5.4です。
0387デフォルトの名無しさん
2009/10/27(火) 16:27:05マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、
マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
0388デフォルトの名無しさん
2009/10/28(水) 02:43:340389デフォルトの名無しさん
2009/10/28(水) 02:57:18アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、
コア間で依存性があった場合は注意が必要だと思う。
HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。
ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
0390デフォルトの名無しさん
2009/10/28(水) 02:59:50そりゃそうでしょ。MPIだってコアの指定をしないとだめ。
もちろんPthreadでも。
0391デフォルトの名無しさん
2009/10/28(水) 03:24:38383のを見るまで気づかんかったw
OpenMPだと dplace や taskset で固定できるけど、
これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?
0392381
2009/10/28(水) 21:52:47悪禁になってしまったのだが結果だけかくと
5プロセスで走らせると最速のようです
0393デフォルトの名無しさん
2009/10/29(木) 01:33:12それだとメモリアクセスが一番のボトルネックじゃない?
ちょうど5コアでいい感じでメモリ帯域を食ってくれて、それ以下だと使い切れなくて、
それ以上だといっぱいになってしまう。
という感じに思える。
0394デフォルトの名無しさん
2009/10/29(木) 03:41:16最近はベクトル化を意識してループを短くして,(メモリでかくなったから)配列に中間結果を格納して・・・
というのがスパコンでは流行、というか推奨されるけど、HTでは
ループ内での処理が冗長なベクトル化をあまり意識してないw古いタイプの
コードが並列化では利得が大きいかも・・という事なのかな。
いまはCacheも大きいからたいがいループ内が長くても収まるし。
0395デフォルトの名無しさん
2009/12/04(金) 22:16:21使っているコンパイラー等は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...の
メッセージが表示されますが、何故か原因が解らないのです。よろしくお願いします。
0396デフォルトの名無しさん
2009/12/04(金) 22:49:20サブルーチンMAINSUBの中でmpif.hのインクルードしてる?
0397デフォルトの名無しさん
2009/12/05(土) 07:53:230398デフォルトの名無しさん
2009/12/05(土) 08:04:520399デフォルトの名無しさん
2009/12/12(土) 13:25:37Windows XP+Vistal C++ 2008 Express以外に、どれをインストールすればよいのでしょうか?
0400デフォルトの名無しさん
2009/12/12(土) 23:30:240401デフォルトの名無しさん
2009/12/20(日) 02:28:58もしなかったら作ってみたいなっと思いまして.2ヶ月に一度くらい勉強会とかライトニングトークしあう的な規模のもので.
0402デフォルトの名無しさん
2009/12/20(日) 11:22:072ヶ月に一度とかタルいことしてたら、次の勉強会までにプログラムできるようになっている。
てか、それでできない人間だけ集まっても意味ないし、できる人間は参加してもタルいだけだろう。
0403デフォルトの名無しさん
2009/12/20(日) 11:52:25その一部以外を if(myrank==0) で囲えばいいの?
0404デフォルトの名無しさん
2009/12/20(日) 13:09:48非並列処理部分の結果を並列部分で使いたい時だったら
ちゃんと伝達するのを忘れないように><
0405デフォルトの名無しさん
2009/12/21(月) 05:10:55なんとなく「プログラムのほとんどが if 文」ってのが違和感なんだけど
他に書き方ないよね
0406デフォルトの名無しさん
2009/12/21(月) 09:37:58並列の出入口でやることが決まっていれば関数に押し込めるけど、そういう事ってあまり多くないし
引数受渡し部分でちょんぼすることあるし・・・><
0407デフォルトの名無しさん
2009/12/23(水) 09:49:25500以下だと問題なく送受でき、送受結果を画面に表示できるのですが、500個を超えると送受結果が
画面に表示できません。プログラムが暴走したような状態になってしまうんです。
データの型は倍精度浮動小数点なんですが、解決策は無いでしょうか?使用している
mpiは openmpiです。
0408デフォルトの名無しさん
2009/12/23(水) 10:52:260409デフォルトの名無しさん
2009/12/23(水) 12:40:54当初は配列をアロケートしていましたが、疑問に思い、配列を設定して
再コンパイルして実行しても同じなんですが。
0410デフォルトの名無しさん
2009/12/23(水) 13:05:15コンピュータに自分の意志を伝えるプログラミングができるわけがない。
ソースもなしに・・・エスパーも求もと書いとけ。
0411デフォルトの名無しさん
2009/12/27(日) 20:24:150412デフォルトの名無しさん
2009/12/28(月) 22:57:30プログラムは
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でも同様なんですが、どうやった良いのか原因も何も解りません。どうかご指導ください
0413デフォルトの名無しさん
2009/12/28(月) 23:06:52Scatterで...,b(1),20,の後にMPI_DOUBLE_Precision,を書き漏らしております。
質問時の記入ミスです。すみません。
0414デフォルトの名無しさん
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
0415デフォルトの名無しさん
2010/02/08(月) 17:39:36あるプロセスからの出力だけ途中で止まることがあります。
PCはintel fortran+mpich、大規模計算機はPGIfortran+Voltaire MPIです。
例えばプロセスごとにoutput00,output01,output02,output03のように
別のファイルに出力させているんですが、何かの拍子にいくつかが出力
されなくなったりします。ループの途中にbcastやbarrier等の同期があるので、
出力がないプロセスも計算そのものが停止しているということはないと思うのですが、
別のファイルや標準出力への出力も停止するのでうまく調べきれず、定かではありません。
かなり情報が少なくて申し訳ないのですが、考えうる原因、調査法、解決法もしくは
それに至らなくとも何か思いついたことでもあれば教えて頂けませんか?
0416デフォルトの名無しさん
2010/02/08(月) 19:42:122桁のファイル名を決める整数が
違うプロセスで同じ整数になっちゃって・・・とか
とびとびになってしまって、とかは無いのかな?
PCとスパコンで違う並列数でやっておかしくなったのなら
同じ並列数(2とかw)でやってテストしてみては?
CPUが自分のプロセス番号(例題でよく変数名Myrankになるやつ)
を決める部分のチェックとかもやるといいかも。
とあるシステムでちゃんと動いてるので415さんのMPIの
(データ転送とかの)部分にミスがあるとは考えにくい、
という推定からすると他にはあまり思いつかないな。
0417デフォルトの名無しさん
2010/02/09(火) 00:30:15ノードローカルのディスクに書いてるとかいうオチならブチキレ
0418デフォルトの名無しさん
2010/02/09(火) 02:35:40少なくともジョブ終了後にユーザーがファイルを移動する操作を
する必要は無いような気もするけど・・・・
その可能性は大いにあるね。
0419デフォルトの名無しさん
2010/02/10(水) 18:08:04mpi_finalizeを実行せずに終了してるのでは?
0420デフォルトの名無しさん
2010/02/10(水) 20:33:470421デフォルトの名無しさん
2010/02/11(木) 10:58:34=> MPIとファイル出力はなんも関係ない
=> このスレとファイル出力はなんも関係ない
0422デフォルトの名無しさん
2010/02/11(木) 12:03:48MPI_Finalizeしなくても、ファイル出力していればファイルはできてるし、ジョブが死ぬときにファイルがクローズされるからそのときにフラッシュされるわけで
MPI_Finalizeしないことがファイルができないこととは無関係だっつってんだよ。
0423デフォルトの名無しさん
2010/02/11(木) 21:49:22次回以降のプログラムの実行がおかしくなることがあった希ガス。
確かlambootし直すと正しく実行できるようになったから、裏方のプロセスが
狂ったんだろうな。そういう状況ではファイル入出力が一部おかしくなっても
不思議ではない。
0424デフォルトの名無しさん
2010/02/11(木) 23:16:52途中でプロセスを頃したらmpichでもおかしくなることがあるが、あくまで通信に失敗すると言う次元のおかしくなり方だから。
0425デフォルトの名無しさん
2010/02/11(木) 23:37:48それによってプログラムの動き(例えば通信結果によってif文の判定を行っている)が変り、
ファイルへの書き出し部分を通過しなくなったというのは?
0426デフォルトの名無しさん
2010/02/12(金) 01:10:41つーか、その程度のミスならPCでマトモに動くとは思えないけど。
0427デフォルトの名無しさん
2010/02/12(金) 15:46:16一つのジョブで、MPI_Finalizeを指定しないで終了するプロセスがあると
通信がおかしくなることがあったと思う。
0428デフォルトの名無しさん
2010/02/13(土) 20:26:46ん?じゃぁ宛先はドコに置くん?
0429デフォルトの名無しさん
2010/02/13(土) 21:14:35メインプロセスがチャイルドプロセスを立ち上げる。
実装によるが、そのとき引数にチャイルドプロセスの情報を加える。
MPI_Initでargc, argvが要求されるのはそのため。
0430デフォルトの名無しさん
2010/02/19(金) 13:33:36N_local = N_global / numprocs;
double u_new[N_local + 2], u_old[N_local + 2];
こうやったら、Integer constant expression requiredって言われました
どうすればいいの?
0431デフォルトの名無しさん
2010/02/19(金) 19:29:59MPIの前にCの勉強をしろカス
といいたいところだが親切な俺様が教えてやろう
C89, C++では動的配列は使えない。
mallocかnewで確保汁!
0432デフォルトの名無しさん
2010/03/20(土) 18:01:31格子は150x150x150で、線形の拡散方程式です。
0433デフォルトの名無しさん
2010/03/24(水) 06:27:04・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。
MPI版あったような・・・気がする。気がする、ばかりでなんだが。
それを元にして、というのも。
ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
0434デフォルトの名無しさん
2010/03/24(水) 10:20:58データはどうなりますか?書き換えが必要ですか?
0435デフォルトの名無しさん
2010/03/24(水) 13:18:17Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、
自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って
そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど
・・・・忘れたwときがイヤなのであまり満足していない。
プリプロセスもクレバーに使えばコンパイル時に
とあるオプションが使われたときにだけONになるように出来るハズだけど
使い方がいまいちわからんw
この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても
しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
0436デフォルトの名無しさん
2010/03/24(水) 21:28:25個数を配列の長さ*sizeof(TYPE)にして。
fortranでこんなことができるか知らんけど。
エンディアンがあってないと大変なことになるが気にしない。
0437435
2010/03/25(木) 03:25:12real r
r = 1.0
if sizeof(r) .eq. 8 then
call mpi_send(...,mpi_double,....)
else
call mpi_send(...,mpi_float,....)
endif
をつくってみたけど、コンパイル時のオプションで振舞がちゃんと変わった。
例では r は単精度か倍精度かの判定用のダミー、のつもり。
値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
0438434
2010/03/26(金) 17:48:06ありがとうございます!出来るんですね。
>>437
436さんの文章だけ見てもぱっと分かんなかったんで助かります。
試してみます。
もう一つ、mpich2って使ってる人いますか?
mpi_in_place使えるはずと思うんですが、mpi_reduceの中で使ったところ、
Invalid buffer pointerってエラーが出て使えません。
多分何かとんでもない勘違いしてそうなんですが、どこがおかしいでしょうか?
ちなみにこんな感じです↓
mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
0439436
2010/03/26(金) 19:38:08double a[N];
MPI_Send(... N, MPI_DOUBLE, ...)
の代わりに
MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...)
なんだが。
これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。
>>437だと新しい型を増やす度に条件分岐が増える。
0440デフォルトの名無しさん
2010/03/27(土) 02:01:35なるほど!
0441デフォルトの名無しさん
2010/03/27(土) 12:13:43call mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
else
call mpi_reduce(sumofv,iwork,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
endif
0442デフォルトの名無しさん
2010/04/04(日) 09:08:14・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、
同じタグ番号でも困らないような気はするけど。
0443デフォルトの名無しさん
2010/04/14(水) 10:18:20インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか?
何か設定で切り替える方法があれば教えてください
0444デフォルトの名無しさん
2010/04/21(水) 01:33:13ここの通りにやってサンプルを使った
円周率の計算まではできたんですけど
自分で書いたC, C++を動かすことができません
とりあえずプロジェクトをいじってるんですがそれでいいんでしょうか?
何か留意点などありますか?
0445デフォルトの名無しさん
2010/04/21(水) 01:39:49mpi自体の設定もLinuxの方が簡単。
0446デフォルトの名無しさん
2010/04/21(水) 10:35:03並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。
とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか?
http://codepad.org/13tw3pKS
アドバイスお願いします。
0447デフォルトの名無しさん
2010/04/22(木) 00:58:42で、技術料はいくら払うんだ?
0448デフォルトの名無しさん
2010/04/30(金) 06:33:210449デフォルトの名無しさん
2010/05/10(月) 05:36:11それぞれの利点欠点を教えてください
0450デフォルトの名無しさん
2010/06/12(土) 19:14:06>nohup mpiexec -np 4 ./a.out >& log.txt &
標準出力(log.txt)に下記のようなメッセージが大量に書き込まれてしまいます。
これを表示させない方法はないでしょうか?
(handle_stdin_input 1067): stdin problem; if pgm is run in background, redirect from /dev/null
(handle_stdin_input 1068): e.g.: mpiexec -n 4 a.out < /dev/null &
0451デフォルトの名無しさん
2010/06/12(土) 23:35:54メッセージに書かれている通りのことをやればいいだけ
0452デフォルトの名無しさん
2010/06/13(日) 04:24:41ありがとうございました。確かに入力用にこれを指定すると出なくなりました。
しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、
このようにしたのですが、それはマルチノードの設定の問題でしょうか。
0453デフォルトの名無しさん
2010/06/13(日) 10:55:370454デフォルトの名無しさん
2010/06/16(水) 22:05:53プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。
殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、
計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。
ふと、OCやめて定格に戻したら、まともな速度が出るようになった。
なんてこった。どうやらOCで逆に遅くなる事があるようだ。
OCする場合とOCしないときと速度比較してみる価値あるかもよ。
0455デフォルトの名無しさん
2010/06/16(水) 22:47:520456デフォルトの名無しさん
2010/06/16(水) 23:29:080457デフォルトの名無しさん
2010/06/17(木) 19:01:17通常のOCのリスク(熱・故障等)以外に、結果が狂うとかある?
0458デフォルトの名無しさん
2010/06/18(金) 00:53:44狂った事あるよ。
デカイファイルが出力されるプログラムを実行させてたときに
./a.out | gzip > out.txt.gz
とかやってたんだが、out.txt.gz をgzip -d で解凍させたら壊れて
ますとエラーが出たので気が付いた。OCでgzipがまともに動作し
なかった模様。多分計算結果も壊れてたんだろうな。
てかgzipで圧縮してなかったら計算結果が壊れてる事に気がついて
なかった罠。
0459デフォルトの名無しさん
2010/06/18(金) 01:00:23そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている
から1100Wの電熱器付けているようなもんだからなぁ。
0460名無しさん@そうだ選挙に行こう
2010/07/10(土) 14:37:03台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w
(一台あたりの話)
作業配列をunsignedからunsigned charにしただけで、1.2倍。
昔のCPUは1byteアクセスはペナルティ高かったような…
PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
0461名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:12:52単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
0462460
2010/07/10(土) 23:39:18単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。
CPUがPhenom II 945だしインテルコンパイラーつかえねー
0463460
2010/07/12(月) 23:52:31コンパイラの最適化レベルを上げるとホットスポット内にある、めったに呼ばれない関数までinline展開されてループ内のマシン語が大きくなってしまう。
また、ifでの条件分離の確率をプログラマーが指定したくなるな。。これはコンパイラーの機能ではどうにもならなかったので、制御構造を変更するしかなかった。こういうのはコンパイラ変更したら無意味になりそうでいやーん。
マシン語がどういう形で展開されているかは、素直に読むとなかなか辛いので、以下のようにasm文で適当にLABEL文を埋め込んでいけばいい。
---
asm(".HOGEHOGE_START:");
for(i=0; i < MAX; i++){ hogehoge;}
asm(".HOGEHOGEEND:");
--
そして-save-tempsでマシン語をファイル(hoge.s)に出力させればいい。マシン語のC++の関数名は奇妙奇天烈な名前に変換されるが、c++filtで復元出来る。
$ cat tmp.c
void test(int hoge){}
$ g++ tmp.c -c
$ nm tmp.o
00000000 T _Z4testi <- 謎の関数名
U __gxx_personality_v0
$ nm tmp.o | c++filt
00000000 T test(int) <- 関数名を復元
U __gxx_personality_v0
0464デフォルトの名無しさん
2010/07/14(水) 03:12:44そんなこともあるんですか
あまり欲張らないでおこう
0465デフォルトの名無しさん
2010/07/14(水) 16:19:27MPIをインストールするのめどい。
やって欲しい事は、32coreのマシンと、数千個のファイルがある。
.a.outにこのファイルを一つづつ渡して実行してほしい。処理が終
わったら続いてファイルを渡して処理をして欲しい。同時に32個
のa.outを実行しつつ、処理が終わったa.outがあったら残りの
ファイルをa.outで処理してほしい。
0466デフォルトの名無しさん
2010/07/14(水) 16:24:100467デフォルトの名無しさん
2010/07/15(木) 00:26:56#pragma omp parallel for schedule(dynamic,1)
for( int i = 0 ; i < 1000 ; ++i ) {
char filename[100];
sprintf(filename, "file%03d.dat", i);
process(filename);
}
結構適当に書いたけど、こんな感じ?
0468デフォルトの名無しさん
2010/07/15(木) 22:00:42gccも4系はサポートしているみたいですので、試してみます。
0469デフォルトの名無しさん
2010/08/07(土) 11:07:24一見正しく動いていても、OCで遅くなったり計算間違ったり
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/454
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/458
0470デフォルトの名無しさん
2010/09/12(日) 06:01:26>>467 さんの schedule(dynamic,1)
は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。
頑張ってね〜。
0471デフォルトの名無しさん
2010/10/03(日) 18:04:08MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。
日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
0472デフォルトの名無しさん
2010/10/12(火) 03:47:24どれがdefineされているかを調べれば良いのでしょうか?
0473デフォルトの名無しさん
2010/10/22(金) 10:35:24apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する
方法がわかりません。
やり方を教えてください
0474デフォルトの名無しさん
2010/10/24(日) 02:32:25なるほど分からん
0475デフォルトの名無しさん
2010/10/24(日) 02:44:51定義済みマクロ
http://wikiwiki.jp/redstrange/?%C4%EA%B5%C1%BA%D1%A4%DF%A5%DE%A5%AF%A5%ED
__MPI
__OPENMP
0476デフォルトの名無しさん
2010/11/11(木) 06:38:52MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか?
よろしくお願いします。
0477デフォルトの名無しさん
2010/11/11(木) 10:15:27たとえば x86 なCPU で linux 上で、とかなら
.o ファイルかき集めて最後にリンクできて・・なら、
たぶんだけど意図したとおりに動くんじゃないかな?
コードはあげないけど中間ファイルならあげるよ、という人たちから
いろいろもらって一まとめで使う、とかなの?
0478デフォルトの名無しさん
2010/11/12(金) 14:02:34すみません質問がいい加減すぎました。
ノード1がCygwinでgcc_4.3.4を使っていて、
ノード2がUbuntuでgcc_4.4.4を使っています。
CPUはともにx86系です。
このようなときに、
MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。
よろしくお願いします。
0479デフォルトの名無しさん
2010/11/12(金) 15:38:08まあ、動くかと。
gcc と intel は割と相性イイから
インテルも混ぜてあげよう
0480デフォルトの名無しさん
2010/11/15(月) 18:12:22のですが、どうすればよいでしょうか。
Windows版の場合には、mpiexec(のみ)が提供されていて、
mpiexec -env HOME <somewhere> -np ...
とすればできますが、
Linux版では、mpirunが提供されているが、mpirunには環境変数を指定する
オプションがないので、できなくて困っています。なお、インストールには
YaSTを使い、
mpich-1.2.7p1-214.3.i586
mpich-devel-1.2.7p1-214.3.i586
を入れました。
0481デフォルトの名無しさん
2011/01/13(木) 13:07:41bashrcに書けばいいんじゃない?
0482デフォルトの名無しさん
2011/01/26(水) 19:07:42A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。
Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。
行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。
誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
0483デフォルトの名無しさん
2011/02/09(水) 18:08:03000 333
111 444
222 555
rank0 rank1 rank2
step1
000 333 --- --- --- ---
--- --- 111 444 --- ---
--- --- --- --- 222 555
step2
000 --- --- --- --- 333
--- 444 111 --- --- ---
--- --- --- 555 222 ---
step3
000 --- --- 333 --- ---
--- --- 111 --- --- 444
--- 555 --- --- 222 ---
0484デフォルトの名無しさん
2011/05/21(土) 13:51:12.10Fatal error in PMPI_Barrier: Other MPI error, error stack:
PMPI_Barrier(476)..................: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier(82)...................:
MPIC_Sendrecv(161).................:
MPIC_Wait(405).....................:
MPIDI_CH3I_Progress(150)...........:
MPID_nem_mpich2_blocking_recv(1074):
MPID_nem_tcp_connpoll(1663)........: Communication error
とエラーが出てしまい実行出来ません。検索しても有効な解決策が見つかりませんでした。
どなたか解決策を教えていただけないでしょうか?
0485デフォルトの名無しさん
2011/05/31(火) 04:09:40.08自分でコンパイルしたのより速い?
0486デフォルトの名無しさん
2011/05/31(火) 23:53:44.810487デフォルトの名無しさん
2011/06/01(水) 02:31:39.53やだな・・・罰ゲームだ
0488デフォルトの名無しさん
2011/06/07(火) 02:57:07.11そんなくだらない煽りが来るとは思わなかった.
mpichってconfigure makeしません?
数値計算メインで使ってるなら,
効率考えて,コンパイラ変えたりするでしょ.
mpi関係ないコンパイラの速度って,
icc>1.1倍>gcc4>>1.8倍>>gcc3
ぐらいのイメージなんで,(Linux x86_64)
ifortやiccでmpichコンパイルしたのとどっちが早いかな
と思ったんですが.
impiだと,
mpicc -cc=icc
て出来ることがわかったので,自己解決しました.
0489デフォルトの名無しさん
2011/06/07(火) 03:03:11.95環境変数はbash_profileのほうがふつうじゃない?
>>484
mpd立てた?
listenportの設定は適切?
付属のサンプルプログラムは流れた?
0490デフォルトの名無しさん
2011/06/08(水) 00:50:57.29「自分でコンパイル」に該当する環境をきちんと定義しないからさ。
コンパイラは?gcc?icc?それ以外?
mpiライブラリは?計算内容は?
まぁどれにしてもmpiコンパイラって基本的に適当なライブラリをくっつけて
ビルドするスクリプトだから、実際やってる内容を出力するオプションあるし
それで1つ1つ確認すればいいんじゃない?
0491デフォルトの名無しさん
2011/06/08(水) 01:47:18.76回答ありがとう.たしかにあやふやな質問だったと思う.
偏見かもしれんが,まともなwindowsクラスタってあるの?
数値計算を32bitで行うのは論外でしょ.
でIntel Compilerを入れる時点で,アーキテクチャほぼ決まると思いますが.
impiのデフォルトコンパイラはgcc&gfortranです.
mpiライブラリの意味がわからん.
impiの前はmpichを使ってた.(これで回答になっている?)
計算内容は有限差分とモンテカルロ.
続く
0492デフォルトの名無しさん
2011/06/08(水) 01:48:27.26続き
適当なライブラリが-lmpi -lpthread -lmとかを言っているなら,
libmpiをコンパイルする必要があると思いますが.
このライブラリをIntelがチューニングしてくれたら,
自分でコンパイルするより早いでしょうし.
デフォルトのgccとかでやられてたら,
自分でコンパイルしたほうが速そうじゃない?
実際やってる内容ってのは,mpiccやmpifcのスクリプトの中身のこと?
それとも別の何かを指しているの?
0493デフォルトの名無しさん
2011/08/28(日) 05:28:03.47それとも単に便利なだけというだけなのでしょうか?
0494デフォルトの名無しさん
2011/09/01(木) 19:37:51.69MPI_SendやMPI_Recvを使って送受信可能にするためには変換が必要だったりしますか?
double型のデータなんですが。
0495デフォルトの名無しさん
2011/09/02(金) 11:09:03.84エラーが
One of the process started by mpirun has exited with a nonzero exit code.
this typically indicates that the process finished in error.if your process
did not finish in error,besure to include a "return 0"or"exit(0)"in your
C code before exiting the application.
PID ***** failed on node n2 due to signal 11と出て通りません。
ソースはアップロダにあげるのでよければご教授お願いします。
ttp://uproda.2ch-library.com/423445uMY/lib423445.c
0496デフォルトの名無しさん
2011/09/03(土) 10:38:26.00とあるので全うな終了をしてないプロセスがあるんでしょう。
return 0以外で終了するっぽいコードは inputn() です。何故か EOF に達すると exit(1) しているので
inputq() のように break にすれば直る・・・・・・とは思いませんが。
とりあえず他の点でも突っ込み。
・座標入力でy,zがEOFになってもbreakで抜けて処理しているけどいいの?というかそういう表示を出さないとバグがわからないと思う。
・mainのループ関係がおかしい。わかりやすいところではifとelseが対応してない。
・getdouble() は1行から1つの数値しか読み込まないっぽいので 3次元座標的には読みにくい入力データが必要。
0497495
2011/09/04(日) 09:45:19.22正直自分の知識じゃ限界を感じているので
代わりにやってくれる方がいれば報酬払ってもいいです。
最大2万円までしか出せませんが…。メール待ってます。
0498デフォルトの名無しさん
2011/11/15(火) 11:36:05.43端末PC落とすと計算やめちゃうんだが
0499デフォルトの名無しさん
2011/11/19(土) 16:31:12.600500デフォルトの名無しさん
2011/11/24(木) 19:56:37.29■ このスレッドは過去ログ倉庫に格納されています