MPI Isend和Irecv问题

时间:2017-02-24 03:33:41

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

我的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);
}

1 个答案:

答案 0 :(得分:0)

您似乎是按顺序一个接一个地进行交流。相当大的开销。