[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2ch.scのread.cgiへ]
Update time : 11/18 00:25 / Filesize : 179 KB / Number-of Response : 552
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Message Passing Interface (MPI) 統合スレ



1 名前:デフォルトの名無しさん [04/11/07 18:25:56.net]
MPIによる並列プログラミングについて話し合う統合スレッドです。

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



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 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<179KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef