Message Passing Interface (MPI) 統合スレat TECH
Message Passing Interface (MPI) 統合スレ - 暇つぶし2ch371:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/18 09:39:35
第一添字(右端)

第一添字(左端)

376:デフォルトの名無しさん
09/10/20 06:46:25
インテルコンパイラだけど、MPI使うには、インテルの売ってるやつを使わないといけないの?

377:デフォルトの名無しさん
09/10/20 22:03:31
何でもええ。
ライブラリがリンクできれば。

378:デフォルトの名無しさん
09/10/21 02:41:08
MPI はコンパイラもだけど mpirun がないと。
自宅で文法チェックするだけなら -I -L

379:デフォルトの名無しさん
09/10/22 02:52:21
max plunk institute !

380:デフォルトの名無しさん
09/10/25 06:45:10
>>374
遅くなったけど本当にどうもありがとう。うまくできました。
ロードバランス大して考えずに領域の広さを均等にぶった切ったけどcore2quadで
3倍強の加速率でした。動的に負荷を割り振ったらもう少し早くなりそうかな?

381:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/10/26 06:36:28
core i7か・・・いいな。このお金持ちめw いくらだった?
1 thread あたりの作業量は 4つの時に比べて0.9*4/8=45%くらいの残念くんだった、って事?

職場での印象では mpirun がメモリアクセスのスケジューリングを
うまくさばいてくれていないような気はしたな。気がしただけで検証もなにもしてないけど。
やはり分散メモリのシステムとは根本的に違う、という事なのだろうな。
・・・・OpenMPだともう少しマシな数字がでてくるのかな?

383:デフォルトの名無しさん
09/10/26 06:42:32
>>381
CPU とプロセス(またはスレッド)のアフィニティはどうしてる?
プロセス数が多くなればなるほど、きっちり固定してやらないと
パフォーマンス低下の原因になる希ガス。

384:382
09/10/26 07:00:00
OpenMPはデフォだとうろうろするのは知ってたけど。
MPIも固定しないのか・・・知らんかった・・・。

385:デフォルトの名無しさん
09/10/26 09:46:19
windowsだとOSがウロウロさせるんだけど。
高負荷のシングルスレッドを実行させると全CPUが12%程度になるよ(8core)。
LinuxでもたまにCPUを乗り換えるけどwindowsほど頻繁じゃない。

386:381
09/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:デフォルトの名無しさん
09/10/27 16:27:05
Pentium4ほどパイプラインがスカスカじゃないからHTの効能はあまりないんじゃないかな。
マルチ「スレッド」のプログラムならメモリ資源などの共用が多くHTの効果がでるかもしれないけど、
マルチ「プロセス」のMPIじゃ同一コアでキャッシュとメモリ帯域の争奪戦をするだけで効率低下すると思うけど。


388:デフォルトの名無しさん
09/10/28 02:43:34
Visual C++2008でMPIを使いたいのですが、何をインストールすればよいのでしょうか?

389:デフォルトの名無しさん
09/10/28 02:57:18
HTは結局コアが4つしかないから、メモリ転送がネックになる場合だと、パフォーマンスが落ちるよ。
アフィニティで固定したとしても、論理コアが物理コアとリンクしているとは限らないだろうから、
コア間で依存性があった場合は注意が必要だと思う。
HTは簡単に言うと、あいているパイプラインを有効に使うことだから、2つの処理を同じコアで計算させていることだからね。
ただ、3次キャッシュが大きいので、コアが増えることでプリフェッチの恩恵は受けやすくなるかも。

390:デフォルトの名無しさん
09/10/28 02:59:50
>>384
そりゃそうでしょ。MPIだってコアの指定をしないとだめ。
もちろんPthreadでも。

391:デフォルトの名無しさん
09/10/28 03:24:38
いわれるとそりゃそうだわ、なんだけど
383のを見るまで気づかんかったw

OpenMPだと dplace や taskset で固定できるけど、
これはハードベンダが作った奴だしねぇ。MPIで固定するのはどうするの(特にWin機)?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch