我是MPI编码的初学者,我尝试使用简单的二维数组传递消息,将过程分为两个过程元素......但代码卡在消息传递中...代码如下...我编辑为发送和接收订单
#include<stdio.h>
#include<mpi.h>
double a[15][15];
int main(int argc, char **argv)
{
int process_id,nprocess;
int i,j;
int Nxl=5,Nx=10,Ny=10;
MPI_Status status;
MPI_Datatype line;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocess);
MPI_Comm_rank(MPI_COMM_WORLD,&process_id);
//Nxl=((Nx-2)/nprocess)+2;
//printf("NXL=%d\n",Nxl);
// printf("process_id=%d\n",process_id);
if(process_id==0)
{
for(i=1;i<=5;i++)
{
for(j=1;j<=Ny;j++)
{
a[i][j]=3*2*i;
MPI_Send(&a[Nxl-1][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
}
}
for(i=1;i<=5;i++)
{
for(j=1;j<=Ny;j++)
{
printf("matrices=%f\n",a[i][j]);
MPI_Recv(&a[1][j],1,MPI_DOUBLE,1,1,MPI_COMM_WORLD,&status);
printf("PROCESS_ID=%d\n",process_id);
}
}
}
if(process_id==1)
{
for(i=6;i<=10;i++)
{
for(j=1;j<Ny;j++)
{
a[i][j]=4*2;
MPI_Send(&a[2][j],1,MPI_DOUBLE,1,2,MPI_COMM_WORLD);
}
}
for(i=6;i<=10;i++)
{
for(j=1;j<Ny;j++)
{
MPI_Recv(&a[Nxl][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&status);
printf("PROCESS_ID=%d\n",process_id);
}
}
}
MPI_Finalize();
}
答案 0 :(得分:2)
你正在让对话中的两个参与者说话,然后听。你需要做到这一点,所以一个人说话,另一个人听,然后反过来。
答案 1 :(得分:1)
(我打算写下这个答案,就好像你有两个以上的过程对后代更为一般,但你可以把它重新解释为仅仅两个。)
Hristo和John是对的。问题是所有进程都在收到任何人之前发送消息。这意味着发送可能永远不会返回。不知何故,你需要确保接收也可用。您可以通过以下两种方式之一完成此操作:
将阻止调用转换为非阻止
如果您将阻止(MPI_SEND
/ MPI_RECV
)调用转换为非阻塞调用,并在代码末尾添加MPI_WAITALL
,那么所有进程都可以同时发送和接收消息。然后在waitall之后,你可以对你收到的数据做任何你想做的事情。
将MPI_SEND
/ MPI_RECV
转换为MPI_SENDRECV
此选项与您同时执行发送和接收的结果基本相同,但您仍需要小心确保每个人都使用相同的进程进入交换。例如,如果你让每个人都试图在一个环中进行通信,你需要确保它们都发送到右边并从左边接收(反之亦然)而不是同时发送和接收到对(这仍然是一个僵局)。