MPI Isend和Ireceive不起作用

时间:2018-04-10 17:42:17

标签: c mpi distributed-computing send barrier

使用Isend和Ireceive时遇到问题。我正在尝试向所有其他处理器发送消息,然后从其他处理器接收相同类型的消息,这些消息使用相同的Isend方法。

void msgs(int my_rank, int num_procs){
    int arrive_count = 1;
    int leave_count = 0;
    int i;
    bool b_req = true;
    MPI_Request req, req2;
    //Send to all other procs
    for(i=0; i<num_procs; i++){
        if(i != my_rank){
            MPI_Isend(&b_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req);
        }
    }
    bool c_req;
    //Receive msgs from all other procs
    while(arrive_count != num_procs){              
        for(i=0; i<num_procs; i++){
            if(i != my_rank){     
                MPI_Irecv(&c_req,sizeof(bool),MPI_BYTE,i,1,MPI_COMM_WORLD, &req2);              
                if(c_req){
                    c_req = false;
                    arrive_count ++;                
                }
                MPI_Request_free(&req2);
            }
        }
    }
    printf("Done from rank: %d \n", my_rank);    
}

1 个答案:

答案 0 :(得分:1)

您的代码段至少有三个问题:

  • 您无法将MPI_BYTEbool一起使用。 MPI标准允许您将MPI_C_BOOL_Bool一起使用,另一种选择是在转移bool之前在byteMPI_BYTE之间手动转换
  • 您未正确使用MPI_Isend()MPI_Recv()。您应该有一系列请求,最后请致电MPI_Waitall()
  • 你可以MPI_Irecv()第一个循环中的所有远程对等体,然后MPI_Test()来查看消息是否已经到达另一个循环(注意你需要一个{{1的数组]如果邮件已到达(并且需要单个c_req,则会有MPI_Iprobe()MPI_Recv()的单个循环。

作为旁注,除非您在c_req循环中进行任何处理,否则您可能需要考虑while等集体操作。