//#define SIZE 3
void master(int n,int size)
{
for(int j=1;j<size;j++){
MPI_Send(&n,1,MPI_INT,j,1,MPI_COMM_WORLD);
printf("\n Sent %d to process %d",n,j);
fflush(stdout);
}
}
void slave(int size)
{
for(int j=1;j<size;j++){
int k=0;
MPI_Status status;
MPI_Recv(&k,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
printf("\n Process %d has received %d",j,k);
fflush(stdout);
}
}
int main(int argc,char** argv)
{
MPI_Init(&argc,&argv);
int la_size;
int rank;
MPI_Comm_size(MPI_COMM_WORLD,&la_size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
for(int i=0;i<3;i++){
if(rank==0)
master(i,la_size);
else
slave(la_size);
}
MPI_Finalize();
printf("\nprogram finished...");
fflush(stdout);
return 0;
}
上面的程序似乎很简单,但它停滞不前。这是一个僵局吗? 输出是:
Sent 0 to process 1
Sent 0 to process 2
Sent 1 to process 1
Sent 1 to process 2
Process 1 has received 0
Process 2 has received 1
Process 1 has received 2
Sent 2 to process 1
Sent 2 to process 2
Process 1 has received 0
Process 2 has received 1
Process 1 has received 2
答案 0 :(得分:2)
在main
中的循环的每次迭代中,等级0正在向多个从属等级中的每一个进行单个发送,但是每个从属发送的接收数量与从属等级总数相同。由于没有匹配后续接收的发布发送,接收器无限期阻塞,程序挂起。
答案 1 :(得分:0)
感谢Novelocrat的回答,正确的代码实际上就是这样:
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
//#define SIZE 3
void master(int n,int size)
{
for(int j=1;j<size;j++){
MPI_Send(&n,1,MPI_INT,j,1,MPI_COMM_WORLD);
printf("\n Sent %d to process %d",n,j);
fflush(stdout);
}
}
void slave(int size)
{
int k=0,rank=0;
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Status status;
MPI_Recv(&k,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
printf("\n Process %d has received %d",rank,k);
fflush(stdout);
}
int main(int argc,char** argv)
{
MPI_Init(&argc,&argv);
int la_size;
int rank;
MPI_Comm_size(MPI_COMM_WORLD,&la_size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
for(int i=0;i<3;i++){
if(rank==0)
master(i,la_size);
else
slave(la_size);
}
MPI_Finalize();
printf("\nprogram finished...");
fflush(stdout);
return 0;
}