トップページ⇒tech
500コメント204KB

Message Passing Interface (MPI) 統合スレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
MPIによる並列プログラミングについて話し合う統合スレッドです。

とりあえず本家
http://www-unix.mcs.anl.gov/mpi/

0385デフォルトの名無しさん2009/10/26(月) 09:46:19
windowsだとOSがウロウロさせるんだけど。
高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。
LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。
03863812009/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です。
0387デフォルトの名無しさん2009/10/27(火) 16:27:05
Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。
マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、
マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。
0388デフォルトの名無しさん2009/10/28(水) 02:43:34
Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?
0389デフォルトの名無しさん2009/10/28(水) 02:57:18
HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。
アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、
コア間で依存性があった場合は注意が必要だと思う。
HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。
ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。
0390デフォルトの名無しさん2009/10/28(水) 02:59:50
>>384
そりゃそうでしょ。MPIだってコアの指定をしないとだめ。
もちろんPthreadでも。
0391デフォルトの名無しさん2009/10/28(水) 03:24:38
いわれるとそりゃそうだわ、なんだけど
383のを見るまで気づかんかったw

OpenMPだと dplace や taskset で固定できるけど、
これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?
03923812009/10/28(水) 21:52:47
>>386
悪禁になってしまったのだが結果だけかくと
5プロセスで走らせると最速のようです
0393デフォルトの名無しさん2009/10/29(木) 01:33:12
>>392
それだとメモリアクセスが一番のボトルネックじゃない?
ちょうど5コアでいい感じでメモリ帯域を食ってくれて、それ以下だと使い切れなくて、
それ以上だといっぱいになってしまう。
という感じに思える。
0394デフォルトの名無しさん2009/10/29(木) 03:41:16
そんな感じっぽいね。381氏の実験に感謝。

最近はベクトル化を意識してループを短くして,(メモリでかくなったから)配列に中間結果を格納して・・・
というのがスパコンでは流行、というか推奨されるけど、HTでは
ループ内での処理が冗長なベクトル化をあまり意識してないw古いタイプの
コードが並列化では利得が大きいかも・・という事なのかな。
いまはCacheも大きいからたいがいループ内が長くても収まるし。
0395デフォルトの名無しさん2009/12/04(金) 22:16:21
mpiの勉強を始めたばかりの者です。今、Bcastをやっていますが、どうにも解らなくなりました。ご指導ください。
使っているコンパイラー等はGfortran、open mpiです。解らなくなったのは、メインでBcastを使っても問題ないのですが、
サブルーチンでBcastを使うとエラーが発生してしまうんです。なんででしょうか?ちなみにプログラムは以下のとおりなんですが。
*
MPI 宣言文
*
IF(Nrank.EQ.0) NCP1=1000
CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr)
*
KKK = 100
NNN = NCP1 + Nrank*KKK
PRINT *, NNN
これは問題なく動きますが、
 IF(Nrank.eq.0) NCP1 = 1000
 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr)
部分を IF(Nrank.EQ.0) CALL MAINSUBとし、サブルーチンを
 SUBROUTINE MAINSUB
IMPLICIT REAL*8(A-H,O-Z)
COMMON /ACTIVE/ NCP1
*
NCP1 = 1000
 CALL MPI_BCAST(NCP1,1,MPI_integer,0,MPI_COMM_WORLD,ierr)
