【问题标题】:MPI Isend and Irecv problemsMPI Isend 和 Irecv 问题
【发布时间】:2017-07-14 19:00:00
【问题描述】:

我的 MPI_Isend 和 MPI_Irecv 代码块有问题。我需要将一个数字 Cin 发送到下一个流程,然后当前流程可以继续它的业务。

接收进程需要先接收,然后才能进一步计算,但是当我没有 MPI_Wait 时,它永远不会获取数据,而当我这样做时,它只会永远挂起。我究竟做错了什么?

注意:我只将 Cin 设置为 3,以便查看消息何时不通过。目前它只是挂起。

void ComputeS5C()
{
    MPI_Request send_request, recv_request;
    MPI_Status status;
    int Cin[1] = {3};
    if(my_rank == 0){Cin[0] = 0;}
    else {
        MPI_Irecv(Cin, 1, MPI_INT, my_rank - 1, 0, MPI_COMM_WORLD, &recv_request);
        MPI_Wait(&recv_request, &status);
        fprintf(stderr, "RANK:%d   Message Received from rank%d: Cin=%d\n", my_rank, my_rank-1, Cin[0]);
    }

    int k;
    for(k = 0; k < Size_5; k++)
    {
        int s5clast;
        if(k==0)
        {
            s5clast = Cin[0];
        }
        else
        {
            s5clast = s5c[k-1];
        }

        s5c[k] = s5g[k] | (s5p[k]&s5clast);
    }

    //if not highest rank, pass the carryin upstream
    if(my_rank < world_size - 1){
        MPI_Isend(&s5c[k], 1, MPI_INT, my_rank+1, 1, MPI_COMM_WORLD, &send_request);
        fprintf(stderr, "RANK:%d   Message sent to rank%d: Cin=%d\n", my_rank, my_rank+1, s5c[k]);
    }
    MPI_Wait(&send_request, &status);
}

【问题讨论】:

    标签: c++ c parallel-processing mpi mpich


    【解决方案1】:

    您的代码中的错误与tags 的不匹配有关。使用tag = 1 发送消息并使用tag = 0 接收消息。发送和接收不匹配解释了为什么所有进程都在等待发送的消息被消耗。更改标签以使其匹配。

    注意,使用MPI_Irecv 时,您始终需要MPI_Wait 以确保知道何时可以安全地使用接收到的数据。我认为在您的示例中使用MPI_Recv 更合适。

    【讨论】:

    • 好收获!在这里,我认为标签并不重要。
    • 标签非常重要,我的朋友……尤其是当你在 stackoverflow 中需要 15 个点时:)
    • 我想插话并补充一点,如果没有每个请求(发送或接收)的 MPI_Wait,您的代码可能仍会运行,但消息完成时间会延长到几十秒的顺序,只可能引发错误。调试时请记住这一点!
    【解决方案2】:

    您似乎是按顺序交流一个等级。相当大的开销。

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 2017-04-24
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2014-03-20
      • 2018-09-20
      • 2013-08-20
      • 2013-02-08
      相关资源
      最近更新 更多