1 名前:デフォルトの名無しさん [04/11/07 18:25:56.net] MPIによる並列プログラミングについて話し合う統合スレッドです。 とりあえず本家 www-unix.mcs.anl.gov/mpi/
263 名前:デフォルトの名無しさん [2008/06/21(土) 10:55:46 .net] time mpirun -np 3 aho & でいいじゃん。 各ノードごとの時間を知りたければ mpirun -np 3 time aho & でできるぜ
264 名前:259 mailto:sage [2008/06/26(木) 17:15:29 .net] >>262 timeを使えば計算時間分かりますね! アドバイスありがとうございますm(__)m すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで 高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体 の計算なので何を計算しているのかイメージが付きにくいんじゃないか? と、言われまして何かイメージが付きやすいプログラムというのは無い でしょうかね・・・? すいません、変な質問をして(汗
265 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 22:30:47 .net] >>263 計算結果を可視化するところまでやるとか。 でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。 あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして 並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
266 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:51:51 .net] >>263 迷路。 ノードごとに探索経路を色分けすればぐー
267 名前:259 mailto:sage [2008/06/27(金) 11:53:25 .net] >>264 >計算結果を可視化するところまでやるとか。 >でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。 そうなんですよね〜 分子力学のプログラムで計算結果を可視化できるものがあったんですが リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。 >あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして >並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。 なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね! アドバイスありがとうございますm(__)m >>265 >迷路。 すいません。 迷路というのは迷路を解くと言う事でしょうか?
268 名前:デフォルトの名無しさん [2008/08/22(金) 20:08:51 .net] すいません MPI初心者です。 windowsでMPIを実行しようとしているんですけどエラーがでて困っています。 インクルドのパスは切っています。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした というエラーがでます。 なんで何でしょう。いきなり初期設定でつまずいて恥ずかしいのですが だれかアドバイスしていただけないでしょうか。
269 名前:デフォルトの名無しさん [2008/08/23(土) 08:45:51 .net] >>267 それで他人になにか状況が伝わるとでも?
270 名前:デフォルトの名無しさん [2008/08/23(土) 18:49:31 .net] C:Program Files\MPICH2\lib C:Program Files\MPICH2\include を追加する。 最低これでエラーはなくなるはずのに認識できない。 メッセージは同様。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした 絶対windowsで同様なエラーが出ている人がいるはず。 MPICH2はwindowsでは無理なのか?
271 名前:デフォルトの名無しさん [2008/08/23(土) 21:20:54 .net] >>269 それで他人になにか状況が伝わるとでも? ソースくらい出せ。 コンパイルオプションくらい出せ
272 名前:デフォルトの名無しさん [2008/08/23(土) 21:22:39 .net] windowsでMPICH2は「余裕で」動いてる。
273 名前:デフォルトの名無しさん [2008/08/24(日) 14:46:18 .net] わかりました。 ウィザードで作った雛形をつかってコピしていたからみたいです。 空のディレクトリをしてしてファイル追加してみるとできました。 ご声援ありがとうございました。何の役にもたたなかったけど(w
274 名前:デフォルトの名無しさん [2008/08/24(日) 20:32:38 .net] >>272 何の役にも立たないのは、お前がなんら情報を出さないからだろ。 自分の低能を棚上げしてイヤミで〆か。 新打法がいいね。
275 名前:デフォルトの名無しさん [2008/08/25(月) 17:29:10 .net] >>273 野球していたが打てなかったので1本足打法に変えました。 するとよく打てるようになりました。 そして解説者に言われました。 新打法がいいね。
276 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:55:04 .net] 自分の考えを人間にすら伝えられないバカは 自分の考えをコンピュータに伝えられるわけがない。 プログラムなんてやめた方がいいよ。
277 名前:デフォルトの名無しさん [2008/09/16(火) 08:21:40 .net] OpenMPIってVistaじゃ使えないの?
278 名前:デフォルトの名無しさん [2008/09/17(水) 03:03:50 .net] なんか荒れてる…w MPICH2いれてBoostのMPI使おうかと思ったが うまくいかね using mpi ; をusr-config.jamに書いたが パスが通ってないと言われる… いい解説サイト知っていたら教えてくださいませ
279 名前:デフォルトの名無しさん [2008/11/01(土) 04:35:50 .net] MPI対応のFFTで、2次元の場合はタイル状に、3次元の場合はブロック状に、 データ分割可能なもの知りませんか? fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
280 名前:デフォルトの名無しさん [2008/12/01(月) 12:33:58 .net] ちょっと質問なんですが MPI_Sendrecvってペアじゃないと使えないですかね? 片方がMPI_Sendrecv もう一方がMPI_SendだけとかMPI_Recvだけとか。 わかる方いたらご教授願いたいのですが。
281 名前:デフォルトの名無しさん [2008/12/04(木) 16:33:04 .net] シングルノードWinXP-Proの環境で、MPICH2に付属ので例題cpi.exeを実行してみたら動きませんでした。 エラーメッセージは特になく、タスクマネージャで確認するとCPUコア数分のcpi.exeが実行中であるのが 確認できるのでが、強制終了する以外コントロールできない状況です。MPICH1ではうまくゆくのですが。 どなたかご教示のほうよろしくお願いします。
282 名前:デフォルトの名無しさん [2009/01/13(火) 08:26:39 .net] 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 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 00:08:03 .net] machinefile または hosts でいけるんじゃないか mpiexec -machinefile mpd.hosts -n 3 a.out www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.0.8-userguide.pdf
284 名前:281 [2009/01/15(木) 03:39:43 .net] >>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のランクの順に出力したい場合はどう修正すればよいでしょうか?
285 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 10:36:11 .net] >>283 別々のプロセスが勝手に出力を出しているのでそうなる。 ノード0 出力が終わったらノード1に何か情報を送る ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信 ・・・ という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
286 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 14:13:53 .net] 最初の頃に買った本紹介しとくよ www.amazon.co.jp/dp/456301544X/ www.amazon.co.jp/dp/4621047736/
287 名前:281 [2009/01/16(金) 09:59:35 .net] >>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
288 名前:デフォルトの名無しさん [2009/01/16(金) 11:11:50 .net] >>286 それ、最終ノードが受信してなくね? printf後にfflushするといいかも それとループするより素直に ノード0 表示 送信 ノード 1...n-1 受信 表示 送信 ノード n 受信 表示 でバラして書いた方が見やすいと思う。 同じコードをたくさん書きたくなければ、受信、送信のところを条件分けで囲ったものの間に共通の表示処理を入れるか。
289 名前:デフォルトの名無しさん [2009/01/30(金) 11:49:31 .net] 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回程度繰り返したところでエラーがでます。 考えれる原因などありますか?
290 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:45:55 .net] >>288 プログラムのどっかでreturn 0かexit(0)してんだろ
291 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:40:48 .net] 質問 コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が No such fileって言われるんだけどこれはどう解決すればいいですか?
292 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:51:35 .net] MPIみたいな、少なくとも大学院クラスの人間が数値解析で使うもののスレにしては エスパーを要請する質問が多いな。 そんな表現能力じゃ論文もかけないだろ。
293 名前:デフォルトの名無しさん [2009/02/02(月) 21:48:5
] [ここ壊れてます]
294 名前:6 .net mailto: >>289 return 0はmain関数の一番最後でしかやってません。 [] [ここ壊れてます]
295 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 21:52:31 .net] >>292 signal9だからSIGKILLだ。 自分で殺してないんだったら、誰かにプロセス殺されてるんじゃないのか。 時間貸しのスパコンとかだったら、一定時間来たらプロセス殺されるぞ。
296 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 13:14:23 .net] どうせおまえさんんが書いたコードのバグだと思うけど とりあえずソースさらしなよ それで解決するかどうかは分からんけど、 少なくとも>>289 みたいなアホは湧かなくなるよ
297 名前:. mailto:sage [2009/02/03(火) 16:56:38 .net] >>294 >>288 から得られる情報は>>289 くらいしかないだろう、実際。
298 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:26:54 .net] >>290 エスパー回答だが、コンパイル時にmpiccを使ってないとか?
299 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:43:21 .net] スパコンのバッチファイルって、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 ----------
300 名前:294 mailto:ponutka29@やふー [2009/02/05(木) 10:25:41 .net] みなさん、丁寧にありがとうございます。 2chにソースはあげたくないので、メール頂けると助かります。
301 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 13:19:21 .net] >>298 いくら払うんだ?
302 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 22:34:17 .net] >>298 どうせ卒論だろ。研究室の先輩に聞けよ。
303 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:59:18 .net] マスタープロセスの処理内で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);
304 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 02:46:50 .net] 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です。
305 名前:302 mailto:sage [2009/03/11(水) 02:59:26 .net] アドレス間違えました。こっちです。 ums.futene.net/wiki/Paralell/4D5049434832206F6E2057696E646F7773204C6F63616C.html
306 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 02:12:20 .net] > 使いたいのはfortran > #include <iostream> > int main(int argc,char **argv) これのどこがFortran…
307 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 18:40:57 .net] >>304 いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。 「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。 分かりにくくて申し訳ないです。
308 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 19:24:10 .net] >>302 プロジェクトのプロパティの Configuration Properties → C/C++ → Precompiled Headers → Create/Use Precompiled Header を Not Using Precompiled Headers にすればいいと思われ。 (VC++ で C のプログラムをコンパイルするときによくハマる罠です。) これは英語版の VC++ 2008 の表記だけど日本語版にも該当する項目があるはず。
309 名前:302 mailto:sage [2009/03/12(木) 20:45:54 .net] >>306 Cの方は出来ました!ありがとうございます。
310 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 21:26:09 .net] 正直、Linux入れてmpif77とかmpiccとかのラッピングされたコマンド使ったほうが楽だろ。 ライブラリが足りないとかそんな次元が自己解決できないようなら。 KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
311 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 23:17:29 .net] >>307 動いて良かったね。Fortran の方は俺は使ったことないので単なる予想だけど mpi.lib の点(ピリオド)が抜けてて mpilib → mpilib.obj と解釈されてるのでは。 あと mpi.lib と一緒に fmpich2.lib も要るかも。 >>308 普段 Windows で暮らしていると実行してデバッグできる MPICH2 for Win32 は とっても便利ですよー。多少苦労しても使う価値があると思います。Windows マシンはありふれているので手近の PC をかき集めて“なんちゃってクラスタ”を 作るといったことも案外簡単にできます。
312 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 07:00:15 .net] >>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さんはどういう環境で使ってらっしゃるんでしょうか?
313 名前:302 mailto:sage [2009/03/13(金) 07:02:25 .net] というかマニュアルに思い切りfortranの場合fmpich2.libを追加してね、と 書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
314 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 10:23:00 .net] >>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 で実行できることに意味があると思いました。
315 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 19:04:32 .net] 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
316 名前:313 mailto:sage [2009/03/14(土) 05:12:50 .net] 他んとこに聞いてみます
317 名前:302 mailto:sage [2009/03/14(土) 18:05:44 .net] >>312 ありがとうございます。 あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな… OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで これからは多少そのへんも自分で勉強してみます。
318 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:15:30 .net] >>314 312に書いたアプリの場合は、実環境で試したところ OpenMP+MPI は素の MPI よりわずかに 遅いかほとんど同じという結果でした。 もっとも、どちらの性能がいいかは問題、ハードウェア、ソフトウェアなどに依存しますし、 最終的にはやってみないと分かりませんので、可能性があると思ったら試す価値があります。 ハイブリッド並列化に興味があるのでしたら次の記事が参考になると思います。 T2Kオープンスパコン(東大)チューニング連載講座(その5) OpenMPによる並列化のテクニック:Hybrid並列化に向けて www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
319 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:17:51 .net] レス番号をまちがえました。316は>>315 宛てです。
320 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:47:30 .net] VS 2008 のExpress EditionはOpen MP非対応じゃなかたか。
321 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 05:57:00 .net] >>318 Windows SDK for Windows Server 2008 and .NET Framework 3.5 を一緒に入れると使えます。 参考:tech.ckme.co.jp/vc.shtml
322 名前:デフォルトの名無しさん [2009/04/02(木) 20:54:42 .net] 初めまして、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が発行され、 値が上手く通信できません。ご指導願います。
323 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 03:39:48 .net] 質問です。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 とでもしないとダメなんでしょうか?どう考えてももっとスマートなやりかたが ありそうなんですがどうなんでしょうか?どなたか教えていただけませんか?
324 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:07:03 .net] >>321 MPI_ALLGATHERV
325 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 04:03:40 .net] お答え頂き有難うございます。ただ、ほとんど基本的なサブルーチンしか使ってないので MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の 位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に 関してはこの通信の前に教えてやる必要があるということになるでしょうか?
326 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 08:34:21 .net] >>323 そうです。
327 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:13:03 .net] なるほど、大体分かりました。mpi_allgathervを使う場合、 num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。 mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので 送信の開始アドレスをずらして指定して大丈夫なんですよね? それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか? あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが… キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
328 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 02:44:25 .net] コード例を示したほうが良さげですね。こういう具合です。 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 のように実行すると 良いような気がします。
329 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 01:08:39 .net] あるある
330 名前:デフォルトの名無しさん [2009/06/03(水) 17:15:01 .net] PVMからMPIに鞍替えしようと思って勉強を始めようと思うのだが 今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
331 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:59:12 .net] >>328 MPIの実装に依存するようなプログラムでも作る気かい?
332 名前:お願いします [2009/06/18(木) 20:47:03 .net] MPIでどうしてもわかりません。 f(x)=x*xの0~1の積分なんですが、答えが通常0.3333となるはずですが なぜ以下のプログラムだと違った答えがでるのでしょうか? すみません、どなたか教えていただけないでしょうか? ちなみにプログラムはよくあるMPI(倍風館)の本のものです。 実行すると0.000488のような値がでてきます。困っています。 どうやれば0.3333みたいな値を得ることができるでしょうか?
333 名前:お願いします [2009/06/18(木) 20:53:12 .net] #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へ */
334 名前:お願いします [2009/06/18(木) 20:53:55 .net] 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);
335 名前:お願いします [2009/06/18(木) 20:54:39 .net] /* 各プロセスの積分を加算する */ 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 */
336 名前:お願いします [2009/06/18(木) 20:55:45 .net] 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 */
337 名前:お願いします [2009/06/18(木) 20:57:04 .net] これと一緒なんです。 tetralog.in/t/?date=20060118 本当よろしくお願いします。
338 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:14:35 .net] まず各ノードのintegralを送信せずに表示してみろよ。 積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。 この程度のことくらいやってから他人に聞けば?
339 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:08:34 .net] >>330 手元で実行してみたが $ mpirun -np 2 ./a.out With n = 1024 trapezoids, our estimate of the integral from 0.000000 to 1.000000 = 0.333333 となったぞ。ハードウェアの構成は何だ?
340 名前:お願いします [2009/06/19(金) 19:45:20 .net] ありがとうございます。 PCクラスタ環境は Fujitsu PRIMERGY RS200 ×16台 Xeon 3.20GHz/L3:1MB ×2 2GBメモリ 146.8GB HDD ×2(RAID1利用のため実効はこの半分) 73GB HDD ×5(RAID5利用のため実効はこの4/5) こんな感じです。
341 名前:お願いします [2009/06/19(金) 20:10:05 .net] 見直したんですがやっぱり出てくる答えは0.000488になって正しくないです。
342 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 21:01:54 .net] >>339 だからよ、まずは積分単体が戻す答えを見て見ろっての。 どうせなにかの打ち間違いだろ。
343 名前:デフォルトの名無しさん [2009/06/19(金) 21:04:22 .net] MPIがおかしいと思うなら、そんな積分した答えじゃなく、1とか単純な値を送信しろよ。 自分で問題切り分ける意思がゼロだな。
344 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 04:41:49
] [ここ壊れてます]
345 名前: .net mailto: 本当にコピペしたコードそのままで打ち間違いが無いのなら、 まずはMPI部分を全部削って1CPUで動かしてみろよ。 [] [ここ壊れてます]
346 名前:お願いします [2009/06/20(土) 12:43:17 .net] MPI部分なしでやれば0.333でます
347 名前:デフォルトの名無しさん [2009/06/20(土) 18:44:42 .net] Mac用のMPIはどこで手に入りますか?
348 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 18:45:15 .net] MacにはOpenMPIが入っているが
349 名前:デフォルトの名無しさん [2009/06/21(日) 07:22:30 .net] 通常のGigabitイーサネットとInfiniBandではMPIを使った際にどの程度差が出ますか? もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
350 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 19:20:41 .net] >>346 自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、 InfiniBand環境でどれくらい改善するか、予測が付くだろう。 あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、 並列化効率がでない場合も多いので、この点も注意した方がいい。
351 名前:デフォルトの名無しさん [2009/07/06(月) 06:59:07 .net] MPIの本を読むとSendとReceiveって奇数ノードと偶数ノードそれぞれ順序を逆にして書かないとデッドロックが発生するようなのですが、 今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。 OSか何かに依存するのでしょうか?
352 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:10:54 .net] MPI_SendとMPI_Recvは送受信が完了するまで戻ってきませんが。 MPIの仕様なのでOSには依存しません。 別に偶数ノードと奇数ノードとか関係ありません。 送信と受信が対になって実行されないといけないだけです。 ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、 別の関数で送受信が完了しているか確認をとる必要があります。
353 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:46:09 .net] >>348 どの本のどういう記述よ
354 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:04:08 .net] そういえば、標準モードでMPIが勝手にバッファリングモードを使用していたら対応する受信が起動ていなくても戻ってくるか。 そういう意味ではMPIの実装依存でデッドロックが起きていないということになるわな。
355 名前:デフォルトの名無しさん [2009/07/07(火) 16:32:14 .net] 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 個 ローカルに渡す)方法を ご存じでしたら教えて頂けないでしょうか? 初心的な質問ですみません。
356 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:07:19 .net] >>352 つ MPI_TYPE_VECTOR
357 名前:デフォルトの名無しさん [2009/07/07(火) 20:32:32 .net] >> 353 神様、仏様、353様! 早速お教え頂きありがとうございました。
358 名前:デフォルトの名無しさん [2009/07/24(金) 16:46:11 .net] MPICH2とOpenMPIを使い分ける基準ってなんなのだろう 構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
359 名前:355 [2009/07/24(金) 16:49:25 .net] ちなみに自分のはMac OS XなのでOpenMPIが標準で入っているそうですが (XgridもOpenMPIを通して使うそうですね) MPICH2のほうはどうなのか、ちと気になりましてw
360 名前:デフォルトの名無しさん [2009/09/06(日) 10:48:01 .net] mpif77 でコンパイルは出来るのですが、 実行時 に mpirun -np 4 tttt と入力すると error while loading shared libraries : libompi_f77.so.o cannot open云々 となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
361 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 11:37:43 .net] >>357 実行時に .so ファイルを探したが見つからないというエラーなので適当な設定を加える必要がある。 libompi_f77.so のあるディレクトリを仮に /opt/lib とすると a) コンパイル時に -Wl,-rpath,/opt/lib オプションを指定する b) 実行時に環境変数 LD_LIBRARY_PATH=/opt/lib を設定する c) /etc/ld.so.conf に /opt/lib を追加して ldconfig コマンドを root 権限で実行する のどれかをすればいいと思われ。 a) は gcc のオプションで他のコンパイラにも同じようなオプションがある(はず)。 b) の環境変数の指定方法はあなたが使っているシェル(bash とか tcsh とか)によって違うので調べて。 c) は Linux の方法で、他の OS だとファイル名が違うかも知れない。
362 名前:デフォルトの名無しさん [2009/09/06(日) 13:37:28 .net] サンプルプログラムを実行することができました。有難うございます
363 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 16:07:43 .net] rank数が0から始まるとちょっと使いにくいんですが、 勝手に include 'mpif.h' call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world,np,ierr) call mpi_comm_size(mpi_comm_world,npe,ierr) np=np+1 ってやって使っても問題ないでしょうか?
364 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 18:29:39 .net] 好きにせぇや
365 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 00:13:13 .net] すいません、Visual studioのスレで聞いたんですが、 こっちで聞いた方が良いとのことでこっちにきました。 Visual studio2008+MPICH2+ifortranを使ってます。 ブレークポイントやステップ実行などが使いたいのですが、 デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。 msdn.microsoft.com/ja-jp/library/ms164731.aspx 上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、 デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、 また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています) ちなみにデバッグなしで開始なら問題なく実行できますが… 今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、 さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、 どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって 足りない情報などあればご指摘ください。
366 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:43:11 .net] >>362 VSスレの方がいいんじゃねーかな。 windowsでMPI使う物好きは少ないと思うし。 つーか、モロにVSの使い方だし。
367 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:53:16 .net] 質問です。fortranで配列の要素数をプロセス数に応じて決めたいのですが、 どのように宣言したらよいのでしょうか?allocateを使うしかないでしょうか? 77では無理ですか?
368 名前:デフォルトの名無しさん [2009/10/14(水) 11:12:10 .net] call mpiplay(n) subroutine mpiplay(n) real data(n) とか、かな。Initializeやfinalizeはメイン階層でしてね。 もっとも今は77とそれ以降を混ぜて書いても解釈してくれるから allocate でがんがんやっても良いと思うけど。
369 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 19:51:56 .net] >>365 なるほど。動的配列を使うまでもなくそれでいいのですか。 ありがとうございます。もう一つお聞きしたいのですが、 メインでもその配列を使いたいときはどうすればよいでしょう? rank等の取得の前に宣言部が来るのでそのやり方では出来ないでしょうか? ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
370 名前:365 [2009/10/15(木) 05:59:50 .net] 365の例では サブルーチンでの型宣言 integer n とMPI呼出呪文w include 'mpif.h' が抜けてたね。 呪文はメイン階層でもする必要があるけど。 >>366 配列の要素数を、例えばプロセス数の100倍にしたければ、 program mpiwrapper (略;なんか行があったりなかったり) include 'mpif.h' (略、宣言部とか) call mpi_init(ierr) (略) call mpi_comm_size(mpi_comm_world,nprocs,ierr) n=nprocs*100 call mpiplay(n) (略) call mpi_finalize(ierr) stop end program mpiwrapper subroutine mpiplay(n) include 'mpif.h' integer n real data(n) (略) call mpi_comm_rank(mpi_comm_world,myrank,ierr) (略;分割対象のループがいっぱい。初期化とかiteration処理とか) (略その2;data配列をmainにお持ち帰りできないので書き出しとかはこの階層で) return end subroutine mpiplay かな?wrapperの表現が適切かはちと疑問だけど、まあここではOKということで・・・。 この例だと変数の初期値代入から書き出し保存などは全部 mpiplay(n)階層ですることになるね。
371 名前:デフォルトの名無しさん [2009/10/15(木) 06:29:09 .net] そんなわけで、fortran77コンパチで且つ前もって配列サイズを決めなくて良い、というのは できるけど。めんどいよねw. 自分自身はコマンドラインの引数を使いたい、 計算コード自身は77で書いてしまった、の2つの理由で メイン階層のWrapperをCでつくる事が多いけど。上の例は良くつかう。 やはり、というか配列サイズが前もって決まっていないタイプのコードは 最適化が抑制されるのか、遅いね。まあいちいちコード編集&コンパイルの 手間がかからないから楽といえば楽だけど。
372 名前:デフォルトの名無しさん [2009/10/15(木) 06:37:31 .net] だらだら書いてしまったけど・・・・ >>366 ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか? にYes!と書けば終わりだったな・・・・w 早起きはするものではないね。
373 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 05:54:20 .net] >>369 いえ、結構怪しかったんで具体的に書いてもらって助かります。 丁寧に教えてくれてありがとう。
374 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:52:34 .net] すみません、もう一つ質問なんですが、 vel(3,m) pos(3,m) (それぞれm番目の分子のxyz座標の速度と位置)を buffer(6,n) 1~3に速度(vel)を、4~6に位置(pos)をというように一つのbufferに詰め込んで 別のプロセスに送りたいんですけど、一回のアクセスで送り先のvel,pos両方に 格納することって出来ますか?別々にやらないとだめでしょうか? それとも受信用の配列(rbuffer(6,n))とか用意して、別の処理で受信用bufferから vel,posにそれぞれ移し替える方がよいでしょうか? ちなみに送られる分子のmは不連続なので送る過程ではbufferに詰め込んでますが、 送り先では送り先にある最大の分子の番号の末尾から連続で入れればよし、というような状況です。 (送り先に既にm個あったらm+1~m+nまで) 基本的に通信回数は減らした方がパフォは上がるという認識で良いですよね?
375 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 05:40:13 .net] ・・・ラグランジュ法的な粒子なのね。 隣接関係(最近接の粒子番地)がころころかわるから厄介そう。 前半最後の2行が王道だとおもう。型の同じ変数は一つの配列名のに付けてから一度に送受信。 いっそ、最初からvelpos(6,m)みたいに位置や速度の情報を一つの大きめの配列にまとめちゃう方が いいかもね。vi(m) とか sed だと、 1,$s/pos(1/velposi(4/g 1,$s/pos(m/velposi(3+m/g みたいな感じでわりと一括置換が効きやすそうだし。 ・・・・・恐いけどw
376 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 06:45:10 .net] >>372 うーん、やっぱそうですか。たびたびありがとうございます。 ちなみに代入はf90が使える場面なら PV(1:3,m+1:m+nmbuf)=rbuffer(1:3,1:nmbuf) PP(4:6,m+1:m+nmbuf)=rbuffer(4:6,1:nmbuf) みたいにループ使わずに書く方が速度的にもいいですか? (上であってます?間違いや冗長なところありますかね?) 上は簡略化してるんですが、実はもう少し複雑なので あまりパフォが違わないなら慣れた添え字ループの代入が無難かな。 情けない話ですが出来る限りコマンドラインを避けてるのでviとかsedとかの話あまり分かりません。 でもそれで置換出来るならプログラム書く効率あがりそうですね。覚えた方がいいと思いつつ… 統合環境がそういう複雑な置換装備してくれたらいいのにな。甘えすぎですか。
377 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:38:00 .net] >>373 例では第一添え字が6要素だから、 do i=1,nmbuf pv(1:3,m+i) = rbuffer(1:3,i) pp(1:3,m+i) = rbuffer(4:6,i) enddo にするといいかな? 右側の要素を:つかって範囲指定すると遅くなることが多い・・・とおもう。 実装にも依存するけど、ベクトル的表現は第一添字(右端)だけに しておくのが安全&安心。 エディタでの一括置換は楽だけど諸刃の剣w
378 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:39:35 .net] 第一添字(右端) ↓ 第一添字(左端)
379 名前:デフォルトの名無しさん [2009/10/20(火) 06:46:25 .net] インテルコンパイラだけど、MPI使うには、インテルの売ってるやつを使わないといけないの?
380 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 22:03:31 .net] 何でもええ。 ライブラリがリンクできれば。
381 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 02:41:08 .net] MPI はコンパイラもだけど mpirun がないと。 自宅で文法チェックするだけなら -I -L
382 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:52:21 .net] max plunk institute !
383 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 06:45:10 .net] >>374 遅くなったけど本当にどうもありがとう。うまくできました。 ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで 3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?
384 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 20:05:53 .net] 最近HyperThreading対応の4coreのCPUが家庭向けの値段まで落ちてきたので 購入したのだが、ここまでスレッド数が多くなるとメモリ帯域か何かが溢れて 評価しないと使えないな。 同じプログラムが、 Pentium4 2.8GHz(1core * 2スレッド)ではMPIで2プロセス走らせると1.6倍ぐらい速くなったけど、 Corei7-860(4core * 2スレッド)ではMPIで8プロセス走らせると4プロセスに比べて0.9倍 ぐらいに遅くなったよ。
385 名前:デフォルトの名無しさん [2009/10/26(月) 06:36:28 .net] core i7か・・・いいな。このお金持ちめw いくらだった? 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? 職場での印象では mpirun がメモリアクセスのスケジューリングを うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。 やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。 ・・・・OpenMPだともう少しマシな数字がでてくるのかな?
386 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 06:42:32 .net] >>381 CPU とプロセス(またはスレッド)のアフィニティはどうしてる? プロセス数が多くなればなるほど、きっちり固定してやらないと パフォーマンス低下の原因になる希ガス。
387 名前:382 mailto:sage [2009/10/26(月) 07:00:00 .net] OpenMPはデフォだとうろうろするのは知ってたけど。 MPIも固定しないのか・・・知らんかった・・・。
388 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 09:46:19 .net] windowsだとOSがウロウロさせるんだけど。 高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。 LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
389 名前:381 mailto:sage [2009/10/26(月) 23:47:19 .net] ふと4とか8プロセスとかとか切りのよい数字じゃなくて5とか6プロセスで 実行したらどうなるんだろうと思った。 現在1〜8プロセスの全てのパターンをベンチ中。多分終わるのは明日。 > core i7か・・・いいな。このお金持ちめw いくらだった? 再利用などしたので、マザボとメモリとCPUしか買ってませんが、46,675円 > 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? そういう事です。 > CPU とプロセス(またはスレッド)のアフィニティはどうしてる? そのあたり詳しくないのでほとんど設定変更せず使ってます。 ちなみにOpenMPI/CentOS5.4です。
390 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 16:27:05 .net] Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。 マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、 マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
391 名前:デフォルトの名無しさん [2009/10/28(水) 02:43:34 .net] Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?
392 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:57:18 .net] HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。 アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、 コア間で依存性があった場合は注意が必要だと思う。 HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。 ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
393 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:59:50 .net] >>384 そりゃそうでしょ。MPIだってコアの指定をしないとだめ。 もちろんPthreadでも。
394 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 03:24:38 .net] いわれるとそりゃそうだわ、なんだけど 383のを見るまで気づかんかったw OpenMPだと dplace や taskset で固定できるけど、 これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?
395 名前:381 [2009/10/28(水) 21:52:47 .net] >>386 悪禁になってしまったのだが結果だけかくと 5プロセスで走らせると最速のようです
396 名前:デフォルトの名無しさん mailto:sage [2009/10/29(木) 01:33:12 .net] >>392 それだとメモリアクセスが一番のボトルネックじゃない? ちょうど5コアでいい感じでメモリ帯域を食ってくれて、それ以下だと使い切れなくて、 それ以上だといっぱいになってしまう。 という感じに思える。
397 名前:デフォルトの名無しさん [2009/10/29(木) 03:41:16 .net] そんな感じっぽいね。381氏の実験に感謝。 最近はベクトル化を意識してループを短くして,(メモリでかくなったから)配列に中間結果を格納して・・・ というのがスパコンでは流行、というか推奨されるけど、HTでは ループ内での処理が冗長なベクトル化をあまり意識してないw古いタイプの コードが並列化では利得が大きいかも・・という事なのかな。 いまはCacheも大きいからたいがいループ内が長くても収まるし。
398 名前:デフォルトの名無しさん [2009/12/04(金) 22:16:21 .net] mpiの勉強を始めたばかりの者です。今、Bcastをやっていますが、どうにも解らなくなりました。ご指導ください。 使っているコンパイラー等はGfortran、open mpiです。解らなくなったのは、メインでBcastを使っても問題ないのですが、 サブルーチンでBcastを使うとエラーが発生してしまうんです。なんででしょうか?ちなみにプログラムは以下のとおりなんですが。 * MPI 宣言文 * IF(Nrank.EQ.0) NCP1=1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) * KKK = 100 NNN = NCP1 + Nrank*KKK PRINT *, NNN これは問題なく動きますが、 IF(Nrank.eq.0) NCP1 = 1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) 部分を IF(Nrank.EQ.0) CALL MAINSUBとし、サブルーチンを SUBROUTINE MAINSUB IMPLICIT REAL*8(A-H,O-Z) COMMON /ACTIVE/ NCP1 * NCP1 = 1000 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr) * RETURN END として、コンパイルし実行すると、 1000、 100、200、300と画面に出力され、notice thatjob rank 1 with PID 4737...の メッセージが表示されますが、何故か原因が解らないのです。よろしくお願いします。
399 名前:デフォルトの名無しさん mailto:sage [2009/12/04(金) 22:49:20 .net] >>395 サブルーチンMAINSUBの中でmpif.hのインクルードしてる?
400 名前:デフォルトの名無しさん [2009/12/05(土) 07:53:23 .net] 395 ですがやっていません。やってみます。
401 名前:デフォルトの名無しさん [2009/12/05(土) 08:04:52 .net] 395 ですが、動きました。どうも有難うございます。
402 名前:デフォルトの名無しさん [2009/12/12(土) 13:25:37 .net] WindowsでMPIをつこうたプログラムをコンパイルしたいのですが、 Windows XP+Vistal C++ 2008 Express以外に、どれをインストールすればよいのでしょうか?
403 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:30:24 .net] MPICH
404 名前:デフォルトの名無しさん [2009/12/20(日) 02:28:58 .net] MPIってユーザーグループの会とか友の会とかないんですかね?? もしなかったら作ってみたいなっと思いまして.2ヶ月に一度くらい勉強会とかライトニングトークしあう的な規模のもので.
405 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:22:07 .net] あんなもん、一旦意味がわかればマニュアル見るだけでOKなので 2ヶ月に一度とかタルいことしてたら、次の勉強会までにプログラムできるようになっている。 てか、それでできない人間だけ集まっても意味ないし、できる人間は参加してもタルいだけだろう。
406 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 11:52:25 .net] プログラムのほとんどを1スレッドで走らせ、一部を並列計算させたい場合、 その一部以外を if(myrank==0) で囲えばいいの?
407 名前:デフォルトの名無しさん [2009/12/20(日) 13:09:48 .net] うん、たいていそれでいいよ。 非並列処理部分の結果を並列部分で使いたい時だったら ちゃんと伝達するのを忘れないように><
408 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 05:10:55 .net] ですよね なんとなく「プログラムのほとんどが if 文」ってのが違和感なんだけど 他に書き方ないよね
409 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 09:37:58 .net] そうそう、なんかif (myrank .....が冗長に出てくるのがなんかイヤw 並列の出入口でやることが決まっていれば関数に押し込めるけど、そういう事ってあまり多くないし 引数受渡し部分でちょんぼすることあるし・・・><
410 名前:デフォルトの名無しさん [2009/12/23(水) 09:49:25 .net] 現在勉強中で、Send、Recvを使って簡単なプログラムを作って動かしていますが、送るデータの個数が 500以下だと問題なく送受でき、送受結果を画面に表示できるのですが、500個を超えると送受結果が 画面に表示できません。プログラムが暴走したような状態になってしまうんです。 データの型は倍精度浮動小数点なんですが、解決策は無いでしょうか?使用している mpiは openmpiです。
411 名前:デフォルトの名無しさん [2009/12/23(水) 10:52:26 .net] 受信側のメモリを確保しているのかと3秒問いつめたい
412 名前:デフォルトの名無しさん [2009/12/23(水) 12:40:54 .net] 407ですが、受け側でも送り側と同じ配列だけメモリーは設定しております。 当初は配列をアロケートしていましたが、疑問に思い、配列を設定して 再コンパイルして実行しても同じなんですが。
413 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:05:15 .net] 他人に自分の意志を伝えられない奴が コンピュータに自分の意志を伝えるプログラミングができるわけがない。 ソースもなしに・・・エスパーも求もと書いとけ。
414 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 20:24:15 .net] openfabrics.orgがつながらない、、、
415 名前:デフォルトの名無しさん [2009/12/28(月) 22:57:30 .net] 先日、Bcastの件で指導を頂いたものですが、今回、ScatterとGatherについてご指導願います。 プログラムは program TEST implicit real*8(a-h,o-z) : : MPIの使用開始の手続き : dimension a(2000),b(2000) ! if(Nrank.eq.0) then do i=1, 2000 a(i)=dble(i) enddo endif ! call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision,b(1),20,0,MPI_COMM_WORLD,ierr) ! if(Nrank.gt.0) then do i=1, 20 print *,Nrank,b(i) :この部分で画面に出力 enddo endif ! iiii = 1 + Nrank*10 call MPI_Gather(b(1),10,MPI=DOUBLE_Precision,a(iiii),10,MPI_DOUBLE_Precision,0,MPI_COMM_WORLD,ierr) : として、実行したのですが、画面出力部分では、出力値が全てのランクで0.0となるんです。 当然のことながらGatherでも同様なんですが、どうやった良いのか原因も何も解りません。どうかご指導ください
416 名前:デフォルトの名無しさん [2009/12/28(月) 23:06:52 .net] 失礼しました、 Scatterで...,b(1),20,の後にMPI_DOUBLE_Precision,を書き漏らしております。 質問時の記入ミスです。すみません。
417 名前:デフォルトの名無しさん [2010/01/06(水) 09:09:27 .net] これで出力が出ます。 それとGatherの方で MPI=DOUBLE_Precision の=が_の間違い。 a(iiii)は、ランク0に送るなら ランク0の受信バッファーを指定するので多分a(1)です。 implicit real*8(a-h,o-z) include'mpif.h' dimension a(2000),b(2000) call mpi_init(ierr) call mpi_comm_rank(mpi_comm_world,Nrank,ierr) if(Nrank.eq.0) then do i=1, 2000 a(i)=dble(i) enddo endif call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision, & b(1),20,MPI_DOUBLE_Precision, & 0,MPI_COMM_WORLD,ierr) if(Nrank.gt.0) then do i=1, 20 print *,Nrank,b(i) enddo endif call mpi_finalize(ierr) end
418 名前:デフォルトの名無しさん [2010/02/08(月) 17:39:36 .net] PCだと大丈夫なんですが、大規模な計算機にジョブを投げたとき、 あるプロセスからの出力だけ途中で止まることがあります。 PCはintel fortran+mpich、大規模計算機はPGIfortran+Voltaire MPIです。 例えばプロセスごとにoutput00,output01,output02,output03のように 別のファイルに出力させているんですが、何かの拍子にいくつかが出力 されなくなったりします。ループの途中にbcastやbarrier等の同期があるので、 出力がないプロセスも計算そのものが停止しているということはないと思うのですが、 別のファイルや標準出力への出力も停止するのでうまく調べきれず、定かではありません。 かなり情報が少なくて申し訳ないのですが、考えうる原因、調査法、解決法もしくは それに至らなくとも何か思いついたことでもあれば教えて頂けませんか?
419 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 19:42:12 .net] >>415 2桁のファイル名を決める整数が 違うプロセスで同じ整数になっちゃって・・・とか とびとびになってしまって、とかは無いのかな? PCとスパコンで違う並列数でやっておかしくなったのなら 同じ並列数(2とかw)でやってテストしてみては? CPUが自分のプロセス番号(例題でよく変数名Myrankになるやつ) を決める部分のチェックとかもやるといいかも。 とあるシステムでちゃんと動いてるので415さんのMPIの (データ転送とかの)部分にミスがあるとは考えにくい、 という推定からすると他にはあまり思いつかないな。
420 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:30:15 .net] >>415 ノードローカルのディスクに書いてるとかいうオチならブチキレ
421 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 02:35:40 .net] でもたいていのシステムではジョブ終了時に一箇所にまとめるから 少なくともジョブ終了後にユーザーがファイルを移動する操作を する必要は無いような気もするけど・・・・ その可能性は大いにあるね。
422 名前:デフォルトの名無しさん [2010/02/10(水) 18:08:04 .net] 問題のプロセスはファイル出力はせずに計算はちゃんと終了してるの? mpi_finalizeを実行せずに終了してるのでは?
423 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 20:33:47 .net] MPI_Finalizeとファイル出力はなんも関係ない
424 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 10:58:34 .net] MPI_Finalizeとファイル出力はなんも関係ない => MPIとファイル出力はなんも関係ない => このスレとファイル出力はなんも関係ない
425 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 12:03:48 .net] アホかいな MPI_Finalizeしなくても、ファイル出力していればファイルはできてるし、ジョブが死ぬときにファイルがクローズされるからそのときにフラッシュされるわけで MPI_Finalizeしないことがファイルができないこととは無関係だっつってんだよ。
426 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 21:49:22 .net] LAM/MPIか何かでMPI_Finalizeを呼ばずにプログラムの実行を終了すると 次回以降のプログラムの実行がおかしくなることがあった希ガス。 確かlambootし直すと正しく実行できるようになったから、裏方のプロセスが 狂ったんだろうな。そういう状況ではファイル入出力が一部おかしくなっても 不思議ではない。
427 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:16:52 .net] 標準入出力はともかく、ファイル入出力をリダイレクトなんかしてませんよ。 途中でプロセスを頃したらmpichでもおかしくなることがあるが、あくまで通信に失敗すると言う次元のおかしくなり方だから。
428 名前:デフォルトの名無しさん mailto:sage [2010/02/11(木) 23:37:48 .net] Finalizeを指定しなかったために通信がおかしくなって、 それによってプログラムの動き(例えば通信結果によってif文の判定を行っている)が変り、 ファイルへの書き出し部分を通過しなくなったというのは?
429 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 01:10:41 .net] 先に他のジョブが終わるってこと? つーか、その程度のミスならPCでマトモに動くとは思えないけど。
430 名前:デフォルトの名無しさん mailto:sage [2010/02/12(金) 15:46:16 .net] 他のジョブとは関係なく、 一つのジョブで、MPI_Finalizeを指定しないで終了するプロセスがあると 通信がおかしくなることがあったと思う。
431 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 20:26:46 .net] >>29 ん?じゃぁ宛先はドコに置くん?
432 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 21:14:35 .net] >>428 メインプロセスがチャイルドプロセスを立ち上げる。 実装によるが、そのとき引数にチャイルドプロセスの情報を加える。 MPI_Initでargc, argvが要求されるのはそのため。
433 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 13:33:36 .net] MPI_Comm_size(MPI_COMM_WORLD,&numprocs); N_local = N_global / numprocs; double u_new[N_local + 2], u_old[N_local + 2]; こうやったら、Integer constant expression requiredって言われました どうすればいいの?
434 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 19:29:59 .net] >>430 MPIの前にCの勉強をしろカス といいたいところだが親切な俺様が教えてやろう C89, C++では動的配列は使えない。 mallocかnewで確保汁!
435 名前:デフォルトの名無しさん [2010/03/20(土) 18:01:31 .net] 三次元空間での拡散方程式の解法でお薦めのものを教えてください。 格子は150x150x150で、線形の拡散方程式です。
436 名前:デフォルトの名無しさん [2010/03/24(水) 06:27:04 .net] 自分で作るw ・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。 MPI版あったような・・・気がする。気がする、ばかりでなんだが。 それを元にして、というのも。 ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
437 名前:デフォルトの名無しさん [2010/03/24(水) 10:20:58 .net] コンパイルオプションで倍精度を指定した場合ってmpiの関数が送受信する データはどうなりますか?書き換えが必要ですか?
438 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 13:18:17 .net] >>434 Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、 自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど ・・・・忘れたwときがイヤなのであまり満足していない。 プリプロセスもクレバーに使えばコンパイル時に とあるオプションが使われたときにだけONになるように出来るハズだけど 使い方がいまいちわからんw この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
439 名前:デフォルトの名無しさん mailto:sage [2010/03/24(水) 21:28:25 .net] 面倒くさいのでMPI_BYTEで送ってる。 個数を配列の長さ*sizeof(TYPE)にして。 fortranでこんなことができるか知らんけど。 エンディアンがあってないと大変なことになるが気にしない。
440 名前:435 mailto:sage [2010/03/25(木) 03:25:12 .net] 賢者あらわる。なるほど。ためしにFortran で real r r = 1.0 if sizeof(r) .eq. 8 then call mpi_send(...,mpi_double,....) else call mpi_send(...,mpi_float,....) endif をつくってみたけど、コンパイル時のオプションで振舞がちゃんと変わった。 例では r は単精度か倍精度かの判定用のダミー、のつもり。 値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
441 名前:434 mailto:sage [2010/03/26(金) 17:48:06 .net] >>436 ありがとうございます!出来るんですね。 >>437 436さんの文章だけ見てもぱっと分かんなかったんで助かります。 試してみます。 もう一つ、mpich2って使ってる人いますか? mpi_in_place使えるはずと思うんですが、mpi_reduceの中で使ったところ、 Invalid buffer pointerってエラーが出て使えません。 多分何かとんでもない勘違いしてそうなんですが、どこがおかしいでしょうか? ちなみにこんな感じです↓ mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
442 名前:436 mailto:sage [2010/03/26(金) 19:38:08 .net] 俺がやってるのは double a[N]; MPI_Send(... N, MPI_DOUBLE, ...) の代わりに MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...) なんだが。 これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。 >>437 だと新しい型を増やす度に条件分岐が増える。
443 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 02:01:35 .net] > MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...) なるほど!
444 名前:デフォルトの名無しさん mailto:sage [2010/03/27(土) 12:13:43 .net] if (myrank==0) then call mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr) else call mpi_reduce(sumofv,iwork,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr) endif
445 名前:デフォルトの名無しさん [2010/04/04(日) 09:08:14 .net] ダグ番号って例題だと0だけど、複数の通信がシステム全体で走ってるときも0でいいのかな? ・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、 同じタグ番号でも困らないような気はするけど。
446 名前:デフォルトの名無しさん [2010/04/14(水) 10:18:20 .net] ubuntu9.10にOpenMPIをapt-getでインストールしました 。 インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか? 何か設定で切り替える方法があれば教えてください
447 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 01:33:13 .net] arkouji.cocolog-nifty.com/blog/mpich2/index.html ここの通りにやってサンプルを使った 円周率の計算まではできたんですけど 自分で書いたC, C++を動かすことができません とりあえずプロジェクトをいじってるんですがそれでいいんでしょうか? 何か留意点などありますか?
448 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 01:39:49 .net] windows版のmpichはmingw gccでもリンクできるからgccで作った方が早い。 mpi自体の設定もLinuxの方が簡単。
449 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 10:35:03 .net] 最近勉強を始めました。 並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。 とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか? codepad.org/13tw3pKS アドバイスお願いします。
450 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 00:58:42 .net] >>446 で、技術料はいくら払うんだ?
451 名前:デフォルトの名無しさん [2010/04/30(金) 06:33:21 .net] $200
452 名前:デフォルトの名無しさん [2010/05/10(月) 05:36:11 .net] OpenMPIとMPICH、どちらをインストールしたらよいのでしょうか それぞれの利点欠点を教えてください
453 名前:デフォルトの名無しさん [2010/06/12(土) 19:14:06 .net] MPICH2 1.0.7rc1 + g95 + cygwin の環境下で、以下のようにバックグランド実行させているのですが、 >nohup mpiexec -np 4 ./a.out >& log.txt & 標準出力(log.txt)に下記のようなメッセージが大量に書き込まれてしまいます。 これを表示させない方法はないでしょうか? (handle_stdin_input 1067): stdin problem; if pgm is run in background, redirect from /dev/null (handle_stdin_input 1068): e.g.: mpiexec -n 4 a.out < /dev/null &
454 名前:デフォルトの名無しさん mailto:sage [2010/06/12(土) 23:35:54 .net] >>450 メッセージに書かれている通りのことをやればいいだけ
455 名前:デフォルトの名無しさん [2010/06/13(日) 04:24:41 .net] >>451 ありがとうございました。確かに入力用にこれを指定すると出なくなりました。 しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、 このようにしたのですが、それはマルチノードの設定の問題でしょうか。
456 名前:デフォルトの名無しさん mailto:sage [2010/06/13(日) 10:55:37 .net] 何をやったらどんなエラーが出たのか書けよ
457 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 22:05:53 .net] PhenomII x6 1090Tを3.2GHzから4GHzにOCして、MPIでバカ並列の数値計算 プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。 殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、 計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。 ふと、OCやめて定格に戻したら、まともな速度が出るようになった。 なんてこった。どうやらOCで逆に遅くなる事があるようだ。 OCする場合とOCしないときと速度比較してみる価値あるかもよ。
458 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 22:47:52 .net] MPI使った計算なんて遊びじゃないんだからOCなんて普通しねーっての
459 名前:デフォルトの名無しさん mailto:sage [2010/06/16(水) 23:29:08 .net] まぁそうだな。奇特な人向けの情報です。
460 名前:デフォルトの名無しさん mailto:sage [2010/06/17(木) 19:01:17 .net] 遊びじゃないのにOCするのってダメなのかな 通常のOCのリスク(熱・故障等)以外に、結果が狂うとかある?
461 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 00:53:44 .net] >>457 狂った事あるよ。 デカイファイルが出力されるプログラムを実行させてたときに ./a.out | gzip > out.txt.gz とかやってたんだが、out.txt.gz をgzip -d で解凍させたら壊れて ますとエラーが出たので気が付いた。OCでgzipがまともに動作し なかった模様。多分計算結果も壊れてたんだろうな。 てかgzipで圧縮してなかったら計算結果が壊れてる事に気がついて なかった罠。
462 名前:デフォルトの名無しさん mailto:sage [2010/06/18(金) 01:00:23 .net] いやしかし、そろそろMPIに厳しい時期になりましたなぁ。 そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている から1100Wの電熱器付けているようなもんだからなぁ。
463 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 14:37:03 .net] >>459 台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w (一台あたりの話) 作業配列をunsignedからunsigned charにしただけで、1.2倍。 昔のCPUは1byteアクセスはペナルティ高かったような… PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
464 名前:名無しさん@そうだ選挙に行こう mailto:sage [2010/07/10(土) 19:12:52 .net] コンパイラや最適化の影響があるかも知れない。 単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
465 名前:460 mailto:sage [2010/07/10(土) 23:39:18 .net] >>461 単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。 CPUがPhenom II 945だしインテルコンパイラーつかえねー
466 名前:460 mailto:sage [2010/07/12(月) 23:52:31 .net] 最適化を推し進めていくと、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
467 名前:デフォルトの名無しさん [2010/07/14(水) 03:12:44 .net] >>458 そんなこともあるんですか あまり欲張らないでおこう
468 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 16:19:27 .net] MPIを使わずに馬鹿並列をする簡単なフレームワークないですかね? MPIをインストールするのめどい。 やって欲しい事は、32coreのマシンと、数千個のファイルがある。 .a.outにこのファイルを一つづつ渡して実行してほしい。処理が終 わったら続いてファイルを渡して処理をして欲しい。同時に32個 のa.outを実行しつつ、処理が終わったa.outがあったら残りの ファイルをa.outで処理してほしい。
469 名前:デフォルトの名無しさん mailto:sage [2010/07/14(水) 16:24:10 .net] ↑ それぞれのa.outは処理時間が一定ではありません。
470 名前:デフォルトの名無しさん mailto:sage [2010/07/15(木) 00:26:56 .net] 妥当なところは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); } 結構適当に書いたけど、こんな感じ?
471 名前:デフォルトの名無しさん mailto:sage [2010/07/15(木) 22:00:42 .net] ありがとうございます。OpenMPでそんな事ができるんですね。 gccも4系はサポートしているみたいですので、試してみます。
472 名前:デフォルトの名無しさん mailto:sage [2010/08/07(土) 11:07:24 .net] この辺でもみてくださいな。 一見正しく動いていても、OCで遅くなったり計算間違ったり ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/454 ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/458
473 名前:デフォルトの名無しさん [2010/09/12(日) 06:01:26 .net] 465-466 で処理量が一定でないとの事だから、 >>467 さんの schedule(dynamic,1) は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。 頑張ってね〜。
474 名前:デフォルトの名無しさん mailto:sage [2010/10/03(日) 18:04:08 .net] MPI導入の話なのですが… MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。 日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
475 名前:デフォルトの名無しさん [2010/10/12(火) 03:47:24 .net] MPIでコンパイルしているかどうかをコンパイル中に#ifdefで判別したいのですが、 どれがdefineされているかを調べれば良いのでしょうか?
476 名前:デフォルトの名無しさん [2010/10/22(金) 10:35:24 .net] Ubuntuでintelコンパイラを使ってMPIプログラムをコンパイルしたいのですが、 apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する 方法がわかりません。 やり方を教えてください
477 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 02:32:25 .net] www.google.co.jp/search?q=ubuntu+icc&ie=utf-8&oe=utf-8 なるほど分からん
478 名前:デフォルトの名無しさん mailto:sage [2010/10/24(日) 02:44:51 .net] gcc -E -dM -xc /dev/null 定義済みマクロ wikiwiki.jp/redstrange/?%C4%EA%B5%C1%BA%D1%A4%DF%A5%DE%A5%AF%A5%ED __MPI __OPENMP
479 名前:デフォルトの名無しさん [2010/11/11(木) 06:38:52 .net] ご存知の方教えてください。 MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか? よろしくお願いします。
480 名前:デフォルトの名無しさん mailto:sage [2010/11/11(木) 10:15:27 .net] なんか答えにくい質問だなぁ・・ たとえば x86 なCPU で linux 上で、とかなら .o ファイルかき集めて最後にリンクできて・・なら、 たぶんだけど意図したとおりに動くんじゃないかな? コードはあげないけど中間ファイルならあげるよ、という人たちから いろいろもらって一まとめで使う、とかなの?
481 名前:デフォルトの名無しさん [2010/11/12(金) 14:02:34 .net] >>477 すみません質問がいい加減すぎました。 ノード1がCygwinでgcc_4.3.4を使っていて、 ノード2がUbuntuでgcc_4.4.4を使っています。 CPUはともにx86系です。 このようなときに、 MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。 よろしくお願いします。
482 名前:デフォルトの名無しさん mailto:sage [2010/11/12(金) 15:38:08 .net] mpirun mpiexec の気分次第w まあ、動くかと。 gcc と intel は割と相性イイから インテルも混ぜてあげよう
483 名前:デフォルトの名無しさん [2010/11/15(月) 18:12:22 .net] 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 を入れました。
484 名前:デフォルトの名無しさん mailto:sage [2011/01/13(木) 13:07:41 .net] >>480 bashrcに書けばいいんじゃない?
485 名前:デフォルトの名無しさん [2011/01/26(水) 19:07:42 .net] 行列行列積のやり方が全くわかりません A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。 Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。 行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。 誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
486 名前:デフォルトの名無しさん [2011/02/09(水) 18:08:03 .net] 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 ---
487 名前:デフォルトの名無しさん mailto:sage [2011/05/21(土) 13:51:12.10 .net] 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 とエラーが出てしまい実行出来ません。検索しても有効な解決策が見つかりませんでした。 どなたか解決策を教えていただけないでしょうか?
488 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 04:09:40.08 .net] Intel mpi(impi)使ってる人います? 自分でコンパイルしたのより速い?
489 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 23:53:44.81 .net] そりゃ人間がコンパイルするより速いだろ
490 名前:デフォルトの名無しさん mailto:sage [2011/06/01(水) 02:31:39.53 .net] 機械語直打ちw やだな・・・罰ゲームだ
491 名前:デフォルトの名無しさん mailto:sage [2011/06/07(火) 02:57:07.11 .net] >>486 ,487 そんなくだらない煽りが来るとは思わなかった. mpichってconfigure makeしません? 数値計算メインで使ってるなら, 効率考えて,コンパイラ変えたりするでしょ. mpi関係ないコンパイラの速度って, icc>1.1倍>gcc4>>1 .8倍>>gcc3 ぐらいのイメージなんで,(Linux x86_64) ifortやiccでmpichコンパイルしたのとどっちが早いかな と思ったんですが. impiだと, mpicc -cc=icc て出来ることがわかったので,自己解決しました.
492 名前:デフォルトの名無しさん mailto:sage [2011/06/07(火) 03:03:11.95 .net] >>481 環境変数はbash_profileのほうがふつうじゃない? >>484 mpd立てた? listenportの設定は適切? 付属のサンプルプログラムは流れた?
493 名前:デフォルトの名無しさん mailto:sage [2011/06/08(水) 00:50:57.29 .net] >>488 「自分でコンパイル」に該当する環境をきちんと定義しないからさ。 コンパイラは?gcc?icc?それ以外? mpiライブラリは?計算内容は? まぁどれにしてもmpiコンパイラって基本的に適当なライブラリをくっつけて ビルドするスクリプトだから、実際やってる内容を出力するオプションあるし それで1つ1つ確認すればいいんじゃない?
494 名前:デフォルトの名無しさん mailto:sage [2011/06/08(水) 01:47:18.76 .net] >>490 回答ありがとう.たしかにあやふやな質問だったと思う. 偏見かもしれんが,まともなwindowsクラスタってあるの? 数値計算を32bitで行うのは論外でしょ. でIntel Compilerを入れる時点で,アーキテクチャほぼ決まると思いますが. impiのデフォルトコンパイラはgcc&gfortranです. mpiライブラリの意味がわからん. impiの前はmpichを使ってた.(これで回答になっている?) 計算内容は有限差分とモンテカルロ. 続く
495 名前:デフォルトの名無しさん mailto:sage [2011/06/08(水) 01:48:27.26 .net] >>490 続き 適当なライブラリが-lmpi -lpthread -lmとかを言っているなら, libmpiをコンパイルする必要があると思いますが. このライブラリをIntelがチューニングしてくれたら, 自分でコンパイルするより早いでしょうし. デフォルトのgccとかでやられてたら, 自分でコンパイルしたほうが速そうじゃない? 実際やってる内容ってのは,mpiccやmpifcのスクリプトの中身のこと? それとも別の何かを指しているの?
496 名前:デフォルトの名無しさん [2011/08/28(日) 05:28:03.47 .net] ブロードキャストってネットワークの送受信量を減らすことができるのですか? それとも単に便利なだけというだけなのでしょうか?
497 名前:デフォルトの名無しさん mailto:sage [2011/09/01(木) 19:37:51.69 .net] MPIってテキストからデータ読み込んだ時に、 MPI_SendやMPI_Recvを使って送受信可能にするためには変換が必要だったりしますか? double型のデータなんですが。
498 名前:デフォルトの名無しさん mailto:hotaru__hyoma0615@hotmail.co.jp [2011/09/02(金) 11:09:03.84 .net] 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
499 名前:デフォルトの名無しさん mailto:sage [2011/09/03(土) 10:38:26.00 .net] 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次元座標的には読みにくい入力データが必要。
500 名前:495 mailto:hotaru_hyoma0615@hotmail.co.jp [2011/09/04(日) 09:45:19.22 .net] >>496 さんの言った通り直しても通りませんでした…。 正直自分の知識じゃ限界を感じているので 代わりにやってくれる方がいれば報酬払ってもいいです。 最大2万円までしか出せませんが…。メール待ってます。
501 名前:デフォルトの名無しさん [2011/11/15(火) 11:36:05.43 .net] openmpi使ってるんだがnohupが効かねぇ・・・ 端末PC落とすと計算やめちゃうんだが
502 名前:デフォルトの名無しさん [2011/11/19(土) 16:31:12.60 .net] へえ
503 名前:デフォルトの名無しさん [2011/11/24(木) 19:56:37.29 .net] MPIの勉強始めようと思うんだけどMPI3ってのはまだ出てないの?
504 名前:デフォルトの名無しさん [2012/05/16(水) 14:34:19.07 .net] OpemMPとの違いを教えてください
505 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 15:20:09.38 .net] MPI 妖精がいっぱい同時に働く。 拍子を合わせそこなうと、ぐだぐだ。 プログラムは最初から並列前提で書く方が いいかもしてない。非並列からの移行は面倒臭い。 OpenMP 手がいっぱいある妖精が独りで頑張る。 並列化はかなり楽。 混在できるけどね。 gfortran とか無料コンパイラがOpenMPに 対応しているし、マルチコアCPUが 普通になってきた今日、 小規模から中規模ならOpenMPがオススメ。 大規模スパコン使う可能性があるなら、 MPI で最初から組むべし。
506 名前:デフォルトの名無しさん [2012/06/21(木) 09:40:29.85 .net] MPIにおすすめのスイッチングハブを教えてください
507 名前:デフォルトの名無しさん [2012/08/03(金) 08:01:03.03 .net] >>503 バカハブこれ最強
508 名前:デフォルトの名無しさん mailto:sage [2012/10/31(水) 13:14:04.95 .net] LANポートにあきがあるならノードでリングベース組むのが勉強になるで 俺は混在は結構ありだとおもうで クラスタとかなら通信時間削減が期待できる
509 名前:デフォルトの名無しさん [2012/11/23(金) 18:27:19.04 .net] gigabit ethernetからInfiniBandに変えた場合のベンチマーク結果とかありますか? アプリケーションにも依るとは思うのですが、ある程度、どのくらい向上するのか知りたいのですが ♪∧,,∧ ♪∧,,∧・ ω・) ∧,,∧・ ω・) )っ (・ ω・) )っ__フ (っ )っ__フ(_/彡 ( __フ(_/彡 (_/彡♪
510 名前:デフォルトの名無しさん mailto:sage [2013/04/01(月) 12:31:36.78 .net] www.science-academy.jp/showcase/11/pdf/P-108_showcase2012.pdf ↑こいつとか、国泰寺高校もそうだけど、学生でもこういうMPIのシステムを構築できる時代なんだな。 ただ、それゆえに性能測定しかしていない。 テーマを持たないと意味ないよな。 それに関して指導できる教師が高校にいるものだろうか?
511 名前:デフォルトの名無しさん mailto:sage [2013/04/21(日) 05:09:09.55 .net] 動的に確保する要素を含む構造体のデータタイプを作るにはどうしたらいいのでしょうか。 int MPI_Type_struct(int count, int blocklens[], MPI_Aint indices[], MPI_Datatype old_types[], MPI_Datatype *newtype) のMPI_Aint indices[]のアドレス計算部分で構造体の動的に確保した要素のせいで アドレスが一部分に固まってないのでよくわかりません。
512 名前:デフォルトの名無しさん mailto:sage [2013/06/22(土) 16:11:03.36 .net] >>508 要素を一つずつ配布するしかないんじゃないか
513 名前:デフォルトの名無しさん mailto:sage [2013/07/28(日) NY:AN:NY.AN .net] 多体問題とか計算させて可視化とか ありきたりだけどインパクトはあるよね そんなに難しくないし
514 名前:デフォルトの名無しさん mailto:sage [2013/08/28(水) NY:AN:NY.AN .net] みなさんI/O(特に出力)はどうしてますか? netCDFとかやんないといけないんですかね
515 名前:デフォルトの名無しさん mailto:sage [2013/10/20(日) 20:32:46.52 .net] 初めて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) もし宜しければアドバイスお願いします
516 名前:デフォルトの名無しさん mailto:sage [2013/10/21(月) 18:46:01.68 .net] mpi_err_buffer invalid buffer pointer でググると、 Stackoverflows上のQ&Aなどの情報が見つけられるね
517 名前:512 mailto:sage [2013/10/22(火) 20:15:27.18 .net] >>513 レス有難うございます。 ググってみましたが、英語が堪能でないため理解できていない状態です orz ですがテストプログラムで起きる条件を見つけることが出来ました。 スレッドでRecvで待ち受けている状態で同じランク内でIsend, Irecvで 色々送受信する時にエラーが発生するようです。 RecvをIrecvに変更してタグを分ければエラーが発生しないようですが、 まだ良く見ていないのでなんとも言えない状態です。 コミュニケータとかタグをよく理解していなくてよく分からないのですが、 何となく通信を分けれればいいな程度ならタグで分けるでOKです?
518 名前:デフォルトの名無しさん mailto:sage [2013/11/10(日) 22:41:16.90 .net] ランクを指定してfinalizeに到達したか調べる方法はないですか?
519 名前:デフォルトの名無しさん [2013/12/04(水) 11:39:20.69 .net] MPI の勉強のために、コードの主要部分は C で書かれていて、 具体的な計算部分は fortran77 で書かれたサブルーチンを 呼んでいる混在コードを MPI 並列化したいと思っています。 当面の目標は、MPI の初期化・終了部分などを C の部分で書いて、 fortran で書かれている部分に具体的な指示行を入れて並列化を することなのですが、私の勉強不足で、最初からつまづいている 状態です。 C の部分に MPI_Init(&argc, &argv); MPI_Finalize(); を入れて、
520 名前:デフォルトの名無しさん [2013/12/04(水) 11:41:00.26 .net] 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 の基礎が分かっておらず、全くの素人質問で申し訳ありませんが、 ご助言など頂けますと助かります。
521 名前:デフォルトの名無しさん mailto:sage [2013/12/04(水) 13:06:04.90 .net] FORTRANはしばらく触っていないけど、includeは正しいの? 私もMPIプログラムは素人だけど疑問は何点か有るよ 疑問1、MPIを含まないCとFORTRANの混成は問題なく作れるのか? 疑問2、C又はFORTRAN単独言語の時にMPIのプログラムは作れるのか? 疑問3、C、FORTRAN、MPIのバージョンはいくつ?また実装系は何ですか? で話は少し変わってくるんじゃないかな
522 名前:デフォルトの名無しさん [2013/12/04(水) 13:35:33.96 .net] アドバイス頂きありがとうございます。 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 だけですが、それが正しいかどうかは自信がありません。 何かご助言などありましたらお教え頂けるとありがたいです。
523 名前:デフォルトの名無しさん mailto:sage [2013/12/04(水) 14:02:42.00 .net] includeはC言語の書き方に見えたんで書いたんだけど・・・ include 'mpif.h' とか書くんじゃない? intelのコンパイラは使ったこと無いからわからないけどね 疑問2については簡単なプログラムを(rankを表示する)書いてみたらいいんじゃないと言う意味で書きました
524 名前:デフォルトの名無しさん [2013/12/04(水) 16:27:50.33 .net] 説明不足ですみませんが、先の include は FORTRAN の部分に挿入した ものです。別途 C の部分には、既に #include "mpi.h" と書いていますが、 もしかして、include 文は C の部分に書いておけば、あらためて FORTRAN の部分には書く必要はないのでしょうか??? 2 については、C も FORTRAN も簡単なプログラムを書くことで、 MPI が動作する(rank が表示される)ことを確認しています。 ただ、今回のような C の中に FORTRAN が入れ子になっている状態での MPI の書き方がわからず(FORTRAN の subroutine を呼んでいる箇所の 前後で MPI の指示文を書いてもダメなのでしょうね?)、困っています。
525 名前:デフォルトの名無しさん mailto:sage [2013/12/04(水) 17:19:45.26 .net] テストしていないので話半分で聞いて下さい。 まず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) 小さなプログラムで書き方をテストしてからやった方がいいのでは?
526 名前:522 mailto:sage [2013/12/04(水) 21:43:48.10 .net] 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
527 名前:522 mailto:sage [2013/12/04(水) 22:18:07.46 .net] 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
528 名前:デフォルトの名無しさん [2013/12/06(金) 01:28:12.82 .net] >> 522 さん ご返信が遅くなり大変申し訳ありませんでした。 この度はコードのご指導まで頂き、本当にありがとうございました! 私の環境は intel 環境で、不勉強もありなかなか上手くいきません でしたが、参考にさせて頂きつつ、なんとか mpiifort -c rank.f mpiicc -o a.out main.c rank.o -lifcore -limf mpirun -np 4 a.out で動きました!嬉しいです!! この度は、ご助言頂き本当にありがとうございました!!
529 名前:デフォルトの名無しさん mailto:sage [2014/08/27(水) 03:15:26.43 ID:SX33fbF3.net] おるでw 最近はMPIのインストール方法とか使用方法とかを説明する記事やドキュメントが多いから、わざわざ2ちゃんのスレにカキコするまでもないのではないかな…
530 名前:デフォルトの名無しさん [2014/09/25(木) 20:37:56.94 ID:77m4KJC/.net] プログラミング初心者ですが質問させてください。 フリーウェアだけでfortranのmpiを用いた並列計算環境って用意できますか? OSはwindowsです。色々解説サイトを回ったのですが、OSがwinで フリーウェアという条件に一致するものがありません。 解説サイトか、フリーウェアを紹介していただけたら幸いです。
531 名前:デフォルトの名無しさん mailto:sage [2014/09/25(木) 20:55:19.71 ID:1qsw9PIQ.net] WindowsにVirtualboxをインストール VirtualboxにLinuxをインストール ゲストOSでmpi環境構築 以上
532 名前:デフォルトの名無しさん [2014/09/25(木) 23:09:57.41 ID:77m4KJC/.net] >>528 さん回答ありがとうございます。 早速試してきます。
533 名前:デフォルトの名無しさん [2014/09/26(金) 00:43:22.36 ID:w0XQeQM8.net] すみません。再度質問します。 とりあえず、並列計算を行える環境にはなったのですが、 8コアで計算させていたら全てのコアで使用率が100%となりました。 計算速度は犠牲にしてよいので、使用率を50%程に低下させつつ動作させることは 可能でしょうか?
534 名前:デフォルトの名無しさん mailto:sage [2014/09/26(金) 06:29:58.28 ID:IA039Vji.net] ゲストOSが使用するCPU数を4コアに設定 4/8でCPU使用率50% 以上
535 名前:デフォルトの名無しさん mailto:sage [2015/02/21(土) 12:06:37.62 ID:FlDtTMp/.net] うんこ
536 名前:デフォルトの名無しさん [2016/03/29(火) 09:26:01.42 ID:/c8bAcK4.net] サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足 サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題 春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残 コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題 マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了 校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント 高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
537 名前:デフォルトの名無しさん mailto:sage [2016/08/19(金) 15:54:40.93 ID:hNG+d2Rp.net] windows10を2台とMSMPIで通信したいんだが error 1825のセキュリティパッケージ固有のエラーとやらが出て通信できないんだ firewallはオフにしてもだめ OSはwindows HPC clusterとかじゃないとできなかったりする?
538 名前:デフォルトの名無しさん [2016/10/13(木) 07:16:32.67 ID:aU3BNmFk.net] SMPマシン数台のMPICH2環境を構築しようとしています。 とりあえず8コアマシンで1ノード1CPUでの環境は作り、ベンチマークなどをとってテストしている最中です。 さて、ここからSMP+MPICH2混在環境に移行しようとしてるんですが、SMP環境をアクティブにする方法が判りません。 どうしたらいいのでしょうか?? 環境は centos6.8 mpich1.21p1 です。 よろしくお願いします。
539 名前:デフォルトの名無しさん [2017/01/09(月) 17:58:00.69 ID:nq81pkaz.net] SMPをアクティブにするってどういうことだろうか? 単純にOpenMPを使えば良いだろうに。
540 名前:デフォルトの名無しさん [2017/02/27(月) 23:58:25.54 ID:UI1UeTdZ.net] 初めてInfiniBand使ったけど爆速だなこりゃ。
541 名前:デフォルトの名無しさん mailto:sage [2017/08/25(金) 02:38:12.16 ID:LiutTzVc.net] OpenMPIを使うコードがinfinibandがある環境がない環境に比べ滅茶苦茶遅くて困った。 プロファイルとって調べたらopal_memory_ptmalloc2_int_mallocが一番時間食っていた。 コミュニケータは作るものの通信を一切しないテストコードなのにOpenMPIのmalloc系の関数が 何故に出てくんのかと思ったら、これglibcのmallocをフックしちゃうやつなのね。 mpirunに「--mca mpi_leave_pinned 0」を付けると無効化できて速度が元に戻ったけど、 このmpi_leave_pinnedはinfinibandのようなRDMA対応ネットワークのための設定なのに 有効化すると逆に遅くなるのが解せない・・・。
542 名前:デフォルトの名無しさん mailto:sage [2017/08/25(金) 03:05:28.93 ID:LiutTzVc.net] ググって見つけた論文「HPCクラウドの実現に向けた仮想化クラスタの性能評価」には Infiniband使用時にMPI集団通信を向上させるために、実行時オプションとして 「--mca mpi_leave_pinned 0」を付加した って記述があるが、OpenMPIのFAQによればそれだとメモリをpinできないので遅くなるはず。 結局Infinibandを正しく使うにはどう設定するべきなんだろうか・・・。
543 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 00:38:03.64 ID:CbVYdpce.net] >>539 だけど、OpenMPIのFAQを見たらメモリのpinningをデフォルトで有効にする仕様については 開発者で反対意見もあったらしい。そりゃそうだろう・・・。 そんなん必要なのはMPIで参照するデータだけなのに、システムのmallocごと差し替えるというのは やりすぎではないか・・・。
544 名前:デフォルトの名無しさん [2018/05/23(水) 21:50:25.15 ID:Au5e7VGg.net] 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 12MI6
545 名前:デフォルトの名無しさん [2018/07/05(木) 00:11:39.46 ID:RfoszcD2.net] ES4
546 名前:デフォルトの名無しさん mailto:sage [2019/05/30(木) 23:53:17.14 ID:Stoh1y6z.net] お手軽にクリティカルセクション作る方法がないのはクソ
547 名前:「Microsoft Power Fx」登場 [2021/03/03(水) 16:13:39.50 ID:TcsaJvTP.net] Excel関数ベースのプログラミング言語「Microsoft Power Fx」登場 オープンソースで公開予定:Microsoft Ignite 2021 https://asahi.5ch.net/test/read.cgi/newsplus/1614745763/l50
548 名前:デフォルトの名無しさん [2022/01/01(土) 22:23:23.80 ID:TCOZEf7v.net] 新打法がいいね
549 名前:デフォルトの名無しさん [2023/04/27(木) 18:18:54.78 ID:CFMhQ97GL] 私利私欲のために莫大な温室効果カ゛スまき散らして氣候変動させて災害連發させて人殺して石油需給逼迫させて物価暴騰させて社會に莫大な 損害を与えながら丿コノコス−ダンやらに行ってなにやら巻き込まれてるボケどもが,クソ税金泥棒公務員利権のネタにされなか゛ら人件費だの 食料だのと1億は税金をドフ゛に捨ててるた゛ろう何の関係もない國民から強奪した莫大な税金使って迎えに行くとか唖然とするか゛.こいつら ひとり1○ОО萬ほど徴収すへ゛きだし、こういうことのために今後は邦人の出国税ひとり10OΟ萬は徴収しないとな.入管収容て゛税金泥棒 1О○%のクソ公務員の過失責任を税金て゛肩代わりするとかやってるガヰシ゛ン入国税も1○O〇萬は徴収するのが筋た゛し.クソ航空機には 航空燃料税1ΚL1千万圓、離発着税1回1億圓,上空通過税1κm1Ο〇萬圓,それ以前にスティンガ‐解禁して、私有地からのクソ航空機 撃墜を合法化するのは住民としての普遍的な権利た゛し.憲法ガン無視で都心まて゛数珠つなき゛でクソ航空機飛ばして私権侵害して私腹を肥やす 強盜殺人の首魁齋藤鉄夫ら世界最惡の殺人腐敗組織公明党を壊滅させないと,お前らの生活は苦しくなる一方た゛という現実に気つ゛かないとな! 創価学会員は,何百萬人も殺傷して損害を与えて私腹を肥やし続けて逮捕者まて゛出てる世界最惡の殺人腐敗組織公明党を 池田センセ―か゛□をきけて容認するとか本気で思ってるとしたら侮辱にもほと゛か゛あるぞ! hΤTρs://i.imgur、cоm/hnli1ga.jpeg
550 名前:デフォルトの名無しさん mailto:sage [2023/09/10(日) 05:05:23.97 ID:EXF1G7CS.net] ホンマにそれがええんか?
551 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています