【问题标题】:MPI Isend and Ireceive doesn't workMPI Isend 和 Ireceive 不起作用
【发布时间】:2018-09-20 10:40:25
【问题描述】:

我在使用 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);    
}

【问题讨论】:

    标签: c mpi distributed-computing send barrier


    【解决方案1】:

    您的 sn-p 至少存在三个问题:

    • 您不能将MPI_BYTEbool 一起使用。 MPI 标准允许您将MPI_C_BOOL_Bool 一起使用,另一种选择是在传输MPI_BYTE 之前在boolbyte 之间手动转换
    • 您没有正确使用MPI_Isend()MPI_Recv()。你应该有一个请求数组,最后调用MPI_Waitall()
    • 您可以在第一个循环中MPI_Irecv() 所有远程对等方,然后MPI_Test() 以查看消息是否已在另一个循环中到达(注意您将需要一个c_req 数组),或者MPI_Iprobe()MPI_Recv() 在消息到达后立即执行的单个循环(这需要单个 c_req

    附带说明,除非您在 while 循环中进行任何处理,否则您可能需要考虑集体操作,例如 MPI_Alltoall()

    【讨论】:

    • 谢谢,这帮助了我并解决了问题!
    猜你喜欢
    • 2013-10-05
    • 2012-11-05
    • 2017-07-14
    • 2017-04-24
    • 2016-12-27
    • 2012-03-31
    • 1970-01-01
    • 2013-08-20
    • 2014-04-06
    相关资源
    最近更新 更多