MPI_发送和MPI_接收不匹配C

MPI_发送和MPI_接收不匹配C,c,mpi,C,Mpi,我试图在这里实现一个工作池。我应该将总共100个不同的数字发送到从属进程。然后,每个从进程将某些内容返回给主进程,主进程将另一个不同的编号发送给从进程。这将一直持续到所有100次迭代结束 我的程序陷入了一个无限循环,我想这是由于MPI_Send和MPI_Recv的映射不正确造成的。我不知道我做错了什么。我花了好几个小时研究这个问题,但没有结果。我是新的MPI和编程一般。代码如下: if(rank == 0) { int i,iteration = 0, a=0,inside=0,

我试图在这里实现一个工作池。我应该将总共100个不同的数字发送到从属进程。然后,每个从进程将某些内容返回给主进程,主进程将另一个不同的编号发送给从进程。这将一直持续到所有100次迭代结束

我的程序陷入了一个无限循环,我想这是由于MPI_Send和MPI_Recv的映射不正确造成的。我不知道我做错了什么。我花了好几个小时研究这个问题,但没有结果。我是新的MPI和编程一般。代码如下:

if(rank == 0) {
        int i,iteration = 0, a=0,inside=0,temp=0;
        for(i = 1; i < slaves; i++) {
        MPI_Send(&iteration,1,MPI_INT,i,0,MPI_COMM_WORLD);
        MPI_Send(&a,1,MPI_INT,i,1,MPI_COMM_WORLD);
        iteration++;
    }
    while(iteration < 100+slaves){
        MPI_Recv(&temp,1,MPI_INT,MPI_ANY_SOURCE,0, MPI_COMM_WORLD, &status);
        if(iteration < 100) {
            MPI_Send(&iteration,1,MPI_INT,status.MPI_SOURCE,0,MPI_COMM_WORLD);
            MPI_Send(&a,1,MPI_INT,status.MPI_SOURCE,1,MPI_COMM_WORLD);
        }
        iteration++;
        inside = inside + temp;
    }
}
else {
    int iteration=0,count=0;
    if(iteration < 100) {
        MPI_Recv(&iteration,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
        MPI_Recv(&count,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
        MPI_Send(&count,1,MPI_INT,0,0,MPI_COMM_WORLD);
    }
}
if(秩==0){
int i,迭代=0,a=0,内部=0,温度=0;
对于(i=1;i
您还需要在从属队列中循环。现在,您将
iteration
a
从主机发送到从机,将
count
从从机发送回主机,然后主机尝试从
while
循环中发送
iteration
a
,奴隶们高兴地离开了
else
区块,继续他们的快乐之路。要么去掉主进程中的
while
循环,这样它就不会发送从属进程永远不会接收的内容,要么在从属进程中添加一个循环,这样它们就可以正确地接收数据。

MPI中最重要的一点是要理解,通常每个进程都执行相同的程序。这将使您的一位好友获得
mpi\u排名,因为您需要它来区分每个流程必须完成的不同任务

要理解的另一个重要点是MPI中的阻塞/非阻塞通信是如何工作的。这里我们使用阻塞通信(
MPI\u Send()
MPI\u Recv()
)。这意味着进程将在函数调用时停止,如
MPI\u Recv()
,并等待通信伙伴到达它的“对应方”(即
MPI\u Send()
,以向我发送内容)

程序被卡住的事实很好地表明,没有相同数量的
MPI\u Send()
MPI\u Recv()
调用:某个进程仍在等待接收消息/能够发送消息

以你为例,我会尝试这样做:

while( iterations < 100 ){
  // in general every process has to do something for 100 times,
  // but we have to have to distinguish between master and slaves.

  if( mpi_rank == 0 ){
    // The master process...
    for( int slave_rank = 1; slave_rank < mpi_size; slave_rank++ ){
      // ... has to send, receive and send once again something to/from every(!) slave, ...
      MPI_Send( [one int to slave_rank] );
      MPI_Recv( [one int from slave_rank] );
      MPI_Send( [another int to slave_rank] );
    }
  }
  else{
    //... while the slaves just have to receive, send and receive again from/to one process (the master)
    MPI_Recv( [one int from master] );
    MPI_Send( [one int to master] );
    MPI_Recv( [another int from master] );
  }
  iterations++;
}
while(迭代次数<100次){
//一般来说,每个过程都要做100次,
//但我们必须区分主人和奴隶。
如果(mpi_秩==0){
//主进程。。。
用于(int slave_rank=1;slave_rank
您的任务听起来像是:Master将int发送给slave#1、#2、#3……,然后他接收来自#1、#2、#3……,然后他将另一int发送给#1、#2、#3。你可能会意识到你必须在所有的奴隶等级上循环三次


此解决方案不同(虽然结果相同),但更短:主节点将int发送到从属节点1,然后从从属节点1接收int,然后将另一int发送到从属节点1。然后,对从机#2、#3、#4……重复同样的操作。。。。这样,我们只需在所有从属列上循环一次。

为什么for循环从1开始,而不是从0开始:
for(i=1;i
?@AntoJurković,因为主列(rank=0)只应该向从属列发送数据(rank>0)。