c - MPI Isend 和 Ireceive 不起作用

标签 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);    
}

最佳答案

您的代码片段至少存在三个问题:

  • 您不能将 MPI_BYTEbool 一起使用。 MPI 标准允许您将 MPI_C_BOOL_Bool 一起使用,另一个选项是在 boolbyte 之间手动转换> 传输MPI_BYTE
  • 之前
  • 您没有正确使用MPI_Isend()MPI_Recv()。您应该有一个请求数组,最后调用 MPI_Waitall()
  • 您可以在第一个循环中MPI_Irecv()所有远程对等点,然后MPI_Test()检查消息是否已到达另一个循环(请注意,您将需要一个 c_req 数组),或者有一个循环,如果消息有,则紧接着 MPI_Iprobe()MPI_Recv()到达(并且需要一个c_req

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

关于c - MPI Isend 和 Ireceive 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759925/

相关文章:

c - 使用 strcmp() 插入函数

c - 如何将整个文件加载到 C 中的字符串中

c - 使用 Eclipse IDE 作为我的编程语言的文本编辑器

c - 使用 MPI_Isend 和 MPI_Irecv 而不是 MPI_Bcast 为所有处理器定时广播消息

java - Flink DataSet join inside map 函数

具有两个条件的 C 循环 - 差异

c - 组合并行化

c++ - 如何测量并行 C++ 程序中的网络延迟?

deep-learning - NVLink 是否可以使用 DistributedDataParallel 加速训练?

python - 使用 Queue() 在 python 分布式应用程序中共享文件