1 名前:デフォルトの名無しさん [04/11/07 18:25:56] MPIによる並列プログラミングについて話し合う統合スレッドです。 とりあえず本家 www-unix.mcs.anl.gov/mpi/
159 名前:154 [2007/01/16(火) 00:20:12 ] >>155 レスありがとうございます。 リンクのトップに出てくるサイトで設定をしていてできなかったのです。 で、いじくってて気づいたのですが、ユーザーズガイドのシステム要件を見たら、 WindowsのHOME EDITIONは使えないのですね・・・ これはMPICH2を使えばいいのでしょうか。 MPICH2のほうのユーザーズガイドみたら特にPROに限るような記述はなかったので HOMEでもいけるのですかね? あと、CPUですがPentium4を使っています。
160 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 02:37:19 ] >>159 Homeか・・・そりゃ無理だ デュアルブートでLinux入れる気無い?何に使うかわからんがWindows環境を捨てるのも 一つの手だよ、ただMPIを動かしたいんならKnoppix MPIとか使うと簡単に起動できる ttp://kagakububuturi.hp.infoseek.co.jp/ ・・・つーかこれ高校生が作ったにしちゃあよくできてるよな 後Knoppix-MPIで使ってるMPIはLAM-MPIのほうだからMPICH使いたいならあわないかも ttp://www20.atwiki.jp/mynote/?page=mpi 適当ですまん (;´Д`)/
161 名前:154 [2007/01/23(火) 03:52:37 ] >>160 レス遅れてごめんなさい。 実はあれからMPICH2でやってみたところ、WindowsHomeでも動かすことができました! たくさん相談にのっていただきありがとうございました。 ただ、今回4台で並列化行う予定なんですけど、 1台だけうまくいかないマシンがあってまた困っています。 他のマシンで2台でやってみると正常に実行できるのに、そのマシンを入れて行うと "abort: Unable to connect to <hostname>"と出てしまいます。 設定は他のマシンと同じようにしてるつもりなのですが。 ようやくできるようになったと思ったのに、色々問題出てきますね・・・
162 名前:デフォルトの名無しさん mailto:sage [2007/01/23(火) 15:13:21 ] >>161 WinのMPICH2は使った事無いが<hostname>って言うノードが登録されてないんじゃないか? ttp://www.imslab.co.jp/Product/eem/parallel/faq.htm 上のページの一番下が原因かも あとMPI組んだならHPL(Linpack)ベンチマーク走らせて結果うp!
163 名前:154 [2007/01/24(水) 02:08:24 ] >>162 レスありがとうございます! ご指摘のとおり、アカウント名が原因でした。 あとベンチマークですが、、、余裕があったらやってみます、スミマセン^^;
164 名前:デフォルトの名無しさん [2007/01/30(火) 17:50:05 ] あるプロセッサが持っている行列内の1列をまとめて別のプロセッサに送りたいんですが どのような関数を使えばいいでしょうか?
165 名前:デフォルトの名無しさん [2007/01/30(火) 22:47:50 ] Parallel Virtual Machine (PVM) 統合スレ pc10.2ch.net/test/read.cgi/tech/1170150974/
166 名前:デフォルトの名無しさん [2007/01/31(水) 15:24:23 ] 共有変数を用意したいのですがどうすればいいですか?
167 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 19:26:04 ] >>166 つ ny
168 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 09:33:01 ] MPICH2でwindowsを2台動かそうとしているんですが、 wmpiconfig.exeでapplyボタンを押しても <ホスト名> Credentials for <アカウント名> rejected connecting to <ホスト名> Aborting: Unable to connect to <ホスト名> と表示されて設定できません。 アカウント名とパスワードは2台とも同じものを設定していて、 ファイアーウォールも切っています。 pingでもお互いを認識しています。 どなたか原因分かる方よろしくおねがいしますm(_ _ )m マシン構成は winXP HOME PEN4 1.6GHz winXP PRO PENIII 800MHz です
169 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 22:15:01 ] MPI_Finalizeを呼んだら制御が返ってこなくなったんですが、 何か原因に心当たりのある方はおられませんか。 printf("before\n"); MPI_Finalize(); printf("after\n"); これをやったらbeforeしか表示されません。 ちなみにmpich-1.2.7@SUSELinux10.2です。
170 名前:デフォルトの名無しさん mailto:sage [2007/02/27(火) 01:07:31 ] 設定がうまくいってないんだろ?
171 名前:169 mailto:sage [2007/02/27(火) 03:48:13 ] NFSで共有していないファイルから問題設定を読んでいて、 PC毎にパラメタが変わってこけていたという罠。 吊ってきます Λ||Λ
172 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 00:51:59 ] 並列計算に興味あるのですが、単に処理するデータを分割、各PCで計算、最後に統合するのでは なく、PC毎に別のデータを別の処理方法で行っていて、あるPCの処理結果が別の処理中のPCの処 理に割り込んで処理方法を変えるなどということは出来るのでしょうか?
173 名前:デフォルトの名無しさん [2007/03/20(火) 23:06:11 ] 自作のC++プログラムの並列化をしています。 MPI_Finalizeを呼ぶタイミングについて疑問があります。 MPI_Finalizeをmainの末尾で呼べば無事に終わるのですが、 Singletonクラスのデストラクタの中で呼んだら落ちてしまいました。 main を抜けた後に呼んではいけないでんしょうか? 環境は、MPICH2、Win XP SP2、Visual Studio 2005 です。
174 名前:デフォルトの名無しさん mailto:sage [2007/05/06(日) 03:28:13 ] MPI_Gatherなどで、転送するデータタイプはMPI_DOUBLEなどで指定しますが、 データタイプがテンプレートに指定されたデータタイプによって変わる場合、 どのように設定したらよいのでしょうか?
175 名前:デフォルトの名無しさん [2007/05/19(土) 08:51:23 ] 平凡な方法ですが、 template<typename T> class MpiConst{}; template<double> struct MpiConst { static const int TYPE = MPI_DOUBLE; }; と特殊化をしておいてから、目的の template を作る のは、どうでしょう。 これは、MpiConstを隠蔽する改良案です。 class Base { protected: Base(); ~Base(); static const int TYPE = MPI_DOUBLE; // 以下、MpiConst の定義・特殊化 }; template<typename T> TargetClass: protected Base { ... };
176 名前:デフォルトの名無しさん [2007/05/19(土) 09:14:10 ] ↑すみません。class Base の中の static const ... の行を消し忘れました。
177 名前:デフォルトの名無しさん mailto:sage [2007/05/21(月) 07:56:54 ] openmpの場合、#ifdef _OPENMPでopenmpを使ってコンパイルしている 場合とそうでない場合に別々のコードを書くことができますが、 MPIの場合はどのようにしたらよいのでしょうか?
178 名前:デフォルトの名無しさん [2007/06/09(土) 16:58:36 ] このスレではPCクラスタのシステム障害(とくにハード)について経験ある方も 少なくないと思うので、お尋ねします。 1年前に構築した16ノードクラスタ(ディスクはNFS共有、ギザイーサ)が、 最近頻繁にp4_errorを起こすようになりました。 とりあえず疑わしいところからパーツを取り替えまくったのですが、全く改善しません。 特定ノードというより全体的にパラパラと障害が発生してるので、もしやネットワークかな と思ったのですが、ネットワークに問題があるなら、rloginやsshのセッションやNFS の読み書きにも障害が出ると思うのですが、特に問題は出ていないようです。 MPIで並列したときに限って発生します。 これからネットワークの交換を検討していますが、何かアドバイス頂けいたら幸いです。 ちなみに1年間はほぼ問題なく使えており、他の計算機でも実績があるので プログラム側の問題ではないです。
179 名前:デフォルトの名無しさん [2007/06/22(金) 11:04:41 ] MPI_Finalizeを行わずに終了した場合、どのような問題が起きる可能性がありますか?
180 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 23:33:50 ] MPI_Finalize のソース読んだらいいんじゃね??
181 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:51:42 ] >>178 今頃気付いたが、ギザイーサワロス 巨大王墓間を高速インターコネクトで結んで世界の七不思議にでも入れたいノケ?
182 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:17:25 ] デッドロックを発生させない定石のようなものはありますか?
183 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:00:52 ] >>181 中川しょ(ry
184 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 15:30:14 ] >>181 日本語でおk
185 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 23:51:22 ] 巨大王墓=ピラミッド
186 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 02:15:45 ] わかんねーよハゲwww
187 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 22:45:57 ] 世界の七不思議=ギザのピラミッド他
188 名前:・∀・)っ-○◎● mailto:sage [2007/06/29(金) 02:42:04 ] ギザかわゆすwwwwwww
189 名前:デフォルトの名無しさん [2007/07/02(月) 16:57:33 ] 現在boostのuBlasを使って逆行列を解いています。 MPIを使ってさらに大規模な行列を計算させたいのですが、お薦めのライブラリを教えてください
190 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 20:42:39 ] どなたかPS3でmpich2やってるひといません? fedora5でひととおりmpich2をインストール、設定後に実行するとこんなんで て困ってます。 # mpirun -n 1 date mpiexec_ps3slave1 (send_dict_msg 632):send_dict_msg: sock= errmsg=:(32, 'Broken pipe'): mpdtb: /usr/local/bin/mpdlib.py, 632, send_dict_msg /usr/local/bin/mpirun, 250, mpiexec /usr/local/bin/mpirun, 1399, ? mpiexec_ps3slave1: mpd_uncaught_except_tb handling: exceptions.KeyError: 'cmd' /usr/local/bin/mpirun 255 mpiexec elif msg['cmd'] != 'response_get_mpdrun_values': /usr/local/bin/mpirun 1399 ? mpiexec() どなたか御力をおかしください。
191 名前:190 mailto:sage [2007/09/03(月) 22:06:14 ] 自己解決しました。Fedoroa 6を入れなおして、mpich2を入れなおしたら いけました。 他にps3でクラスタやってる人の例をネットなどでみていると、結構Fedora 5で やってる人がいるから、OSの違いでうまくいったというよりも、初回のmpiの インストール時の設定に問題があったのかもしれません。以上。
192 名前:デフォルトの名無しさん [2007/09/10(月) 01:30:38 ] MPIでJUnitみないなテストできんの? 知ってるひといたら教えてくれい
193 名前:デフォルトの名無しさん [2007/09/12(水) 04:50:40 ] >>192 こんなのあった 自分は使ったことないが ttps://sourceforge.jp/projects/mpiunit/
194 名前:デフォルトの名無しさん [2007/09/23(日) 03:05:43 ] >>193 つかってみたぞ いがいとべんりだった
195 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 00:57:56 ] 誰かまともなチュートリアル書いてくれよ
196 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 16:47:33 ] >>195 チュートリアル書きたいが どんな機能があるのがよくわからん
197 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:30:55 ] >>195 虎の巻じゃだめかね
198 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 01:59:38 ] >>197 虎の巻をたのむ
199 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 09:50:27 ] >>198 ttp://accc.riken.jp/HPC/training/text.html
200 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 15:07:25 ] >>199 すまねえ 193の虎の巻がほしかったんだ
201 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 00:21:40 ] >>200 パッケージの中にあるじゃん
202 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:28:39 ] >>201 あるけどわかりにくくない?
203 名前:デフォルトの名無しさん [2007/09/30(日) 21:15:53 ] >>200 sourceforge.jp/projects/mpiunit/wiki/Tutorial
204 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:37:27 ] もっぺん書くけどさ、 ま と も な チュートリアルが欲しいんだよ。
205 名前:デフォルトの名無しさん [2007/10/01(月) 03:36:48 ] >>204 作者に直で言うしかないな
206 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 23:01:28 ] みんなここで勉強したのかえ?
207 名前:デフォルトの名無しさん [2007/10/04(木) 21:05:22 ] 203のチュートリアルを直そうと思うんだけどここにはっていいよね? どうせLGPLだし 204氏はどんなチュートリアルが欲しいんだい?
208 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 12:19:32 ] boostにmpi入るからそれでいいじゃん
209 名前:デフォルトの名無しさん [2007/10/11(木) 00:03:40 ] だれか>>193 使った人いる?
210 名前:デフォルトの名無しさん [2007/10/17(水) 09:58:07 ] >>209 使ってるよ プログラミングの効率が上がった
211 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:55:50 ] 作者は岩手大学の学生か?
212 名前:デフォルトの名無しさん [2007/10/26(金) 21:09:07 ] AUTHORSにそう書いてあるね
213 名前:デフォルトの名無しさん [2007/11/02(金) 21:07:27 ] CentOS5.0にrpmで入ってたOpenMPIを使ってます。 $ rpm -qa |grep mpi openmpi-devel-1.1.1-5.el5 openmpi-libs-1.1.1-5.el5 openmpi-libs-1.1.1-5.el5 openmpi-1.1.1-5.el5 openmpi-devel-1.1.1-5.el5 手元にX86_64のPCが2台とi386のPCがあるのですが、 異種アーキテクチャのバイナリの自動選択はどうやってするのでしょうか? 全部i386で揃えろって意見もあるかもしれませんが、64bit整数演算をする ので64bitで動かしたいんですよね。 mpichは出来るみたいですね。 enrico.phys.cmu.edu/QCDcluster/mpi/mpirun_mpich.html というかOpenMPIはman マニュアル無くて悲しい。
214 名前:デフォルトの名無しさん mailto:sage [2007/11/04(日) 15:00:58 ] Debian 4.0 etch AMD64のマシンを2台用意してMPICHで環境を整えようとしています。 2台ともデュアルコアなので、 /etc/mpich/machines.LINUX に cluster1:2 cluster2:2 と記述しています。 テストを行おうと mpirun -np 4 cpi をしてみたのですが、1分以上待ってもプロンプトが帰ってきません。しかし mpirun -np 3 cpi とするとcluster1に2スレッド、cluster2に1スレッド割り当てられ計算結果がすぐ返ってきます? 4コア使い切るためにはどうしたら良いでしょうか?
215 名前:213 mailto:sage [2007/11/07(水) 00:40:14 ] 色々試したが諦めた。次はPVMを試そうと思う。
216 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 11:28:47 ] SuSE Linux9.3 mpich-1.2.7p1 gcc, pgi 7.1 を使用していますが、emacsでmpiデバッグできませんかね。 gdbとpgdbgを使ってデバッグできますが、 pgdbgは使いにくいし、gdb単体も使いにくいので、できれば emacsからgdbを起動したいなと。
217 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 13:26:16 ] PVMってまだ使われてるの?
218 名前:213 mailto:sage [2007/11/07(水) 14:06:12 ] >>217 しらんけど、CentOSに標準でパッケージが入ってたよ。
219 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 15:42:53 ] >>213 ローカルマシンに同じ名前のディレクトリを作る。 そこに機種毎のバイナリを置く。 これで桶。
220 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 15:44:35 ] >>219 補足。 機種毎のバイナリは同じ名前で作っておく。 mpirunはデフォでは同じ名前のユーザーの同じ名前のディレクトリにある 同じ名前のコマンドを実行するだけなので。
221 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 15:59:06 ] >>218 標準で入ってるんだ 昔はPVMが主流だったそうだけど、今はほとんどがMPIだよね
222 名前:213 mailto:sage [2007/11/08(木) 00:36:34 ] >>219 ありがとう。しかしPVMのマニュアルをせっかく読み始めたので こっちで行ってみます。MPIは出鼻をくじかれたので気に入らない。
223 名前:214 mailto:sage [2007/11/10(土) 21:37:30 ] /etc/mpich/machines.LINUX の localhost:2 cluster2:2 となっていたのを cluster1:2 cluster2:2 にしたらいけました。3スレッドはできるので machines.LINUXは悪くないと決め付けてました。
224 名前:デフォルトの名無しさん [2007/12/12(水) 06:13:16 ] MPIの並列計算で困っています。アドバイスお願いいたします。 ・4CPU/共有メモリの計算機でMPIによる並列計算を行っています。 しかし ・この計算機の場合、計算実時間が1CPUで計算している場合よりも 大幅に増えてしまいます。 (大学の大型計算機等で計算した場合、計算実時間は4CPUの場合、 1CPUの1/3.4ぐらいに短縮されますのでプログラム的には問題ないと考えています。) ・top コマンドで計算状況を監視していると、使用CPUが変動し、しばしば 同じCPUを2つのスレッドで競合しているようです。 ・使用CPUの数をいろいろと変えてみましたが必ず競合してしまうようです。 ・従って時間計測コマンドでCPU時間を測定すると、 下記のようにCPU時間は短縮されているが、実時間は増えてしまうという結果になるようです。 real time 1000.0 user time 250.0 ・計算機を納品した会社(H○C systems)に質問したところ、 設定は問題はない。プログラムの問題、あるいは通信時間がかかってしまうので 実時間が増える、といういい加減な返答しかきません。 似たような症状を経験したことのある方、対処法をご存知でしたら 教えてもらえないでしょうか。
225 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 07:08:53 ] sched_setaffinity(2) を使うと幸せになれるかも。
226 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:48:26 ] >>224 MPICHならconfigure時に --mem=shared を付けて構築すべし 通信が共有メモリを介したものになる(異ノード間は当然sshやrsh経由)。 実行時に ps -x してsshやrshでプロセスが起動してたら、わざわざ同一計算機内でTCP/IP通信しちゃってるので損。 OSやコンパイラに付属のMPICHはsharedで構築されていない例が多いので自分で構築してみよう。
227 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:59:25 ] 4CPU/共有メモリって、いわゆる普通のマルチプロセッサのことだよね 今時シングルコアはないから、2コアの2CPUなんだろう
228 名前:デフォルトの名無しさん [2007/12/28(金) 20:38:39 ] みなさまご助言ありがとうございます。 >>225 検索すると状況としてはこれが当てはまる感じなのですが、 私には使い方がよく分かりません。 詳しいサイト等ありましたら教えてもらえないでしょうか。 >>226 確かにps x コマンドで確認すると(ノード内の場合でも) rsh が動いていました。 このコンピュータはMPIのインストール及び設定済みのものを 購入したのですが、業者がいいかげんということなのでしょうか? 複数ノード構成なのですが、この場合はどうなのでしょうか 業者の説明では例えば、machinefile に node00:2 とすればSMPとなるとのことでした。 node00 node00 とすれば通信が発生するとのことでした。 >>227 シングルコアのItanium2:4CPUx4ノードの構成です。 (年度でわけて増設して購入したのでちょっと古いCPUになっています) 納品されたのは1年以上前なのですが、不具合ばかりです。
229 名前:225 mailto:sage [2007/12/29(土) 00:39:48 ] こんな感じ。 #include <mpi.h> #include <sched.h> #include <stdio.h> int main(int argc, char *argv[]) { int rank; cpu_set_t mask; double t; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); __CPU_ZERO(&mask); __CPU_SET(rank, &mask); if (sched_setaffinity(0, sizeof(mask), &mask) == -1) { perror("Failed to set CPU affinity"); goto error; } t = MPI_Wtime(); while (MPI_Wtime() - t < 10 + rank * 5) ; MPI_Finalize(); return 0; error: MPI_Finalize(); return -1; }
230 名前:225 mailto:sage [2007/12/29(土) 00:46:50 ] >>229 のプログラムは各プロセスが (10 + rank * 5) 秒後に終了する。 sar コマンドを使って、例えば > sar -P ALL 1 1000 とやると各プロセスがランクと同じ番号の CPU で走り続けてランク順に終了していく様子が観察できる。 参考にしたページ:d.hatena.ne.jp/naoya/20070824/1187945715
231 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 18:31:33 ] >>226 の書き込み見て、--with-comm=shared というオプションをつけてMPICHを コンパイルしてみたんだけど、逆に遅くなりました。共有メモリのほうが早く なると思うんですけど、どうしてだろう? CPUは Core 2 Quad 2.4GHz を使っています。
232 名前:デフォルトの名無しさん [2008/01/09(水) 01:43:00 ] GridMPIについて、質問です。 GridMPIのMPI関数は、通信先によって、リモートノードなら、IMPI、 自ノードなら自ノード内のMPI(ベンダMPIなど)を呼び出して通信 するはずですが、GridMPIが提供しているMPI関数と(自ノードの) ベンダMPIの関数のシンボルが重複しないのはなぜでしょう? (最初は、GridMPIから発行するベンダMPIの関数は、MPI関数では なく、PMPI関数と思っていましたが、これは違いますよね・・・)
233 名前:デフォルトの名無しさん [2008/01/10(木) 00:07:05 ] MPICH1.2.5について質問です。 MPICHのブロードキャストはTCPを用いて行われているようなのですが、 UDPによるブロードキャストを使用することはできるのでしょうか? ご存知の方がいらっしゃれば、よろしくお願いします。
234 名前:デフォルトの名無しさん [2008/01/11(金) 10:27:42 ] 普段はPVMでプログラミングをしているのですが、MPIでは 1.スレーブ(MPIでもこういう表現するんですかね)のマシンに 計算領域を割り当てて計算させる ↓ 2.マスタに計算結果を返す ↓ 1と2を繰り返す という流れはどういう風にソース上で実現させているのでしょうか。
235 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:48:46 ] >>234 スレーブとか言いません。 全く同じプログラムが複数走ります。 主従はなく、皆平等です。 MPI_Comm_rank関数を呼び出すと自分のノード番号がわかるので、 その番号に応じた振舞いをするようにプログラムを書きます。 たとえば、0から100までの足し算を2台の計算機でするときに、 ノード番号0なら0から49まで、ノード番号1なら50から100まで計算するようにしておきます。 通信は送信したいノード番号に向けて送信し、受信したいノード番号を指定して受信します。
236 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 20:56:17 ] WindowsCCSでHPLのベンチ取りたいんだけど参考になるwebとかありませんか?
237 名前:デフォルトの名無しさん [2008/01/13(日) 11:21:47 ] >>235 そうやるんですか PVMで同じようにする方法がさっぱりわからんもんで 参考になるかな、とは考えたのですが・・・
238 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:13:34 ] PVMってまだ使われてるのか?
239 名前:デフォルトの名無しさん [2008/02/07(木) 17:31:34 ] おーい、このスレ生きてますか? 質問です。 class base { ... }; class derived1: base{ ... }; class derived2: base{ ... }; があって、 vector<base*> v; にノード0で v.push_back(new derived1()); v.push_back(new derived2()); ... などとして配列を作ります。 で、作った物を他のノードに配信したいのですが、どうやれば良いでしょうか? newで生成したderived1などのオブジェクトも一緒に配信したいわけで、単純にvのバイト列を送れば良いというわけには行かないわけで。 実際にはderived1等にもnewしたオブジェクトのポインタが存在して、それも他のノードで再現したいわけで...
240 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 18:19:40 ] 死んでます
241 名前:239 mailto:sage [2008/02/07(木) 20:05:46 ] 死んでるのかよ! って、まあ置いといて、STLのstringなんかもオブジェクトのバイナリ丸コピじゃだめなんだよな。 ヒープからバッファ取ってるから。 となると、シリアライズして送信、受信側で再構築なんだろうけど、正直面倒臭いな。
242 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 05:39:37 ] MPI_File_xxでテキストファイルは扱えないのでしょうか?
243 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 23:33:27 ] 学科の演習用端末更新終わった〜 Linux / Cele 420 / MEM 2GB / 26台 /hdd less という構成なんだが、手軽に遊ばせるMPIのサンプルないかな? ちなみに、午後6時に強制shutdownの設定になってるので、 長くても8時間程度のジョブの奴を頼む。
244 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 08:12:50 ] MPIプログラムによってネットワークがどのくらい使用されているかは、どのようにしてわかりますか? 環境はFedora8+Intel C++ 10です。
245 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 13:32:00 ] Windows用のものはありませんか?
246 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 15:00:58 ] MPICHにWindows版があるyp!
247 名前:デフォルトの名無しさん [2008/04/17(木) 17:12:34 ] プログラムをコンパイルし実行するとsignal 6というエラーが出るのですが、これはどのようなエラーなのでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 18:43:41 ] どっかでabort()してるんじゃないの
249 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 21:06:07 ] MPIにおけるシグナルの使い方は実装依存なのじゃ。 同じエラーが出るミニプログラムを作ってうp汁
250 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 00:04:00 ] NPACI Rocksつこうてる人おる? どこのスレいけばいいか解らんくて 迷子してる
251 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:38:11 ] 計算の進行状況をファイルに書いてたのだが、 ファイルがバッファリングされる関係で リアルタイムで更新されないので、fflushを つっこんだら、計算時間が倍になったぞ。 こういうのは難しいなぁ。
252 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 06:37:45 ] >>251 NFSとかSambaでリモートのファイルシステムに書いてない? ローカルの /tmp あたりに書くようにすると速くなるかも。
253 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 09:17:59 ] というか、頻繁に確認しない限りそんな遅くならないんじゃないの?
254 名前:251 mailto:sage [2008/05/23(金) 00:45:22 ] >>252 リモートファイルシステムです。 多分それで速くなると思いますが/tmpとか勝手に 使ったら怒られそう。大学共同利用のシステムなんで。 >>253 かなり頻繁に更新してますた。数秒に1回ぐらい。 進行状況を書いてただけなので、flush頻度を1/100 にしたら速度がだいたい元に戻りました。
255 名前:デフォルトの名無しさん [2008/05/23(金) 01:30:25 ] >>254 普通の大学の計算機センターならローカルディスクぐらい用意してるよ。 聞いてみな
256 名前:251 mailto:sage [2008/05/24(土) 18:29:49 ] 計算の進行状況をlogに書くってのも一歩間違うと大変な事になるな。 計算で64bit Intetgerを使って、桁あふれ(2^64)が起きたら 「SKIPしますた」とlogファイルに書いて次ぎのデータ処理に入る ようにしてたんだ。 今まで深さ4の処理をしてたんだが桁あふれが起きてなかった。 次に深さ5の処理に入ったんだ。とたんに桁あふれが増えて 「SKIPしますた。」でdisk使用制限が超えそうになっちまった。 テラヤバスで、20時間実行したjobを強制停止… >>255 いや、他大学システムなんで、あまりくだらない質問したく なくて。利用料金も私が出したんじゃなくて、教授のだし。
257 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 19:24:36 ] MPICHのMPI_Finalizeって常時ポーリングしてんのかな? 処理が終ってFinalize待ちのプロセッサの負荷が100%になってやがる。 割り込み使ってくだちゃい。
258 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 21:52:46 ] 負荷100%といえば、 rank=0のタスクをjobのマネージメントだけにつかって rank=1以降を計算に使うプログラムを書いた。 rank=0とrank=1以降でも大してCPU使用率がかわらん かった。rank=0のタスクはMPI_RECVで待機してただけ なんだがな。
259 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:58:08 ] MPIで複数のCPUを使って計算させたときに、計算の速さ(結果)を秒数などで表示する 何か良いプログラムは無いでしょうか? 姫野ベンチやHPLだと、結果がFLOPSでしかでないので分かりにくいと言われ 体感的(秒数なもの)にわかるものにしてほしいと(´・ω・`) 思いつく簡単なベンチマークを例であげると、例えばスーパーπの104万桁を2つのCPUで 計算した場合は○○秒かかったけど、4つだと○秒だったよ!という感じです。(ベンチマーク じゃなくてもいいです。) よろしくお願いします。
260 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 23:17:57 ] >>259 自分で秒数に戻せばいい。そもそも計算速度(flop/sec)というのは 計算速度=計算量÷計算時間 として求めている。 計算量(浮動小数点演算の回数)はプログラムによって決まる。 ベンチマークプログラムなら解説文書に計算量が書いてあるはず。 計算量と計算速度が分かれば当然ながら 計算時間=計算量÷計算速度 で秒数が分かる。
261 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 01:48:01 ] >>260 アドバイスありがとうございます! なるほど! そういう風に求めるのですね。 助かりましたm(__)m
262 名前:デフォルトの名無しさん [2008/06/21(土) 10:55:46 ] time mpirun -np 3 aho & でいいじゃん。 各ノードごとの時間を知りたければ mpirun -np 3 time aho & でできるぜ
263 名前:259 mailto:sage [2008/06/26(木) 17:15:29 ] >>262 timeを使えば計算時間分かりますね! アドバイスありがとうございますm(__)m すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで 高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体 の計算なので何を計算しているのかイメージが付きにくいんじゃないか? と、言われまして何かイメージが付きやすいプログラムというのは無い でしょうかね・・・? すいません、変な質問をして(汗
264 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 22:30:47 ] >>263 計算結果を可視化するところまでやるとか。 でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。 あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして 並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
265 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:51:51 ] >>263 迷路。 ノードごとに探索経路を色分けすればぐー
266 名前:259 mailto:sage [2008/06/27(金) 11:53:25 ] >>264 >計算結果を可視化するところまでやるとか。 >でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。 そうなんですよね〜 分子力学のプログラムで計算結果を可視化できるものがあったんですが リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。 >あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして >並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。 なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね! アドバイスありがとうございますm(__)m >>265 >迷路。 すいません。 迷路というのは迷路を解くと言う事でしょうか?
267 名前:デフォルトの名無しさん [2008/08/22(金) 20:08:51 ] すいません MPI初心者です。 windowsでMPIを実行しようとしているんですけどエラーがでて困っています。 インクルドのパスは切っています。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした というエラーがでます。 なんで何でしょう。いきなり初期設定でつまずいて恥ずかしいのですが だれかアドバイスしていただけないでしょうか。
268 名前:デフォルトの名無しさん [2008/08/23(土) 08:45:51 ] >>267 それで他人になにか状況が伝わるとでも?
269 名前:デフォルトの名無しさん [2008/08/23(土) 18:49:31 ] C:Program Files\MPICH2\lib C:Program Files\MPICH2\include を追加する。 最低これでエラーはなくなるはずのに認識できない。 メッセージは同様。 error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。 error C3861: 'Init': 識別子が見つかりませんでした 絶対windowsで同様なエラーが出ている人がいるはず。 MPICH2はwindowsでは無理なのか?
270 名前:デフォルトの名無しさん [2008/08/23(土) 21:20:54 ] >>269 それで他人になにか状況が伝わるとでも? ソースくらい出せ。 コンパイルオプションくらい出せ
271 名前:デフォルトの名無しさん [2008/08/23(土) 21:22:39 ] windowsでMPICH2は「余裕で」動いてる。
272 名前:デフォルトの名無しさん [2008/08/24(日) 14:46:18 ] わかりました。 ウィザードで作った雛形をつかってコピしていたからみたいです。 空のディレクトリをしてしてファイル追加してみるとできました。 ご声援ありがとうございました。何の役にもたたなかったけど(w
273 名前:デフォルトの名無しさん [2008/08/24(日) 20:32:38 ] >>272 何の役にも立たないのは、お前がなんら情報を出さないからだろ。 自分の低能を棚上げしてイヤミで〆か。 新打法がいいね。
274 名前:デフォルトの名無しさん [2008/08/25(月) 17:29:10 ] >>273 野球していたが打てなかったので1本足打法に変えました。 するとよく打てるようになりました。 そして解説者に言われました。 新打法がいいね。
275 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:55:04 ] 自分の考えを人間にすら伝えられないバカは 自分の考えをコンピュータに伝えられるわけがない。 プログラムなんてやめた方がいいよ。
276 名前:デフォルトの名無しさん [2008/09/16(火) 08:21:40 ] OpenMPIってVistaじゃ使えないの?
277 名前:デフォルトの名無しさん [2008/09/17(水) 03:03:50 ] なんか荒れてる…w MPICH2いれてBoostのMPI使おうかと思ったが うまくいかね using mpi ; をusr-config.jamに書いたが パスが通ってないと言われる… いい解説サイト知っていたら教えてくださいませ
278 名前:デフォルトの名無しさん [2008/11/01(土) 04:35:50 ] MPI対応のFFTで、2次元の場合はタイル状に、3次元の場合はブロック状に、 データ分割可能なもの知りませんか? fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
279 名前:デフォルトの名無しさん [2008/12/01(月) 12:33:58 ] ちょっと質問なんですが MPI_Sendrecvってペアじゃないと使えないですかね? 片方がMPI_Sendrecv もう一方がMPI_SendだけとかMPI_Recvだけとか。 わかる方いたらご教授願いたいのですが。
280 名前:デフォルトの名無しさん [2008/12/04(木) 16:33:04 ] シングルノードWinXP-Proの環境で、MPICH2に付属ので例題cpi.exeを実行してみたら動きませんでした。 エラーメッセージは特になく、タスクマネージャで確認するとCPUコア数分のcpi.exeが実行中であるのが 確認できるのでが、強制終了する以外コントロールできない状況です。MPICH1ではうまくゆくのですが。 どなたかご教示のほうよろしくお願いします。
281 名前:デフォルトの名無しさん [2009/01/13(火) 08:26:39 ] MPI初心者です。MPICH2をMacOSXにインストールしました。 とりあえず以下のコードを実行しました。 $ mpicc test.c $ mpiexec -n 3 ./a.out #include <stdio.h> #include "mpi.h" int main(int argc, char **argv){ int nprocs; int mype; int proc_name_len; char proc_name[40]; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mype); MPI_Get_processor_name(proc_name, &proc_name_len); printf("My name is : %s\n", proc_name); MPI_Finalize(); } すると、結果は My name is : tetsuya-sato-macbook.local My name is : tetsuya-sato-macbook.local My name is : tetsuya-sato-macbook.local となりました。全処理が自分の端末で実行されてしまっているということでしょうか。環境設定がうまくいっていないのでしょうか。 一応、自分の端末からssh経由でログイン出来るLinux端末が10台あるので、自分の端末のホームディレクトリ配下に mpd.hostsファイルを作成してそれら10台のマシンのホスト名を記述しました。次に、自分の端末で $ cd ~/.ssh $ ssh-keygen -t rsa $ cp ida_rsa.pub authorized_keys2 としました。それから、このauthorized_keys2ファイルをsshでログイン出来るLinux端末10台の ~/.ssh/配下にSCPにてコピーしました。この先、何をやればよいでしょうか?
282 名前:デフォルトの名無しさん mailto:sage [2009/01/14(水) 00:08:03 ] 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
283 名前:281 [2009/01/15(木) 03:39:43 ] >>282 有り難うございます。出来ました。 別の質問なのですが、以下のコードを実行すると、結果は順不同で出力されます。 #include <stdio.h> #include <stdlib.h> #include "mpi.h" int main(int argc, char **argv){ int nprocs; int mype; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mype); printf("proc番号は : %d\n", mype); MPI_Finalize(); } <結果> proc番号は : 0 proc番号は : 2 proc番号は : 1 これを必ず昇順の0、1、2のランクの順に出力したい場合はどう修正すればよいでしょうか?
284 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 10:36:11 ] >>283 別々のプロセスが勝手に出力を出しているのでそうなる。 ノード0 出力が終わったらノード1に何か情報を送る ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信 ・・・ という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
285 名前:デフォルトの名無しさん mailto:sage [2009/01/15(木) 14:13:53 ] 最初の頃に買った本紹介しとくよ www.amazon.co.jp/dp/456301544X/ www.amazon.co.jp/dp/4621047736/
286 名前:281 [2009/01/16(金) 09:59:35 ] >>285 どっちか一冊買ってみます。 >>284 こんな感じにしたのですが、順番に出力されません。書き方、まずいでしょうか? #include <stdio.h> #include <stdlib.h> #include "mpi.h" int main(int argc, char **argv){ int nprocs; int mype; int dummy; int i; int tag=0; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &mype); for(i=0; i<nprocs-1; i++) { if(mype==i) { printf("My proc is : %d\n", mype); MPI_Send(&mype, 1, MPI_INT, i+1, tag, MPI_COMM_WORLD);} if(mype==i+1) { MPI_Recv(&dummy, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);} } if(mype==(nprocs-1)) { printf("My proc is : %d\n", mype);} MPI_Finalize();} <実行> mpirun -np 5 -machinefile mpd.hosts ./a.out
287 名前:デフォルトの名無しさん [2009/01/16(金) 11:11:50 ] >>286 それ、最終ノードが受信してなくね? printf後にfflushするといいかも それとループするより素直に ノード0 表示 送信 ノード 1...n-1 受信 表示 送信 ノード n 受信 表示 でバラして書いた方が見やすいと思う。 同じコードをたくさん書きたくなければ、受信、送信のところを条件分けで囲ったものの間に共通の表示処理を入れるか。
288 名前:デフォルトの名無しさん [2009/01/30(金) 11:49:31 ] One of the processes started by mpirun has exited with a nonzero exit code. This typically indicates that the process finished in error. If your process did not finish in error, be sure to include a "return 0" or "exit(0)" in your C code before exiting the application. PID 13373 failed on node n0 (1**.1**.**.10) due to signal 9. とエラーが出ます。 パック、アンパックを利用して、何度も送受信出来ているんですけど、 5000回程度繰り返したところでエラーがでます。 考えれる原因などありますか?
289 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 20:45:55 ] >>288 プログラムのどっかでreturn 0かexit(0)してんだろ
290 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 22:40:48 ] 質問 コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が No such fileって言われるんだけどこれはどう解決すればいいですか?
291 名前:デフォルトの名無しさん mailto:sage [2009/01/30(金) 23:51:35 ] MPIみたいな、少なくとも大学院クラスの人間が数値解析で使うもののスレにしては エスパーを要請する質問が多いな。 そんな表現能力じゃ論文もかけないだろ。
292 名前:デフォルトの名無しさん [2009/02/02(月) 21:48:56 ] >>289 return 0はmain関数の一番最後でしかやってません。
293 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 21:52:31 ] >>292 signal9だからSIGKILLだ。 自分で殺してないんだったら、誰かにプロセス殺されてるんじゃないのか。 時間貸しのスパコンとかだったら、一定時間来たらプロセス殺されるぞ。
294 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 13:14:23 ] どうせおまえさんんが書いたコードのバグだと思うけど とりあえずソースさらしなよ それで解決するかどうかは分からんけど、 少なくとも>>289 みたいなアホは湧かなくなるよ
295 名前:. mailto:sage [2009/02/03(火) 16:56:38 ] >>294 >>288 から得られる情報は>>289 くらいしかないだろう、実際。
296 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:26:54 ] >>290 エスパー回答だが、コンパイル時にmpiccを使ってないとか?
297 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:43:21 ] スパコンのバッチファイルって、QUEUEに投入後書き換えても 反映されるのかな? ちょいスクリプトのタイポして、書き換えたい のだが… 64CPUなのにSIZEの所に8と書いてしまった… 今の時期、QUEUEに順番待ちが多くて、再投入すると多分一週間後 になるんだ。 --------- cd ${QSUB_WORKDIR} SIZE=64 C=1 while [ ${C} -lt 10 ]; do echo -n STEP${C}: ; date mpiexec -n ${SIZE} ./a.out ${C} let C=C+1 done echo -n DONE: ; date ----------
298 名前:294 mailto:ponutka29@やふー [2009/02/05(木) 10:25:41 ] みなさん、丁寧にありがとうございます。 2chにソースはあげたくないので、メール頂けると助かります。
299 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 13:19:21 ] >>298 いくら払うんだ?
300 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 22:34:17 ] >>298 どうせ卒論だろ。研究室の先輩に聞けよ。
301 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 17:59:18 ] マスタープロセスの処理内で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);
302 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 02:46:50 ] arkouji.cocolog-nifty.com/blog/mpich2/index.html 概ね、ここに書いてあるようにやりました。 (使いたいのはfortranなのでfortranの設定は別にやっときました) ここの一番下のサンプルコードをビルドしようとすると以下のエラーが出ます。 warning C4627: '#include "mpi.h"': プリコンパイル済みヘッダーの使用を検索中にスキップされました 行;1 warning C4627: '#include <iostream>': プリコンパイル済みヘッダーの使用を検索中にスキップされました 行;2 fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? 行:18 また、fortranのコードを自分で書いてビルドしようとすると、以下のようなエラーが出ます。 fatal error LNK1181: 入力ファイル 'mpilib.obj' を開けません。 どこが間違ってるんでしょうか?環境はvisual studio2008とvisual fortran11です。
303 名前:302 mailto:sage [2009/03/11(水) 02:59:26 ] アドレス間違えました。こっちです。 ums.futene.net/wiki/Paralell/4D5049434832206F6E2057696E646F7773204C6F63616C.html
304 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 02:12:20 ] > 使いたいのはfortran > #include <iostream> > int main(int argc,char **argv) これのどこがFortran…
305 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 18:40:57 ] >>304 いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。 「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。 分かりにくくて申し訳ないです。
306 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 19:24:10 ] >>302 プロジェクトのプロパティの Configuration Properties → C/C++ → Precompiled Headers → Create/Use Precompiled Header を Not Using Precompiled Headers にすればいいと思われ。 (VC++ で C のプログラムをコンパイルするときによくハマる罠です。) これは英語版の VC++ 2008 の表記だけど日本語版にも該当する項目があるはず。
307 名前:302 mailto:sage [2009/03/12(木) 20:45:54 ] >>306 Cの方は出来ました!ありがとうございます。
308 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 21:26:09 ] 正直、Linux入れてmpif77とかmpiccとかのラッピングされたコマンド使ったほうが楽だろ。 ライブラリが足りないとかそんな次元が自己解決できないようなら。 KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
309 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 23:17:29 ] >>307 動いて良かったね。Fortran の方は俺は使ったことないので単なる予想だけど mpi.lib の点(ピリオド)が抜けてて mpilib → mpilib.obj と解釈されてるのでは。 あと mpi.lib と一緒に fmpich2.lib も要るかも。 >>308 普段 Windows で暮らしていると実行してデバッグできる MPICH2 for Win32 は とっても便利ですよー。多少苦労しても使う価値があると思います。Windows マシンはありふれているので手近の PC をかき集めて“なんちゃってクラスタ”を 作るといったことも案外簡単にできます。
310 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 07:00:15 ] >>308 もともと、リモートにlinuxが入っててmpiが使える計算機はあるんですが、ちょっと楽して 開発したかったので。情けない話ですがCUIは苦手なんで出来る限り避けてます… と言おうと思ったらKNOPPIXってGUIなんですね。そんなのもあったんですね。 >>309 全ておっしゃるとおりでした。お恥ずかしいです。 後から僕のようなレベルの人がここに来た場合のために経過を書いときます。 mpi.libに直したところ、未解決のシンボル云々というエラーが出てきたので、 fmpich2.libを追加したらビルドが成功しました。その後、実行しようとすると、 mpiexec.exeが見つかりません、と出ました。C:\Program Files\MPICH2\bin\への パスは通っているので、プロジェクトのプロパティ→コマンド のところにはmpiexec.exe とだけ書いておいたんですが、念のためC:\Program Files\MPICH2\bin\mpiexec.exeと フルパスにするとちゃんと動きました。パスが通ってても上の指定じゃだめなんですね。 ちなみにデバッグ無しで実行すると問題なく出来るけど、デバッグ開始を選択すると デバッグ情報が見つからないか、または一致しませんってエラーが出ました。 要するにブレークポイントとか関数ウオッチとかあのあたりが使えないってことですかね。 もはやmpiの質問でも無さそうなんで、も少し調べてみることにします。 ところで参考までにお聞きしたいんですが、309さんはどういう環境で使ってらっしゃるんでしょうか?
311 名前:302 mailto:sage [2009/03/13(金) 07:02:25 ] というかマニュアルに思い切りfortranの場合fmpich2.libを追加してね、と 書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
312 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 10:23:00 ] >>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 で実行できることに意味があると思いました。
313 名前:デフォルトの名無しさん mailto:sage [2009/03/13(金) 19:04:32 ] MPI2のMPI_Put/MPI_Getを使いたいので早速簡単なコードを書いたのですが、思うように 動作しません。日本語の文献が極端に少ないので英語のサイトを見ながらやっているのですが、 サンプルコードが難しいものが多く理解出来ていません。まずはシンプルに、プロセス1の変数aを単純にプロセス0 の変数aにコピーしたいだけなのですが、MPI_Send/MPI_Recvを使わずにMPI_Getを使うにはどのように書けばいいでしょうか? 下のコードのどこがおかしいのかご指摘下さい。 ttp://www.dotup.org/uploda/www.dotup.org1347.c.html
314 名前:313 mailto:sage [2009/03/14(土) 05:12:50 ] 他んとこに聞いてみます
315 名前:302 mailto:sage [2009/03/14(土) 18:05:44 ] >>312 ありがとうございます。 あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな… OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで これからは多少そのへんも自分で勉強してみます。
316 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:15:30 ] >>314 312に書いたアプリの場合は、実環境で試したところ OpenMP+MPI は素の MPI よりわずかに 遅いかほとんど同じという結果でした。 もっとも、どちらの性能がいいかは問題、ハードウェア、ソフトウェアなどに依存しますし、 最終的にはやってみないと分かりませんので、可能性があると思ったら試す価値があります。 ハイブリッド並列化に興味があるのでしたら次の記事が参考になると思います。 T2Kオープンスパコン(東大)チューニング連載講座(その5) OpenMPによる並列化のテクニック:Hybrid並列化に向けて www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
317 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:17:51 ] レス番号をまちがえました。316は>>315 宛てです。
318 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:47:30 ] VS 2008 のExpress EditionはOpen MP非対応じゃなかたか。
319 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 05:57:00 ] >>318 Windows SDK for Windows Server 2008 and .NET Framework 3.5 を一緒に入れると使えます。 参考:tech.ckme.co.jp/vc.shtml
320 名前:デフォルトの名無しさん [2009/04/02(木) 20:54:42 ] 初めまして、MPIを勉強中の者で、使用言語はGFORTRANを使っています。 メイン又はサブにMPI_INIT〜MPI_FINALIZE及び計算式を一括して含む場合は 問題なくプログラムは動きますが、メインにMPI_INIT〜MPI_SIZEを サブにMPI_SEND、MPI_RECV、MPI_BCAST等と計算式を分離した場合、 リンクはできますが、実行時OSがエラーを発行し動きません。 そこで’MPI_COMM_WORLD’をメインでラベルつきCOMMONで確保し サブに渡すと、OSからのエラーメッセージはなく実行は出来ますが、 今度は’MPI_COMM_WORLD’からINVARID DATA TYPEが発行され、 値が上手く通信できません。ご指導願います。
321 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 03:39:48 ] 質問です。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 とでもしないとダメなんでしょうか?どう考えてももっとスマートなやりかたが ありそうなんですがどうなんでしょうか?どなたか教えていただけませんか?
322 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 12:07:03 ] >>321 MPI_ALLGATHERV
323 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 04:03:40 ] お答え頂き有難うございます。ただ、ほとんど基本的なサブルーチンしか使ってないので MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の 位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に 関してはこの通信の前に教えてやる必要があるということになるでしょうか?
324 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 08:34:21 ] >>323 そうです。
325 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 15:13:03 ] なるほど、大体分かりました。mpi_allgathervを使う場合、 num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。 mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので 送信の開始アドレスをずらして指定して大丈夫なんですよね? それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか? あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが… キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
326 名前:デフォルトの名無しさん mailto:sage [2009/04/06(月) 02:44:25 ] コード例を示したほうが良さげですね。こういう具合です。 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 のように実行すると 良いような気がします。
327 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 01:08:39 ] あるある
328 名前:デフォルトの名無しさん [2009/06/03(水) 17:15:01 ] PVMからMPIに鞍替えしようと思って勉強を始めようと思うのだが 今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
329 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:59:12 ] >>328 MPIの実装に依存するようなプログラムでも作る気かい?
330 名前:お願いします [2009/06/18(木) 20:47:03 ] MPIでどうしてもわかりません。 f(x)=x*xの0~1の積分なんですが、答えが通常0.3333となるはずですが なぜ以下のプログラムだと違った答えがでるのでしょうか? すみません、どなたか教えていただけないでしょうか? ちなみにプログラムはよくあるMPI(倍風館)の本のものです。 実行すると0.000488のような値がでてきます。困っています。 どうやれば0.3333みたいな値を得ることができるでしょうか?
331 名前:お願いします [2009/06/18(木) 20:53:12 ] #include <stdio.h> #include <mpi.h> main(int argc, char** argv) { int my_rank; /* カレントプロセスのランク */ int p; /* プロセスの数 */ float a = 0.0; /* 全積分区間の左端 */ float b = 1.0; /* 全積分区間の右端 */ int n = 1024; /* 台形の全個数 */ float h; /* 台形の底辺の長さ */ float local_a; /* 本プロセスの積分区間の左端 */ float local_b; /* 本プロセスの積分区間の右端 */ int local_n; /* 本プロセスの台形の数 */ float integral; /* 本プロセスの積分 */ float total; /* 全積分値 */ int source; /* 積分を送るプロセス */ int dest = 0; /* すべてのメッセージは0へ */
332 名前:お願いします [2009/06/18(木) 20:53:55 ] int tag = 0; MPI_Status status; /* ローカルな積分を計算する */ float Trap(float local_a, float local_b, int local_n, float h); /* MPIの初期化 */ MPI_Init(&argc, &argv); /* カレントプロセスのランクを求める */ MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); /* プロセスの数を求める */ MPI_Comm_size(MPI_COMM_WORLD, &p); h = (b-a)/n; /* hはすべてのプロセスで同じ */ local_n = n/p; /* したがって台形の数も同じ */ /* 各プロセスの積分区間の長さはlocal_n*hである。 */ /* 本区間は次から始まる */ local_a = a + my_rank*local_n*h; local_b = local_a + local_n*h; integral = Trap(local_a, local_b, local_n, h);
333 名前:お願いします [2009/06/18(木) 20:54:39 ] /* 各プロセスの積分を加算する */ if (my_rank == 0) { total = integral; for (source = 1; source < p; source++) { MPI_Recv(&integral, 1, MPI_FLOAT, source, tag, MPI_COMM_WORLD, &status); total = total + integral; } } else { MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD); } /* 結果のプリント */ if (my_rank == 0) { printf("With n = %d trapezoids, our estimate\n", n); printf("of the integral from %f to %f = %f\n", a, b, total); } /* MPIを閉じる */ MPI_Finalize(); } /* main */
334 名前:お願いします [2009/06/18(木) 20:55:45 ] float Trap( float local_a /* 入力 */, float local_b /* 入力 */, int local_n /* 入力 */, float h /* 入力 */){ float integral; /* 積分値 */ float x; int i; float f(float x); /* 被積分関数 */ integral = (f(local_a) + f(local_b))/2.0; x = local_a; for (i = 1; i <= local_n-1; i++) { x = x + h; integral = integral + f(x); } integral = integral*h; return integral; } /* Trap */ float f(float x) { float return_val; /* f(x) を計算する */ /* return_val に計算結果を入れる */ return_val = x * x; return return_val; } /* f */
335 名前:お願いします [2009/06/18(木) 20:57:04 ] これと一緒なんです。 tetralog.in/t/?date=20060118 本当よろしくお願いします。
336 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 00:14:35 ] まず各ノードのintegralを送信せずに表示してみろよ。 積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。 この程度のことくらいやってから他人に聞けば?
337 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 14:08:34 ] >>330 手元で実行してみたが $ mpirun -np 2 ./a.out With n = 1024 trapezoids, our estimate of the integral from 0.000000 to 1.000000 = 0.333333 となったぞ。ハードウェアの構成は何だ?
338 名前:お願いします [2009/06/19(金) 19:45:20 ] ありがとうございます。 PCクラスタ環境は Fujitsu PRIMERGY RS200 ×16台 Xeon 3.20GHz/L3:1MB ×2 2GBメモリ 146.8GB HDD ×2(RAID1利用のため実効はこの半分) 73GB HDD ×5(RAID5利用のため実効はこの4/5) こんな感じです。
339 名前:お願いします [2009/06/19(金) 20:10:05 ] 見直したんですがやっぱり出てくる答えは0.000488になって正しくないです。
340 名前:デフォルトの名無しさん mailto:sage [2009/06/19(金) 21:01:54 ] >>339 だからよ、まずは積分単体が戻す答えを見て見ろっての。 どうせなにかの打ち間違いだろ。
341 名前:デフォルトの名無しさん [2009/06/19(金) 21:04:22 ] MPIがおかしいと思うなら、そんな積分した答えじゃなく、1とか単純な値を送信しろよ。 自分で問題切り分ける意思がゼロだな。
342 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 04:41:49 ] 本当にコピペしたコードそのままで打ち間違いが無いのなら、 まずはMPI部分を全部削って1CPUで動かしてみろよ。
343 名前:お願いします [2009/06/20(土) 12:43:17 ] MPI部分なしでやれば0.333でます
344 名前:デフォルトの名無しさん [2009/06/20(土) 18:44:42 ] Mac用のMPIはどこで手に入りますか?
345 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 18:45:15 ] MacにはOpenMPIが入っているが
346 名前:デフォルトの名無しさん [2009/06/21(日) 07:22:30 ] 通常のGigabitイーサネットとInfiniBandではMPIを使った際にどの程度差が出ますか? もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
347 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 19:20:41 ] >>346 自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、 InfiniBand環境でどれくらい改善するか、予測が付くだろう。 あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、 並列化効率がでない場合も多いので、この点も注意した方がいい。
348 名前:デフォルトの名無しさん [2009/07/06(月) 06:59:07 ] MPIの本を読むとSendとReceiveって奇数ノードと偶数ノードそれぞれ順序を逆にして書かないとデッドロックが発生するようなのですが、 今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。 OSか何かに依存するのでしょうか?
349 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:10:54 ] MPI_SendとMPI_Recvは送受信が完了するまで戻ってきませんが。 MPIの仕様なのでOSには依存しません。 別に偶数ノードと奇数ノードとか関係ありません。 送信と受信が対になって実行されないといけないだけです。 ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、 別の関数で送受信が完了しているか確認をとる必要があります。
350 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:46:09 ] >>348 どの本のどういう記述よ
351 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:04:08 ] そういえば、標準モードでMPIが勝手にバッファリングモードを使用していたら対応する受信が起動ていなくても戻ってくるか。 そういう意味ではMPIの実装依存でデッドロックが起きていないということになるわな。
352 名前:デフォルトの名無しさん [2009/07/07(火) 16:32:14 ] n 行 n 列 の整数二次元配列 A(i, j) のうち、i = 1 の成分 (A(1, 1), A(1, 2), A(1, 3), ..., A(1, n-1), A(1, n)) だけを j = 1 から m 個ローカルプロセスの B(j) に集めたいと思います。 そこで、mpi_gather を使って以下のように書いたのですが、 このままでは m/n 個しか B(j) に渡されないようなのです。 call mpi_gather(A(1, 1), m, mpi_integer, B(1), m, mpi_integer, 0, mpi_comm_world, ierr) fortran で書いていますので、この原因がメモリ上でのデータの 並び方(データがメモリ上で A(1, 1), A(2, 1), A(3, 1), ..., A(n, 1), A(1, 2), ... と並ぶ)なのだろうと思いますが、もし 飛び飛びでデータを選ぶ(j だけ m 個 ローカルに渡す)方法を ご存じでしたら教えて頂けないでしょうか? 初心的な質問ですみません。
353 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:07:19 ] >>352 つ MPI_TYPE_VECTOR
354 名前:デフォルトの名無しさん [2009/07/07(火) 20:32:32 ] >> 353 神様、仏様、353様! 早速お教え頂きありがとうございました。
355 名前:デフォルトの名無しさん [2009/07/24(金) 16:46:11 ] MPICH2とOpenMPIを使い分ける基準ってなんなのだろう 構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
356 名前:355 [2009/07/24(金) 16:49:25 ] ちなみに自分のはMac OS XなのでOpenMPIが標準で入っているそうですが (XgridもOpenMPIを通して使うそうですね) MPICH2のほうはどうなのか、ちと気になりましてw
357 名前:デフォルトの名無しさん [2009/09/06(日) 10:48:01 ] mpif77 でコンパイルは出来るのですが、 実行時 に mpirun -np 4 tttt と入力すると error while loading shared libraries : libompi_f77.so.o cannot open云々 となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
358 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 11:37:43 ] >>357 実行時に .so ファイルを探したが見つからないというエラーなので適当な設定を加える必要がある。 libompi_f77.so のあるディレクトリを仮に /opt/lib とすると a) コンパイル時に -Wl,-rpath,/opt/lib オプションを指定する b) 実行時に環境変数 LD_LIBRARY_PATH=/opt/lib を設定する c) /etc/ld.so.conf に /opt/lib を追加して ldconfig コマンドを root 権限で実行する のどれかをすればいいと思われ。 a) は gcc のオプションで他のコンパイラにも同じようなオプションがある(はず)。 b) の環境変数の指定方法はあなたが使っているシェル(bash とか tcsh とか)によって違うので調べて。 c) は Linux の方法で、他の OS だとファイル名が違うかも知れない。
359 名前:デフォルトの名無しさん [2009/09/06(日) 13:37:28 ] サンプルプログラムを実行することができました。有難うございます
360 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 16:07:43 ] 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 ってやって使っても問題ないでしょうか?
361 名前:デフォルトの名無しさん mailto:sage [2009/09/18(金) 18:29:39 ] 好きにせぇや
362 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 00:13:13 ] すいません、Visual studioのスレで聞いたんですが、 こっちで聞いた方が良いとのことでこっちにきました。 Visual studio2008+MPICH2+ifortranを使ってます。 ブレークポイントやステップ実行などが使いたいのですが、 デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。 msdn.microsoft.com/ja-jp/library/ms164731.aspx 上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、 デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、 また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています) ちなみにデバッグなしで開始なら問題なく実行できますが… 今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、 さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、 どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって 足りない情報などあればご指摘ください。
363 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:43:11 ] >>362 VSスレの方がいいんじゃねーかな。 windowsでMPI使う物好きは少ないと思うし。 つーか、モロにVSの使い方だし。
364 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 21:53:16 ] 質問です。fortranで配列の要素数をプロセス数に応じて決めたいのですが、 どのように宣言したらよいのでしょうか?allocateを使うしかないでしょうか? 77では無理ですか?
365 名前:デフォルトの名無しさん [2009/10/14(水) 11:12:10 ] call mpiplay(n) subroutine mpiplay(n) real data(n) とか、かな。Initializeやfinalizeはメイン階層でしてね。 もっとも今は77とそれ以降を混ぜて書いても解釈してくれるから allocate でがんがんやっても良いと思うけど。
366 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 19:51:56 ] >>365 なるほど。動的配列を使うまでもなくそれでいいのですか。 ありがとうございます。もう一つお聞きしたいのですが、 メインでもその配列を使いたいときはどうすればよいでしょう? rank等の取得の前に宣言部が来るのでそのやり方では出来ないでしょうか? ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか?
367 名前:365 [2009/10/15(木) 05:59:50 ] 365の例では サブルーチンでの型宣言 integer n とMPI呼出呪文w include 'mpif.h' が抜けてたね。 呪文はメイン階層でもする必要があるけど。 >>366 配列の要素数を、例えばプロセス数の100倍にしたければ、 program mpiwrapper (略;なんか行があったりなかったり) include 'mpif.h' (略、宣言部とか) call mpi_init(ierr) (略) call mpi_comm_size(mpi_comm_world,nprocs,ierr) n=nprocs*100 call mpiplay(n) (略) call mpi_finalize(ierr) stop end program mpiwrapper subroutine mpiplay(n) include 'mpif.h' integer n real data(n) (略) call mpi_comm_rank(mpi_comm_world,myrank,ierr) (略;分割対象のループがいっぱい。初期化とかiteration処理とか) (略その2;data配列をmainにお持ち帰りできないので書き出しとかはこの階層で) return end subroutine mpiplay かな?wrapperの表現が適切かはちと疑問だけど、まあここではOKということで・・・。 この例だと変数の初期値代入から書き出し保存などは全部 mpiplay(n)階層ですることになるね。
368 名前:デフォルトの名無しさん [2009/10/15(木) 06:29:09 ] そんなわけで、fortran77コンパチで且つ前もって配列サイズを決めなくて良い、というのは できるけど。めんどいよねw. 自分自身はコマンドラインの引数を使いたい、 計算コード自身は77で書いてしまった、の2つの理由で メイン階層のWrapperをCでつくる事が多いけど。上の例は良くつかう。 やはり、というか配列サイズが前もって決まっていないタイプのコードは 最適化が抑制されるのか、遅いね。まあいちいちコード編集&コンパイルの 手間がかからないから楽といえば楽だけど。
369 名前:デフォルトの名無しさん [2009/10/15(木) 06:37:31 ] だらだら書いてしまったけど・・・・ >>366 ダミー的にメインを作って、本当のメインをサブルーチンとして呼ぶとか? にYes!と書けば終わりだったな・・・・w 早起きはするものではないね。
370 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 05:54:20 ] >>369 いえ、結構怪しかったんで具体的に書いてもらって助かります。 丁寧に教えてくれてありがとう。
371 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 20:52:34 ] すみません、もう一つ質問なんですが、 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まで) 基本的に通信回数は減らした方がパフォは上がるという認識で良いですよね?
372 名前:デフォルトの名無しさん mailto:sage [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
373 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 06:45:10 ] >>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とかの話あまり分かりません。 でもそれで置換出来るならプログラム書く効率あがりそうですね。覚えた方がいいと思いつつ… 統合環境がそういう複雑な置換装備してくれたらいいのにな。甘えすぎですか。
374 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:38:00 ] >>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
375 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 09:39:35 ] 第一添字(右端) ↓ 第一添字(左端)
376 名前:デフォルトの名無しさん [2009/10/20(火) 06:46:25 ] インテルコンパイラだけど、MPI使うには、インテルの売ってるやつを使わないといけないの?
377 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 22:03:31 ] 何でもええ。 ライブラリがリンクできれば。
378 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 02:41:08 ] MPI はコンパイラもだけど mpirun がないと。 自宅で文法チェックするだけなら -I -L
379 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:52:21 ] max plunk institute !
380 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 06:45:10 ] >>374 遅くなったけど本当にどうもありがとう。うまくできました。 ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで 3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?
381 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 20:05:53 ] 最近HyperThreading対応の4coreのCPUが家庭向けの値段まで落ちてきたので 購入したのだが、ここまでスレッド数が多くなるとメモリ帯域か何かが溢れて 評価しないと使えないな。 同じプログラムが、 Pentium4 2.8GHz(1core * 2スレッド)ではMPIで2プロセス走らせると1.6倍ぐらい速くなったけど、 Corei7-860(4core * 2スレッド)ではMPIで8プロセス走らせると4プロセスに比べて0.9倍 ぐらいに遅くなったよ。
382 名前:デフォルトの名無しさん [2009/10/26(月) 06:36:28 ] core i7か・・・いいな。このお金持ちめw いくらだった? 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? 職場での印象では mpirun がメモリアクセスのスケジューリングを うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。 やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。 ・・・・OpenMPだともう少しマシな数字がでてくるのかな?
383 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 06:42:32 ] >>381 CPU とプロセス(またはスレッド)のアフィニティはどうしてる? プロセス数が多くなればなるほど、きっちり固定してやらないと パフォーマンス低下の原因になる希ガス。
384 名前:382 mailto:sage [2009/10/26(月) 07:00:00 ] OpenMPはデフォだとうろうろするのは知ってたけど。 MPIも固定しないのか・・・知らんかった・・・。
385 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 09:46:19 ] windowsだとOSがウロウロさせるんだけど。 高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。 LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
386 名前:381 mailto:sage [2009/10/26(月) 23:47:19 ] ふと4とか8プロセスとかとか切りのよい数字じゃなくて5とか6プロセスで 実行したらどうなるんだろうと思った。 現在1〜8プロセスの全てのパターンをベンチ中。多分終わるのは明日。 > core i7か・・・いいな。このお金持ちめw いくらだった? 再利用などしたので、マザボとメモリとCPUしか買ってませんが、46,675円 > 1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事? そういう事です。 > CPU とプロセス(またはスレッド)のアフィニティはどうしてる? そのあたり詳しくないのでほとんど設定変更せず使ってます。 ちなみにOpenMPI/CentOS5.4です。
387 名前:デフォルトの名無しさん mailto:sage [2009/10/27(火) 16:27:05 ] Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。 マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、 マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
388 名前:デフォルトの名無しさん [2009/10/28(水) 02:43:34 ] Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?
389 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:57:18 ] HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。 アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、 コア間で依存性があった場合は注意が必要だと思う。 HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。 ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
390 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 02:59:50 ] >>384 そりゃそうでしょ。MPIだってコアの指定をしないとだめ。 もちろんPthreadでも。
391 名前:デフォルトの名無しさん mailto:sage [2009/10/28(水) 03:24:38 ] いわれるとそりゃそうだわ、なんだけど 383のを見るまで気づかんかったw OpenMPだと dplace や taskset で固定できるけど、 これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?