これは私のコードで素数を数えたものです。しかし、MPI_RecvとMPI_Isendではなく、 'MPI_Scatter'と 'MPI_Gather'を使ってコードを変更したときにエラーが発生しました。私はそれのために何を変えるべきですか?Parellelプログラミング: 'MPI_Isend'と 'MPI_Recv'の代わりに 'MPI_Gather'または 'MPI_Scatter'を適用するには
これは私の元のコードです:
MPI_Request req;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &p);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if(my_rank == 0){
printf("Input(50-1000) : ");
fflush(stdout);
scanf("%d",&w);
for(i=0; i<w; i++) data[i] = i+1;
}
MPI_Bcast(&w, 1, MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast(data, w, MPI_INT,0,MPI_COMM_WORLD);
if(my_rank != 0){
x = w/(p-1);
low = (my_rank-1)*x;
high = low+x-1;
for(num = data[low]; num <= data[high];num++){
result = 0;
t=1;
while(num>=t){
if(num%t==0)
result = result +1;
t += 1;
}
if(result==2) i += 1;
}
MPI_Isend(&i,1,MPI_INT,0,0,MPI_COMM_WORLD,&req);
}
if(my_rank == 0){
int j = 0;
for(j = 1; j < p; j++){
MPI_Recv(&i,1,MPI_DOUBLE,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&status);
printf("Process %d : There are %d prime numbers\n",status.MPI_SOURCE,i);
}
}
MPI_Finalize();
}
されて出力される。ここで
Input(50-1000) : 50
Process 1 : There are 5 prime numbers
Process 2 : There are 4 prime numbers
Process 3 : There are 2 prime numbers
Process 4 : There are 4 prime numbers
は、私は自分のコードを変更する部分である:
if(my_rank != 0){
x = w/(p-1);
low = (my_rank-1)*x;
high = low+x-1;
for(num = data_send[low]; num <= data[high];num++){
result = 0;
t=1;
while(num>=t){
if(num%t==0)
result = result +1;
t += 1;
}
if(result==2) i += 1;
}
MPI_Scatter(data_send,1,MPI_INT,data_recv,1,MPI_INT,0,MPI_COMM_WORLD);
}
の
p
MPIタスクを使用するためには、このアルゴを手配することができます注意してくださいget – cowbert「Input(50-1000):」入力の質問のみが表示されますが、結果は提供されずにプログラムが実行されているようです。 – Lumby
あなたは 'MPI_INT'を送信しますが、' MPI_DOUBLE'を受け取ります。 'MPI_Isend()'によって返されたリクエストを決して 'MPI_Wait()'しないでください。 –