プロが教える店舗&オフィスのセキュリティ対策術

長文失礼します。pvmを用いた並列プログラミングのπ計算について、以下のプログラムで実行したら0になってしまいます。どこがおかしいのか分からず手詰まってます。
詳しい方教えてください。
/*マスタープログラムpai_master.c*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include "pvm3.h"
#define slave 4
#define N 10

main(argc,argv)
int argc;
char *argv[];
{
int mytid;
int M;
int nproc;
int start;
int tids[32] ;
int i, status,numt,msgtype;
double width,pai,x;

mytid= pvm_mytid();
numt=pvm_spawn("pai_slave",(char **)0, 0,"", slave,tids);
if(numt<0){
printf("error..\n");
for(i=numt;i<nproc;i++)
printf("tid %d %d\n",i,tids[i]);
for(i=0;i<numt;i++)
pvm_kill(tids[i]);
pvm_exit();
exit(1);
}
width=1.0/N;

for(i=0;i<nproc;i++){
pvm_initsend(PvmDataDefault);
pvm_pkint(&nproc,1,1);
pvm_pkint(&i,1,1);
pvm_pkint(&start,1,1);
pvm_pkdouble(&width,1,1);
status=pvm_send(tids[i],0);
}
pai=0.0;

msgtype=5;
for(i=0;i<nproc;i++){
pvm_recv(-1,msgtype);
pvm_upkdouble(&x,1,1);
pai+=x;
}
printf("pai=%f\n",pai*width);
pvm_exit();
}

/*スレーブプログラムpai_slave.c*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include "pvm3.h"

main(){
int mytid;
int M;
int i;
int nproc;
int start;
double pai,x,width;
int msgtype,master;

mytid = pvm_mytid();
msgtype=0;
pvm_recv(-1,msgtype);
pvm_upkint(&nproc,1,1);
pvm_upkint(&M,1,1);
pvm_upkint(&start,1,1);
pvm_upkdouble(&width,1,1);

pai=0.0;

for(i=M;i<start;i+=nproc){x=(i+0.5)*width; pai+=4.0/(1.0+x*x);
}

pvm_initsend(PvmDataDefault);
pvm_pkdouble(&pai,1,1);
msgtype=5;
master = pvm_parent();
pvm_send(master, msgtype);
pvm_exit();
}

A 回答 (1件)

とりあえず見た目でわかるのは


・pvm_pkint で渡す値がおかしい
・for ループが変
ってところかな.
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!