MPIによる並列プログラミングについて話し合う統合スレッドです。
とりあえず本家
http://www-unix.mcs.anl.gov/mpi/
Message Passing Interface (MPI) 統合スレ
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
NGNG263259
2008/06/26(木) 17:15:29 >>262
timeを使えば計算時間分かりますね!
アドバイスありがとうございますm(__)m
すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで
高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体
の計算なので何を計算しているのかイメージが付きにくいんじゃないか?
と、言われまして何かイメージが付きやすいプログラムというのは無い
でしょうかね・・・?
すいません、変な質問をして(汗
timeを使えば計算時間分かりますね!
アドバイスありがとうございますm(__)m
すいません。色々アドバイスを頂いたのですが何かオープンキャンパスで
高校生の方たちにクラスタを使ってもらうらしく姫野ベンチとかだと流体
の計算なので何を計算しているのかイメージが付きにくいんじゃないか?
と、言われまして何かイメージが付きやすいプログラムというのは無い
でしょうかね・・・?
すいません、変な質問をして(汗
264デフォルトの名無しさん
2008/06/26(木) 22:30:47 >>263
計算結果を可視化するところまでやるとか。
でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
計算結果を可視化するところまでやるとか。
でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
265デフォルトの名無しさん
2008/06/27(金) 01:51:51266259
2008/06/27(金) 11:53:25 >>264
>計算結果を可視化するところまでやるとか。
>でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
そうなんですよね〜
分子力学のプログラムで計算結果を可視化できるものがあったんですが
リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。
>あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
>並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば
オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね!
アドバイスありがとうございますm(__)m
>>265
>迷路。
すいません。
迷路というのは迷路を解くと言う事でしょうか?
>計算結果を可視化するところまでやるとか。
>でも見た目が楽しい計算結果でないと訴求力がないだろうねえ。
そうなんですよね〜
分子力学のプログラムで計算結果を可視化できるものがあったんですが
リンク切れとソースの名前をググっても出てこなかったので諦めました・・・。
>あるいは利用ノード数(並列度)を変えて実行時間の変化をグラフにして
>並列度の高いクラスタのありがたみ(速度向上)を訴えるとか。
なるほど。理想値と実際に計算にかかった時間をグラフに書いてもらえば
オーバーヘッドの事や何倍速く計算できたかと言う事が分かりやすいですね!
アドバイスありがとうございますm(__)m
>>265
>迷路。
すいません。
迷路というのは迷路を解くと言う事でしょうか?
267デフォルトの名無しさん
2008/08/22(金) 20:08:51 すいません MPI初心者です。
windowsでMPIを実行しようとしているんですけどエラーがでて困っています。
インクルドのパスは切っています。
error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。
error C3861: 'Init': 識別子が見つかりませんでした
というエラーがでます。
なんで何でしょう。いきなり初期設定でつまずいて恥ずかしいのですが
だれかアドバイスしていただけないでしょうか。
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では無理なのか?
C:Program Files\MPICH2\include
を追加する。
最低これでエラーはなくなるはずのに認識できない。
メッセージは同様。
error C2653: 'MPI' : 識別子がクラス名でも名前空間名でもありません。
error C3861: 'Init': 識別子が見つかりませんでした
絶対windowsで同様なエラーが出ている人がいるはず。
MPICH2はwindowsでは無理なのか?
270デフォルトの名無しさん
2008/08/23(土) 21:20:54271デフォルトの名無しさん
2008/08/23(土) 21:22:39 windowsでMPICH2は「余裕で」動いてる。
272デフォルトの名無しさん
2008/08/24(日) 14:46:18 わかりました。
ウィザードで作った雛形をつかってコピしていたからみたいです。
空のディレクトリをしてしてファイル追加してみるとできました。
ご声援ありがとうございました。何の役にもたたなかったけど(w
ウィザードで作った雛形をつかってコピしていたからみたいです。
空のディレクトリをしてしてファイル追加してみるとできました。
ご声援ありがとうございました。何の役にもたたなかったけど(w
273デフォルトの名無しさん
2008/08/24(日) 20:32:38274デフォルトの名無しさん
2008/08/25(月) 17:29:10275デフォルトの名無しさん
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に書いたが
パスが通ってないと言われる…
いい解説サイト知っていたら教えてくださいませ
MPICH2いれてBoostのMPI使おうかと思ったが
うまくいかね
using mpi ; をusr-config.jamに書いたが
パスが通ってないと言われる…
いい解説サイト知っていたら教えてくださいませ
278デフォルトの名無しさん
2008/11/01(土) 04:35:50 MPI対応のFFTで、2次元の場合はタイル状に、3次元の場合はブロック状に、
データ分割可能なもの知りませんか?
fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
データ分割可能なもの知りませんか?
fftwやFFTEのMPI版は短冊形(z方向分割)にしか対応していません。
279デフォルトの名無しさん
2008/12/01(月) 12:33:58 ちょっと質問なんですが
MPI_Sendrecvってペアじゃないと使えないですかね?
片方がMPI_Sendrecv
もう一方がMPI_SendだけとかMPI_Recvだけとか。
わかる方いたらご教授願いたいのですが。
MPI_Sendrecvってペアじゃないと使えないですかね?
片方がMPI_Sendrecv
もう一方がMPI_SendだけとかMPI_Recvだけとか。
わかる方いたらご教授願いたいのですが。
280デフォルトの名無しさん
2008/12/04(木) 16:33:04 シングルノードWinXP-Proの環境で、MPICH2に付属ので例題cpi.exeを実行してみたら動きませんでした。
エラーメッセージは特になく、タスクマネージャで確認するとCPUコア数分のcpi.exeが実行中であるのが
確認できるのでが、強制終了する以外コントロールできない状況です。MPICH1ではうまくゆくのですが。
どなたかご教示のほうよろしくお願いします。
エラーメッセージは特になく、タスクマネージャで確認すると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にてコピーしました。この先、何をやればよいでしょうか?
とりあえず以下のコードを実行しました。
$ 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デフォルトの名無しさん
2009/01/14(水) 00:08:03 machinefile または hosts でいけるんじゃないか
mpiexec -machinefile mpd.hosts -n 3 a.out
http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.0.8-userguide.pdf
mpiexec -machinefile mpd.hosts -n 3 a.out
http://www.mcs.anl.gov/research/projects/mpich2/documentation/files/mpich2-1.0.8-userguide.pdf
283281
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のランクの順に出力したい場合はどう修正すればよいでしょうか?
有り難うございます。出来ました。
別の質問なのですが、以下のコードを実行すると、結果は順不同で出力されます。
#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デフォルトの名無しさん
2009/01/15(木) 10:36:11 >>283
別々のプロセスが勝手に出力を出しているのでそうなる。
ノード0 出力が終わったらノード1に何か情報を送る
ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信
・・・
という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
別々のプロセスが勝手に出力を出しているのでそうなる。
ノード0 出力が終わったらノード1に何か情報を送る
ノード1 ノード0空の受信を待った後、画面に出力。その後ノード2に情報を送信
・・・
という感じにするか、あるいはノード0に角ノードが出力したい情報を送りつけて、出力は全部ノード0でやるか。
285デフォルトの名無しさん
2009/01/15(木) 14:13:53286281
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
どっちか一冊買ってみます。
>>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
受信
表示
でバラして書いた方が見やすいと思う。
同じコードをたくさん書きたくなければ、受信、送信のところを条件分けで囲ったものの間に共通の表示処理を入れるか。
それ、最終ノードが受信してなくね?
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回程度繰り返したところでエラーがでます。
考えれる原因などありますか?
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デフォルトの名無しさん
2009/01/30(金) 20:45:55 >>288
プログラムのどっかでreturn 0かexit(0)してんだろ
プログラムのどっかでreturn 0かexit(0)してんだろ
290デフォルトの名無しさん
2009/01/30(金) 22:40:48 質問
コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が
No such fileって言われるんだけどこれはどう解決すればいいですか?
コンパイルすると"libmpi_c.so.0"なり"libmpi_cxx.so.0"が
No such fileって言われるんだけどこれはどう解決すればいいですか?
291デフォルトの名無しさん
2009/01/30(金) 23:51:35 MPIみたいな、少なくとも大学院クラスの人間が数値解析で使うもののスレにしては
エスパーを要請する質問が多いな。
そんな表現能力じゃ論文もかけないだろ。
エスパーを要請する質問が多いな。
そんな表現能力じゃ論文もかけないだろ。
292デフォルトの名無しさん
2009/02/02(月) 21:48:56 >>289
return 0はmain関数の一番最後でしかやってません。
return 0はmain関数の一番最後でしかやってません。
293デフォルトの名無しさん
2009/02/02(月) 21:52:31294デフォルトの名無しさん
2009/02/03(火) 13:14:23296デフォルトの名無しさん
2009/02/04(水) 21:26:54297デフォルトの名無しさん
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
----------
反映されるのかな? ちょいスクリプトのタイポして、書き換えたい
のだが… 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
----------
298294
2009/02/05(木) 10:25:41 みなさん、丁寧にありがとうございます。
2chにソースはあげたくないので、メール頂けると助かります。
2chにソースはあげたくないので、メール頂けると助かります。
299デフォルトの名無しさん
2009/02/05(木) 13:19:21 >>298
いくら払うんだ?
いくら払うんだ?
300デフォルトの名無しさん
2009/02/05(木) 22:34:17 >>298
どうせ卒論だろ。研究室の先輩に聞けよ。
どうせ卒論だろ。研究室の先輩に聞けよ。
301デフォルトの名無しさん
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);
マスタが"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デフォルトの名無しさん
2009/03/11(水) 02:46:50 http://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です。
概ね、ここに書いてあるようにやりました。
(使いたいのは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です。
303302
2009/03/11(水) 02:59:26304デフォルトの名無しさん
2009/03/12(木) 02:12:20 > 使いたいのはfortran
> #include <iostream>
> int main(int argc,char **argv)
これのどこがFortran…
> #include <iostream>
> int main(int argc,char **argv)
これのどこがFortran…
305デフォルトの名無しさん
2009/03/12(木) 18:40:57 >>304
いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。
「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。
分かりにくくて申し訳ないです。
いや、すみません、上はCのサンプルコードをビルドしようとしたときのことです。
「また、fortranの…」以降が自分で書いたfortranのコードをビルドしようとしたときです。
分かりにくくて申し訳ないです。
306デフォルトの名無しさん
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 の表記だけど日本語版にも該当する項目があるはず。
プロジェクトのプロパティの
Configuration Properties → C/C++ → Precompiled Headers → Create/Use Precompiled Header
を Not Using Precompiled Headers にすればいいと思われ。
(VC++ で C のプログラムをコンパイルするときによくハマる罠です。)
これは英語版の VC++ 2008 の表記だけど日本語版にも該当する項目があるはず。
308デフォルトの名無しさん
2009/03/12(木) 21:26:09 正直、Linux入れてmpif77とかmpiccとかのラッピングされたコマンド使ったほうが楽だろ。
ライブラリが足りないとかそんな次元が自己解決できないようなら。
KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
ライブラリが足りないとかそんな次元が自己解決できないようなら。
KNOPPIXに入ってたりするからとりあえずそれで試してみれば。
309デフォルトの名無しさん
2009/03/12(木) 23:17:29310デフォルトの名無しさん
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さんはどういう環境で使ってらっしゃるんでしょうか?
もともと、リモートに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さんはどういう環境で使ってらっしゃるんでしょうか?
311302
2009/03/13(金) 07:02:25 というかマニュアルに思い切りfortranの場合fmpich2.libを追加してね、と
書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
書いてあったんですよね。まるっきり見落としてました。ほんとに申し訳ない。
312デフォルトの名無しさん
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 で実行できることに意味があると思いました。
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デフォルトの名無しさん
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
動作しません。日本語の文献が極端に少ないので英語のサイトを見ながらやっているのですが、
サンプルコードが難しいものが多く理解出来ていません。まずはシンプルに、プロセス1の変数aを単純にプロセス0
の変数aにコピーしたいだけなのですが、MPI_Send/MPI_Recvを使わずにMPI_Getを使うにはどのように書けばいいでしょうか?
下のコードのどこがおかしいのかご指摘下さい。
ttp://www.dotup.org/uploda/www.dotup.org1347.c.html
314313
2009/03/14(土) 05:12:50 他んとこに聞いてみます
315302
2009/03/14(土) 18:05:44 >>312
ありがとうございます。
あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな…
OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに
してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで
これからは多少そのへんも自分で勉強してみます。
ありがとうございます。
あー、その環境だと完全にタダで構築できるってことですよね。自宅のPCはそれでチャレンジしてみようかな…
OpenMP+MPIって性能出ます?先生に相談したら最初からMPIで書いた方がいいよ、と言われて鵜呑みに
してたんですけど。今まで基本的に学校で用意されてる環境をそのまま使うだけというぬるま湯に使ってきたんで
これからは多少そのへんも自分で勉強してみます。
316デフォルトの名無しさん
2009/03/14(土) 19:15:30 >>314
312に書いたアプリの場合は、実環境で試したところ OpenMP+MPI は素の MPI よりわずかに
遅いかほとんど同じという結果でした。
もっとも、どちらの性能がいいかは問題、ハードウェア、ソフトウェアなどに依存しますし、
最終的にはやってみないと分かりませんので、可能性があると思ったら試す価値があります。
ハイブリッド並列化に興味があるのでしたら次の記事が参考になると思います。
T2Kオープンスパコン(東大)チューニング連載講座(その5)
OpenMPによる並列化のテクニック:Hybrid並列化に向けて
http://www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
312に書いたアプリの場合は、実環境で試したところ OpenMP+MPI は素の MPI よりわずかに
遅いかほとんど同じという結果でした。
もっとも、どちらの性能がいいかは問題、ハードウェア、ソフトウェアなどに依存しますし、
最終的にはやってみないと分かりませんので、可能性があると思ったら試す価値があります。
ハイブリッド並列化に興味があるのでしたら次の記事が参考になると思います。
T2Kオープンスパコン(東大)チューニング連載講座(その5)
OpenMPによる並列化のテクニック:Hybrid並列化に向けて
http://www.cc.u-tokyo.ac.jp/publication/news/VOL11/No1/200901tuning.pdf
317デフォルトの名無しさん
2009/03/14(土) 19:17:51 レス番号をまちがえました。316は>>315宛てです。
318デフォルトの名無しさん
2009/03/21(土) 22:47:30 VS 2008 のExpress EditionはOpen MP非対応じゃなかたか。
319デフォルトの名無しさん
2009/03/22(日) 05:57:00 >>318
Windows SDK for Windows Server 2008 and .NET Framework 3.5 を一緒に入れると使えます。
参考:http://tech.ckme.co.jp/vc.shtml
Windows SDK for Windows Server 2008 and .NET Framework 3.5 を一緒に入れると使えます。
参考:http://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が発行され、
値が上手く通信できません。ご指導願います。
メイン又はサブに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デフォルトの名無しさん
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
とでもしないとダメなんでしょうか?どう考えてももっとスマートなやりかたが
ありそうなんですがどうなんでしょうか?どなたか教えていただけませんか?
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デフォルトの名無しさん
2009/04/03(金) 12:07:03 >>321 MPI_ALLGATHERV
323デフォルトの名無しさん
2009/04/05(日) 04:03:40 お答え頂き有難うございます。ただ、ほとんど基本的なサブルーチンしか使ってないので
MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の
位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に
関してはこの通信の前に教えてやる必要があるということになるでしょうか?
MPI_ALLGATHERVはよくわからないんですが、今見た感じだと受信バッファ内の
位置は指定しないといけないんですよね?とすると結局他のプロセスが持っている個数に
関してはこの通信の前に教えてやる必要があるということになるでしょうか?
324デフォルトの名無しさん
2009/04/05(日) 08:34:21 >>323 そうです。
325デフォルトの名無しさん
2009/04/05(日) 15:13:03 なるほど、大体分かりました。mpi_allgathervを使う場合、
num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。
mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので
送信の開始アドレスをずらして指定して大丈夫なんですよね?
それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って
mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか?
あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが…
キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
num_molを個別に持たせる必要がある以外はほぼ上の形で書けそうですね。
mpi_allgathervなら送信バッファと受信バッファ個別に指定できるので
送信の開始アドレスをずらして指定して大丈夫なんですよね?
それと別の質問なんですが、mpich2をマルチコアcpu一個のマシンでで使う場合って
mpiconfigでホストのところに動かすマシンを追加するほかは特に設定いらないでしょうか?
あとは -np 4 をつけて実行するだけ?なんか単純な問題でも妙に遅いんですが…
キャッシュとかはCPU側で勝手に最適化して使ってくれてるんですかね?
326デフォルトの名無しさん
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 のように実行すると
良いような気がします。
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デフォルトの名無しさん
2009/04/08(水) 01:08:39 あるある
328デフォルトの名無しさん
2009/06/03(水) 17:15:01 PVMからMPIに鞍替えしようと思って勉強を始めようと思うのだが
今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう
Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが
MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
今だとOpenMPIとMPICH2のどちらを勉強すればいいのだろう
Mac OS X LeopardにはOpenMPIがもれなくついてくるらしいのだが
MPICH2とどう特徴が異なるのかを見極めて判断したいのですが・・・
329デフォルトの名無しさん
2009/06/03(水) 23:59:12 >>328
MPIの実装に依存するようなプログラムでも作る気かい?
MPIの実装に依存するようなプログラムでも作る気かい?
330お願いします
2009/06/18(木) 20:47:03 MPIでどうしてもわかりません。
f(x)=x*xの0~1の積分なんですが、答えが通常0.3333となるはずですが
なぜ以下のプログラムだと違った答えがでるのでしょうか?
すみません、どなたか教えていただけないでしょうか?
ちなみにプログラムはよくあるMPI(倍風館)の本のものです。
実行すると0.000488のような値がでてきます。困っています。
どうやれば0.3333みたいな値を得ることができるでしょうか?
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へ */
#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);
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 */
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 */
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:04336デフォルトの名無しさん
2009/06/19(金) 00:14:35 まず各ノードのintegralを送信せずに表示してみろよ。
積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。
この程度のことくらいやってから他人に聞けば?
積分が間違ってるのか送受信でやらかしてるのか区別つくだろ。
この程度のことくらいやってから他人に聞けば?
337デフォルトの名無しさん
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
となったぞ。ハードウェアの構成は何だ?
手元で実行してみたが
$ 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)
こんな感じです。
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デフォルトの名無しさん
2009/06/19(金) 21:01:54341デフォルトの名無しさん
2009/06/19(金) 21:04:22 MPIがおかしいと思うなら、そんな積分した答えじゃなく、1とか単純な値を送信しろよ。
自分で問題切り分ける意思がゼロだな。
自分で問題切り分ける意思がゼロだな。
342デフォルトの名無しさん
2009/06/20(土) 04:41:49 本当にコピペしたコードそのままで打ち間違いが無いのなら、
まずはMPI部分を全部削って1CPUで動かしてみろよ。
まずはMPI部分を全部削って1CPUで動かしてみろよ。
343お願いします
2009/06/20(土) 12:43:17 MPI部分なしでやれば0.333でます
344デフォルトの名無しさん
2009/06/20(土) 18:44:42 Mac用のMPIはどこで手に入りますか?
345デフォルトの名無しさん
2009/06/20(土) 18:45:15 MacにはOpenMPIが入っているが
346デフォルトの名無しさん
2009/06/21(日) 07:22:30 通常のGigabitイーサネットとInfiniBandではMPIを使った際にどの程度差が出ますか?
もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
もちろんプログラムにもよるでしょうが、InfiniBandに投資するだけの価値はありますか?
347デフォルトの名無しさん
2009/06/27(土) 19:20:41 >>346
自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、
InfiniBand環境でどれくらい改善するか、予測が付くだろう。
あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、
並列化効率がでない場合も多いので、この点も注意した方がいい。
自分のGigabit環境で、MPIプログラムの通信部分と演算部分の比率を出してみれば、
InfiniBand環境でどれくらい改善するか、予測が付くだろう。
あと、B/F値への要求が高いコードでは、マルチコア環境で、メモリアクセス速度により、
並列化効率がでない場合も多いので、この点も注意した方がいい。
348デフォルトの名無しさん
2009/07/06(月) 06:59:07 MPIの本を読むとSendとReceiveって奇数ノードと偶数ノードそれぞれ順序を逆にして書かないとデッドロックが発生するようなのですが、
今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。
OSか何かに依存するのでしょうか?
今まで、すべてのノードでSendを先に書いていたのですが、とくにデッドロックしたことはありません。
OSか何かに依存するのでしょうか?
349デフォルトの名無しさん
2009/07/06(月) 21:10:54 MPI_SendとMPI_Recvは送受信が完了するまで戻ってきませんが。
MPIの仕様なのでOSには依存しません。
別に偶数ノードと奇数ノードとか関係ありません。
送信と受信が対になって実行されないといけないだけです。
ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、
別の関数で送受信が完了しているか確認をとる必要があります。
MPIの仕様なのでOSには依存しません。
別に偶数ノードと奇数ノードとか関係ありません。
送信と受信が対になって実行されないといけないだけです。
ノンブロッキング通信なら送信、受信動作が完了しなくても戻ってきますが、
別の関数で送受信が完了しているか確認をとる必要があります。
350デフォルトの名無しさん
2009/07/06(月) 21:46:09 >>348
どの本のどういう記述よ
どの本のどういう記述よ
351デフォルトの名無しさん
2009/07/07(火) 14:04:08 そういえば、標準モードでMPIが勝手にバッファリングモードを使用していたら対応する受信が起動ていなくても戻ってくるか。
そういう意味では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 個 ローカルに渡す)方法を
ご存じでしたら教えて頂けないでしょうか?
初心的な質問ですみません。
(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デフォルトの名無しさん
2009/07/07(火) 19:07:19354デフォルトの名無しさん
2009/07/07(火) 20:32:32 >> 353
神様、仏様、353様!
早速お教え頂きありがとうございました。
神様、仏様、353様!
早速お教え頂きありがとうございました。
355デフォルトの名無しさん
2009/07/24(金) 16:46:11 MPICH2とOpenMPIを使い分ける基準ってなんなのだろう
構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
構文の違いと通信のしかたの違いとでどういう特徴があるのか・・・
356355
2009/07/24(金) 16:49:25 ちなみに自分のはMac OS XなのでOpenMPIが標準で入っているそうですが
(XgridもOpenMPIを通して使うそうですね)
MPICH2のほうはどうなのか、ちと気になりましてw
(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にはあるんですが、どうしたらよいか教えて下さい
実行時 に mpirun -np 4 tttt と入力すると
error while loading shared libraries : libompi_f77.so.o cannot open云々
となって動きません。libにはあるんですが、どうしたらよいか教えて下さい
358デフォルトの名無しさん
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 だとファイル名が違うかも知れない。
実行時に .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デフォルトの名無しさん
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
ってやって使っても問題ないでしょうか?
勝手に
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デフォルトの名無しさん
2009/09/18(金) 18:29:39 好きにせぇや
362デフォルトの名無しさん
2009/09/19(土) 00:13:13 すいません、Visual studioのスレで聞いたんですが、
こっちで聞いた方が良いとのことでこっちにきました。
Visual studio2008+MPICH2+ifortranを使ってます。
ブレークポイントやステップ実行などが使いたいのですが、
デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。
http://msdn.microsoft.com/ja-jp/library/ms164731.aspx
上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、
デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、
また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています)
ちなみにデバッグなしで開始なら問題なく実行できますが…
今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、
さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、
どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって
足りない情報などあればご指摘ください。
こっちで聞いた方が良いとのことでこっちにきました。
Visual studio2008+MPICH2+ifortranを使ってます。
ブレークポイントやステップ実行などが使いたいのですが、
デバッグ開始にすると「デバッグ情報が見つからないか、または一致しません」となります。
http://msdn.microsoft.com/ja-jp/library/ms164731.aspx
上のサイトにプロジェクトのプロパティのデバッグで[起動するデバッガ] を選択しろとありますが、
デバッガー-デバッガーの種類 しかそれらしいものが見当たらず、
また、グレーの文字になっていて変更できそうにありません(ネイティブのみとなっています)
ちなみにデバッグなしで開始なら問題なく実行できますが…
今までCygwin上でwrite文を打ち込みながら原始的にやっていたので、
さっぱりVSの仕組みが分かっていなくて要領を得ないかと思うんですが、
どうすればデバッグモードで実行できるでしょうか?お手数ですが、アドバイスを頂くにあたって
足りない情報などあればご指摘ください。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 石破首相、「就職氷河期世代」で今も不安定な仕事に就いている人に農業、建設業、物流業へ就労拡大指示 ★4 [お断り★]
- 石破首相、「就職氷河期世代」で今も不安定な仕事に就いている人に農業、建設業、物流業へ就労拡大指示 ★3 [お断り★]
- 一人暮らしの学生 約4人に1人が食費月1万円以下で生活 日本冷凍食品協会が調査 [少考さん★]
- 【洋菓子】「ジャンポケ」斉藤慎二被告 群馬でバウムクーヘン販売 行列ができるほどの大盛況 [ニーニーφ★]
- 関西万博「楽しかった」という本音の感想が圧倒的に多かった、万博を訪れた学生60人の“リアルな声” [お断り★]
- 自閉症の息子、痴漢扱いで通報されショック ヘルプマークあったのに 発達障害の特性、誤認されるケースも [少考さん★]
- 万博オタクの外人、ブチギレ「大阪万博は、すべての可能性を全否定。無駄のお手本、マジイライラする。退屈でくそつまんねえ裏切られた」 [434776867]
- 【実況】博衣こよりのえちえちクロノクロス🧪★5
- 続編で前作主人公が闇堕ちして登場←これ
- ▶天音かなたちゃんの身体の部位で一番ぺろぺろしたいところは?
- GW絵スレ2025夜の部
- 【急募】アニメ大国の日本人に「アニメランド」がない理由 [705549419]