*
RETURN
END
として、コンパイルし実行すると、 1000、 100、200、300と画面に出力され、notice thatjob rank 1 with PID 4737...の
メッセージが表示されますが、何故か原因が解らないのです。よろしくお願いします。
0396デフォルトの名無しさん2009/12/04(金) 22:49:20
>>395
サブルーチンMAINSUBの中でmpif.hのインクルードしてる?
0397デフォルトの名無しさん2009/12/05(土) 07:53:23
395 ですがやっていません。やってみます。
0398デフォルトの名無しさん2009/12/05(土) 08:04:52
395 ですが、動きました。どうも有難うございます。
0399デフォルトの名無しさん2009/12/12(土) 13:25:37
WindowsでMPIをつこうたプログラムをコンパイルしたいのですが、
Windows XP+Vistal C++ 2008 Express以外に、どれをインストールすればよいのでしょうか?
0400デフォルトの名無しさん2009/12/12(土) 23:30:24
MPICH
0401デフォルトの名無しさん2009/12/20(日) 02:28:58
MPIってユーザーグループの会とか友の会とかないんですかね??
もしなかったら作ってみたいなっと思いまして.2ヶ月に一度くらい勉強会とかライトニングトークしあう的な規模のもので.
0402デフォルトの名無しさん2009/12/20(日) 11:22:07
あんなもん、一旦意味がわかればマニュアル見るだけでOKなので
2ヶ月に一度とかタルいことしてたら、次の勉強会までにプログラムできるようになっている。
てか、それでできない人間だけ集まっても意味ないし、できる人間は参加してもタルいだけだろう。
0403デフォルトの名無しさん2009/12/20(日) 11:52:25
プログラムのほとんどを1スレッドで走らせ、一部を並列計算させたい場合、
その一部以外を if(myrank==0) で囲えばいいの?
0404デフォルトの名無しさん2009/12/20(日) 13:09:48
うん、たいていそれでいいよ。

非並列処理部分の結果を並列部分で使いたい時だったら
ちゃんと伝達するのを忘れないように><
0405デフォルトの名無しさん2009/12/21(月) 05:10:55
ですよね
なんとなく「プログラムのほとんどが if 文」ってのが違和感なんだけど
他に書き方ないよね
0406デフォルトの名無しさん2009/12/21(月) 09:37:58
そうそう、なんかif (myrank .....が冗長に出てくるのがなんかイヤw
並列の出入口でやることが決まっていれば関数に押し込めるけど、そういう事ってあまり多くないし
引数受渡し部分でちょんぼすることあるし・・・><
0407デフォルトの名無しさん2009/12/23(水) 09:49:25
現在勉強中で、Send、Recvを使って簡単なプログラムを作って動かしていますが、送るデータの個数が
500以下だと問題なく送受でき、送受結果を画面に表示できるのですが、500個を超えると送受結果が
画面に表示できません。プログラムが暴走したような状態になってしまうんです。
データの型は倍精度浮動小数点なんですが、解決策は無いでしょうか?使用している
mpiは openmpiです。
0408デフォルトの名無しさん2009/12/23(水) 10:52:26
受信側のメモリを確保しているのかと3秒問いつめたい
0409デフォルトの名無しさん2009/12/23(水) 12:40:54
407ですが、受け側でも送り側と同じ配列だけメモリーは設定しております。
当初は配列をアロケートしていましたが、疑問に思い、配列を設定して
再コンパイルして実行しても同じなんですが。
0410デフォルトの名無しさん2009/12/23(水) 13:05:15
他人に自分の意志を伝えられない奴が
コンピュータに自分の意志を伝えるプログラミングができるわけがない。

ソースもなしに・・・エスパーも求もと書いとけ。
0411デフォルトの名無しさん2009/12/27(日) 20:24:15
openfabrics.orgがつながらない、、、
0412デフォルトの名無しさん2009/12/28(月) 22:57:30
先日、Bcastの件で指導を頂いたものですが、今回、ScatterとGatherについてご指導願います。
プログラムは
program TEST
  implicit real*8(a-h,o-z)
:
:   MPIの使用開始の手続き
:
dimension a(2000),b(2000)
!
if(Nrank.eq.0) then
do i=1, 2000
a(i)=dble(i)
enddo
endif
!
call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision,b(1),20,0,MPI_COMM_WORLD,ierr)
!
if(Nrank.gt.0) then
do i=1, 20
print *,Nrank,b(i)  :この部分で画面に出力
enddo
endif
!
iiii = 1 + Nrank*10
call MPI_Gather(b(1),10,MPI=DOUBLE_Precision,a(iiii),10,MPI_DOUBLE_Precision,0,MPI_COMM_WORLD,ierr)
:
として、実行したのですが、画面出力部分では、出力値が全てのランクで0.0となるんです。
当然のことながらGatherでも同様なんですが、どうやった良いのか原因も何も解りません。どうかご指導ください


0413デフォルトの名無しさん2009/12/28(月) 23:06:52
失礼しました、
 Scatterで...,b(1),20,の後にMPI_DOUBLE_Precision,を書き漏らしております。
質問時の記入ミスです。すみません。
0414デフォルトの名無しさん2010/01/06(水) 09:09:27
これで出力が出ます。
それとGatherの方で
MPI=DOUBLE_Precision の=が_の間違い。
a(iiii)は、ランク0に送るなら
ランク0の受信バッファーを指定するので多分a(1)です。

implicit real*8(a-h,o-z)
include'mpif.h'
dimension a(2000),b(2000)
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,Nrank,ierr)
if(Nrank.eq.0) then
do i=1, 2000
a(i)=dble(i)
enddo
endif
call MPI_Scatter(a(1),20,MPI_DOUBLE_Precision,
& b(1),20,MPI_DOUBLE_Precision,
& 0,MPI_COMM_WORLD,ierr)
if(Nrank.gt.0) then
do i=1, 20
print *,Nrank,b(i)
enddo
endif
call mpi_finalize(ierr)
end
0415デフォルトの名無しさん2010/02/08(月) 17:39:36
PCだと大丈夫なんですが、大規模な計算機にジョブを投げたとき、
あるプロセスからの出力だけ途中で止まることがあります。
PCはintel fortran+mpich、大規模計算機はPGIfortran+Voltaire MPIです。

例えばプロセスごとにoutput00,output01,output02,output03のように
別のファイルに出力させているんですが、何かの拍子にいくつかが出力
されなくなったりします。ループの途中にbcastやbarrier等の同期があるので、
出力がないプロセスも計算そのものが停止しているということはないと思うのですが、
別のファイルや標準出力への出力も停止するのでうまく調べきれず、定かではありません。
かなり情報が少なくて申し訳ないのですが、考えうる原因、調査法、解決法もしくは
それに至らなくとも何か思いついたことでもあれば教えて頂けませんか?
0416デフォルトの名無しさん2010/02/08(月) 19:42:12
>>415
2桁のファイル名を決める整数が
違うプロセスで同じ整数になっちゃって・・・とか
とびとびになってしまって、とかは無いのかな?
PCとスパコンで違う並列数でやっておかしくなったのなら
同じ並列数(2とかw)でやってテストしてみては?

CPUが自分のプロセス番号(例題でよく変数名Myrankになるやつ)
を決める部分のチェックとかもやるといいかも。
とあるシステムでちゃんと動いてるので415さんのMPIの
(データ転送とかの)部分にミスがあるとは考えにくい、
という推定からすると他にはあまり思いつかないな。
0417デフォルトの名無しさん2010/02/09(火) 00:30:15
>>415
ノードローカルのディスクに書いてるとかいうオチならブチキレ
0418デフォルトの名無しさん2010/02/09(火) 02:35:40
でもたいていのシステムではジョブ終了時に一箇所にまとめるから
少なくともジョブ終了後にユーザーがファイルを移動する操作を
する必要は無いような気もするけど・・・・
その可能性は大いにあるね。
0419デフォルトの名無しさん2010/02/10(水) 18:08:04
問題のプロセスはファイル出力はせずに計算はちゃんと終了してるの?

mpi_finalizeを実行せずに終了してるのでは?
0420デフォルトの名無しさん2010/02/10(水) 20:33:47
MPI_Finalizeとファイル出力はなんも関係ない
0421デフォルトの名無しさん2010/02/11(木) 10:58:34
MPI_Finalizeとファイル出力はなんも関係ない
=> MPIとファイル出力はなんも関係ない
=> このスレとファイル出力はなんも関係ない
0422デフォルトの名無しさん2010/02/11(木) 12:03:48
アホかいな
MPI_Finalizeしなくても、ファイル出力していればファイルはできてるし、ジョブが死ぬときにファイルがクローズされるからそのときにフラッシュされるわけで
MPI_Finalizeしないことがファイルができないこととは無関係だっつってんだよ。
0423デフォルトの名無しさん2010/02/11(木) 21:49:22
LAM/MPIか何かでMPI_Finalizeを呼ばずにプログラムの実行を終了すると
次回以降のプログラムの実行がおかしくなることがあった希ガス。
確かlambootし直すと正しく実行できるようになったから、裏方のプロセスが
狂ったんだろうな。そういう状況ではファイル入出力が一部おかしくなっても
不思議ではない。
0424デフォルトの名無しさん2010/02/11(木) 23:16:52
標準入出力はともかく、ファイル入出力をリダイレクトなんかしてませんよ。
途中でプロセスを頃したらmpichでもおかしくなることがあるが、あくまで通信に失敗すると言う次元のおかしくなり方だから。
0425デフォルトの名無しさん2010/02/11(木) 23:37:48
Finalizeを指定しなかったために通信がおかしくなって、
それによってプログラムの動き(例えば通信結果によってif文の判定を行っている)が変り、
ファイルへの書き出し部分を通過しなくなったというのは?
0426デフォルトの名無しさん2010/02/12(金) 01:10:41
先に他のジョブが終わるってこと?
つーか、その程度のミスならPCでマトモに動くとは思えないけど。
0427デフォルトの名無しさん2010/02/12(金) 15:46:16
他のジョブとは関係なく、
一つのジョブで、MPI_Finalizeを指定しないで終了するプロセスがあると
通信がおかしくなることがあったと思う。
0428デフォルトの名無しさん2010/02/13(土) 20:26:46
>>29
ん?じゃぁ宛先はドコに置くん?
0429デフォルトの名無しさん2010/02/13(土) 21:14:35
>>428
メインプロセスがチャイルドプロセスを立ち上げる。
実装によるが、そのとき引数にチャイルドプロセスの情報を加える。
MPI_Initでargc, argvが要求されるのはそのため。
0430デフォルトの名無しさん2010/02/19(金) 13:33:36
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って言われました
どうすればいいの?
0431デフォルトの名無しさん2010/02/19(金) 19:29:59
>>430
MPIの前にCの勉強をしろカス




といいたいところだが親切な俺様が教えてやろう
C89, C++では動的配列は使えない。
mallocかnewで確保汁!
0432デフォルトの名無しさん2010/03/20(土) 18:01:31
三次元空間での拡散方程式の解法でお薦めのものを教えてください。
格子は150x150x150で、線形の拡散方程式です。
0433デフォルトの名無しさん2010/03/24(水) 06:27:04
自分で作るw

・・・姫野ベンチって計算そのものはラプラスかポアッソンソルバーだったような気がする。
MPI版あったような・・・気がする。気がする、ばかりでなんだが。
それを元にして、というのも。
ライセンス的にアリなのかわからないけど理研(?)の人に聞いてみよう!
0434デフォルトの名無しさん2010/03/24(水) 10:20:58
コンパイルオプションで倍精度を指定した場合ってmpiの関数が送受信する
データはどうなりますか?書き換えが必要ですか?
0435デフォルトの名無しさん2010/03/24(水) 13:18:17
>>434
Intel Fortran では要った、というか回避策を見つけ切れなかった。しょうがないので、
自分は#if つかってMPI通信部分を単精度用と倍精度用の2種類作って
そのうちの一つだけを使うように、#define 一行いじれば済むようににしたけど
・・・・忘れたwときがイヤなのであまり満足していない。
プリプロセスもクレバーに使えばコンパイル時に
とあるオプションが使われたときにだけONになるように出来るハズだけど
使い方がいまいちわからんw

この部分はコンパイラのベンダ依存性もあるからあまり突き詰めても
しょうがないきがするので・・・・便乗だけど、賢者の人カモン!
0436デフォルトの名無しさん2010/03/24(水) 21:28:25
面倒くさいのでMPI_BYTEで送ってる。
個数を配列の長さ*sizeof(TYPE)にして。
fortranでこんなことができるか知らんけど。
エンディアンがあってないと大変なことになるが気にしない。
04374352010/03/25(木) 03:25:12
賢者あらわる。なるほど。ためしにFortran で

real r
r = 1.0
if sizeof(r) .eq. 8 then
 call mpi_send(...,mpi_double,....)
else
  call mpi_send(...,mpi_float,....)
endif

をつくってみたけど、コンパイル時のオプションで振舞がちゃんと変わった。
例では r は単精度か倍精度かの判定用のダミー、のつもり。
値が空だとなんか気持ちがわるいのでてきとうな値を放りこんでみた。意味はない。
04384342010/03/26(金) 17:48:06
>>436
ありがとうございます!出来るんですね。
>>437
436さんの文章だけ見てもぱっと分かんなかったんで助かります。
試してみます。

もう一つ、mpich2って使ってる人いますか?
mpi_in_place使えるはずと思うんですが、mpi_reduceの中で使ったところ、
Invalid buffer pointerってエラーが出て使えません。
多分何かとんでもない勘違いしてそうなんですが、どこがおかしいでしょうか?
ちなみにこんな感じです↓
mpi_reduce(mpi_in_place,sumofv,n_cell,mpi_real,mpi_sum,0,mpi_comm_world,ierr)
04394362010/03/26(金) 19:38:08
俺がやってるのは

double a[N];
MPI_Send(... N, MPI_DOUBLE, ...)
の代わりに
MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...)
なんだが。
これだとdoubleの代わりが単精度だろうが倍精度だろうが複素数だろうが構造体だろうが送れる。

>>437だと新しい型を増やす度に条件分岐が増える。
0440デフォルトの名無しさん2010/03/27(土) 02:01:35
> MPI_Send(... N*sizeof(a[0]), MPI_BYTE ...)
なるほど!
0441デフォルトの名無しさん2010/03/27(土) 12:13:43
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
0442デフォルトの名無しさん2010/04/04(日) 09:08:14
ダグ番号って例題だと0だけど、複数の通信がシステム全体で走ってるときも0でいいのかな?
・・・宛先番号とか別に指定してるから、とある2つのプロセス間で2つ以上の通信が発生しなければ、
同じタグ番号でも困らないような気はするけど。
0443デフォルトの名無しさん2010/04/14(水) 10:18:20
ubuntu9.10にOpenMPIをapt-getでインストールしました 。
インテルコンパイラを使うには、apt-getではなく、自らコンパイルしないといけないのでしょうか?
何か設定で切り替える方法があれば教えてください
0444デフォルトの名無しさん2010/04/21(水) 01:33:13
http://arkouji.cocolog-nifty.com/blog/mpich2/index.html

ここの通りにやってサンプルを使った
円周率の計算まではできたんですけど
自分で書いたC, C++を動かすことができません
とりあえずプロジェクトをいじってるんですがそれでいいんでしょうか?
何か留意点などありますか?
0445デフォルトの名無しさん2010/04/21(水) 01:39:49
windows版のmpichはmingw gccでもリンクできるからgccで作った方が早い。
mpi自体の設定もLinuxの方が簡単。
0446デフォルトの名無しさん2010/04/21(水) 10:35:03
最近勉強を始めました。
並列クイックソートを実装しようとしているのですが、実行時にエラーが出てしまいます。
とりあえず2個のプロセッサでやってみてるのですが、いったいどこがいけないのでしょうか?

http://codepad.org/13tw3pKS

アドバイスお願いします。
0447デフォルトの名無しさん2010/04/22(木) 00:58:42
>>446
で、技術料はいくら払うんだ?
0448デフォルトの名無しさん2010/04/30(金) 06:33:21
$200
0449デフォルトの名無しさん2010/05/10(月) 05:36:11
OpenMPIとMPICH、どちらをインストールしたらよいのでしょうか
それぞれの利点欠点を教えてください
0450デフォルトの名無しさん2010/06/12(土) 19:14:06
MPICH2 1.0.7rc1 + g95 + cygwin の環境下で、以下のようにバックグランド実行させているのですが、

>nohup mpiexec -np 4 ./a.out >& log.txt &

標準出力(log.txt)に下記のようなメッセージが大量に書き込まれてしまいます。
これを表示させない方法はないでしょうか?

(handle_stdin_input 1067): stdin problem; if pgm is run in background, redirect from /dev/null
(handle_stdin_input 1068): e.g.: mpiexec -n 4 a.out < /dev/null &
0451デフォルトの名無しさん2010/06/12(土) 23:35:54
>>450
メッセージに書かれている通りのことをやればいいだけ
0452デフォルトの名無しさん2010/06/13(日) 04:24:41
>>451
ありがとうございました。確かに入力用にこれを指定すると出なくなりました。
しかし普通に入力ファイルをしていた場合は入力ファイルが読めずに、エラーが出たので、
このようにしたのですが、それはマルチノードの設定の問題でしょうか。
0453デフォルトの名無しさん2010/06/13(日) 10:55:37
何をやったらどんなエラーが出たのか書けよ
0454デフォルトの名無しさん2010/06/16(水) 22:05:53
PhenomII x6 1090Tを3.2GHzから4GHzにOCして、MPIでバカ並列の数値計算
プログラムを走らせて 使ってたのだが、速度が出ないので調べてみた。

殆どOn cacheで動くプログラム、キャッシュミスが無いようなプログラムなのに、
計算に使うコア数を減らすほど速くなる事に気がついた。3コアで最高速。
ふと、OCやめて定格に戻したら、まともな速度が出るようになった。

なんてこった。どうやらOCで逆に遅くなる事があるようだ。

OCする場合とOCしないときと速度比較してみる価値あるかもよ。
0455デフォルトの名無しさん2010/06/16(水) 22:47:52
MPI使った計算なんて遊びじゃないんだからOCなんて普通しねーっての
0456デフォルトの名無しさん2010/06/16(水) 23:29:08
まぁそうだな。奇特な人向けの情報です。
0457デフォルトの名無しさん2010/06/17(木) 19:01:17
遊びじゃないのにOCするのってダメなのかな
通常のOCのリスク(熱・故障等)以外に、結果が狂うとかある?
0458デフォルトの名無しさん2010/06/18(金) 00:53:44
>>457
狂った事あるよ。

デカイファイルが出力されるプログラムを実行させてたときに

./a.out | gzip > out.txt.gz

とかやってたんだが、out.txt.gz をgzip -d で解凍させたら壊れて
ますとエラーが出たので気が付いた。OCでgzipがまともに動作し
なかった模様。多分計算結果も壊れてたんだろうな。

てかgzipで圧縮してなかったら計算結果が壊れてる事に気がついて
なかった罠。
0459デフォルトの名無しさん2010/06/18(金) 01:00:23
いやしかし、そろそろMPIに厳しい時期になりましたなぁ。

そろそろ10月まで止めるかなぁ。電流計で測ると11A使っている
から1100Wの電熱器付けているようなもんだからなぁ。
0460名無しさん@そうだ選挙に行こう2010/07/10(土) 14:37:03
>>459
台数を6台から1台に減らしたんだが、最適化に尽力したら、2倍速くなった(w
(一台あたりの話)

作業配列をunsignedからunsigned charにしただけで、1.2倍。

昔のCPUは1byteアクセスはペナルティ高かったような…
PentiumPro ぐらいの話だが。最近はペナルティ無いのか?
0461名無しさん@そうだ選挙に行こう2010/07/10(土) 19:12:52
コンパイラや最適化の影響があるかも知れない。
単純にはインテルコンパイラ使ってSSE吐いているならその部分は4倍速くなってるはず。
04624602010/07/10(土) 23:39:18
>>461
単純にメモリ利用量が減ってキャッシュの効きがよくなっただけだと思います。

CPUがPhenom II 945だしインテルコンパイラーつかえねー
04634602010/07/12(月) 23:52:31
最適化を推し進めていくと、inline命令の逆のnoinline命令が欲しくなるな(gccは拡張機能であるがANSI Cとして欲しいね)

コンパイラの最適化レベルを上げるとホットスポット内にある、めったに呼ばれない関数までinline展開されてループ内のマシン語が大きくなってしまう。

また、ifでの条件分離の確率をプログラマーが指定したくなるな。。これはコンパイラーの機能ではどうにもならなかったので、制御構造を変更するしかなかった。こういうのはコンパイラ変更したら無意味になりそうでいやーん。

マシン語がどういう形で展開されているかは、素直に読むとなかなか辛いので、以下のようにasm文で適当にLABEL文を埋め込んでいけばいい。
---
asm(".HOGEHOGE_START:");
for(i=0; i < MAX; i++){ hogehoge;}
asm(".HOGEHOGEEND:");
--
そして-save-tempsでマシン語をファイル(hoge.s)に出力させればいい。マシン語のC++の関数名は奇妙奇天烈な名前に変換されるが、c++filtで復元出来る。

$ cat tmp.c
void test(int hoge){}
$ g++ tmp.c -c
$ nm tmp.o
00000000 T _Z4testi <- 謎の関数名
U __gxx_personality_v0
$ nm tmp.o | c++filt
00000000 T test(int) <- 関数名を復元
U __gxx_personality_v0
0464デフォルトの名無しさん2010/07/14(水) 03:12:44
>>458
そんなこともあるんですか
あまり欲張らないでおこう
0465デフォルトの名無しさん2010/07/14(水) 16:19:27
MPIを使わずに馬鹿並列をする簡単なフレームワークないですかね?

MPIをインストールするのめどい。

やって欲しい事は、32coreのマシンと、数千個のファイルがある。

.a.outにこのファイルを一つづつ渡して実行してほしい。処理が終
わったら続いてファイルを渡して処理をして欲しい。同時に32個
のa.outを実行しつつ、処理が終わったa.outがあったら残りの
ファイルをa.outで処理してほしい。
0466デフォルトの名無しさん2010/07/14(水) 16:24:10
↑ それぞれのa.outは処理時間が一定ではありません。
0467デフォルトの名無しさん2010/07/15(木) 00:26:56
妥当なところは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);
}
結構適当に書いたけど、こんな感じ?
0468デフォルトの名無しさん2010/07/15(木) 22:00:42
ありがとうございます。OpenMPでそんな事ができるんですね。
gccも4系はサポートしているみたいですので、試してみます。
0469デフォルトの名無しさん2010/08/07(土) 11:07:24
この辺でもみてくださいな。
一見正しく動いていても、OCで遅くなったり計算間違ったり
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/454
ttp://hibari.2ch.net/test/read.cgi/tech/1099819556/458

0470デフォルトの名無しさん2010/09/12(日) 06:01:26
465-466 で処理量が一定でないとの事だから、
>>467 さんの schedule(dynamic,1)
は必須だね。これがなくてもちゃんと動くだろうけど、かなり能率は落ちるハズだ。
頑張ってね〜。
0471デフォルトの名無しさん2010/10/03(日) 18:04:08
MPI導入の話なのですが…
MPICH2のmpdbootを失敗した際に出る(handle_mpd_output ***)のまとめサイトのようなものを探しております。
日本語か英語のサイトで見たことあるという方、教えていただければ嬉しいです。
0472デフォルトの名無しさん2010/10/12(火) 03:47:24
MPIでコンパイルしているかどうかをコンパイル中に#ifdefで判別したいのですが、
どれがdefineされているかを調べれば良いのでしょうか?
0473デフォルトの名無しさん2010/10/22(金) 10:35:24
Ubuntuでintelコンパイラを使ってMPIプログラムをコンパイルしたいのですが、
apt-getでopenmpiをインストールした後、使用するコンパイラをgccからiccに変更する
方法がわかりません。
やり方を教えてください

0474デフォルトの名無しさん2010/10/24(日) 02:32:25
http://www.google.co.jp/search?q=ubuntu+icc&ie=utf-8&oe=utf-8

なるほど分からん
0475デフォルトの名無しさん2010/10/24(日) 02:44:51
gcc -E -dM -xc /dev/null

定義済みマクロ
http://wikiwiki.jp/redstrange/?%C4%EA%B5%C1%BA%D1%A4%DF%A5%DE%A5%AF%A5%ED
__MPI
__OPENMP
0476デフォルトの名無しさん2010/11/11(木) 06:38:52
ご存知の方教えてください。
MPIの各ノードのコンパイラが違っても、コンパイラに依存したソースでなければ動作しますか?
よろしくお願いします。
0477デフォルトの名無しさん2010/11/11(木) 10:15:27
なんか答えにくい質問だなぁ・・

たとえば x86 なCPU で linux 上で、とかなら
.o ファイルかき集めて最後にリンクできて・・なら、
たぶんだけど意図したとおりに動くんじゃないかな?

コードはあげないけど中間ファイルならあげるよ、という人たちから
いろいろもらって一まとめで使う、とかなの?
0478デフォルトの名無しさん2010/11/12(金) 14:02:34
>>477
すみません質問がいい加減すぎました。

ノード1がCygwinでgcc_4.3.4を使っていて、
ノード2がUbuntuでgcc_4.4.4を使っています。
CPUはともにx86系です。

このようなときに、
MPIはコンパイラが異なることを気にせずにプログラムを動作させることができるかどうか知りたいです。
よろしくお願いします。
0479デフォルトの名無しさん2010/11/12(金) 15:38:08
mpirun mpiexec の気分次第w
まあ、動くかと。
gcc と intel は割と相性イイから
インテルも混ぜてあげよう
0480デフォルトの名無しさん2010/11/15(月) 18:12:22
MPICHを使っています。各プロセスに環境変数(具体的には$HOME)を渡したい
のですが、どうすればよいでしょうか。

Windows版の場合には、mpiexec(のみ)が提供されていて、
mpiexec -env HOME <somewhere> -np ...
とすればできますが、

Linux版では、mpirunが提供されているが、mpirunには環境変数を指定する
オプションがないので、できなくて困っています。なお、インストールには
YaSTを使い、
mpich-1.2.7p1-214.3.i586
mpich-devel-1.2.7p1-214.3.i586
を入れました。
0481デフォルトの名無しさん2011/01/13(木) 13:07:41
>>480
bashrcに書けばいいんじゃない?
0482デフォルトの名無しさん2011/01/26(水) 19:07:42
行列行列積のやり方が全くわかりません

A×B=Cで各プロセスがAとBのブロック行(ブロック行の行数は行列全体の行数/プロセス数)を保持している。
Bをプロセス間で循環させ、計算結果のCを更新していくことでA×Bを計算せよ。
行列は正方行列で1024×1024とし、プロセス数は行数の約数とする。値は乱数で決める。

誰がやり方教えて下さい。プログラムの流れとかでも良いです。お願いします。
0483デフォルトの名無しさん2011/02/09(水) 18:08:03
A B
000 333
111 444
222 555

rank0 rank1 rank2
step1
000 333 --- --- --- ---
--- --- 111 444 --- ---
--- --- --- --- 222 555

step2
000 --- --- --- --- 333
--- 444 111 --- --- ---
--- --- --- 555 222 ---

step3
000 --- --- 333 --- ---
--- --- 111 --- --- 444
--- 555 --- --- 222 ---
0484デフォルトの名無しさん2011/05/21(土) 13:51:12.10
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

とエラーが出てしまい実行出来ません。検索しても有効な解決策が見つかりませんでした。
どなたか解決策を教えていただけないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています