MPI_Irecv无法正确接收MPI_Send发送的数据

时间:2017-02-08 18:55:52

标签: c mpi

我有一个1D矩阵数据Q_send_matrix。在每次迭代中,每个处理器更新其Q_send_matrix并将其发送到先前的处理器(rank-1),而它从下一个处理器({{1})接收新更新的矩阵Q_recv_matrix。 })。例如,在迭代中,rank+1更新其Proc[0]并将其发送到Q_send_matrix,而它从Proc[3]接收Q_recv_matrix。正如您可能估计的那样,它就像一个环形通信。请参阅下面的代码 下面代码的解释。

Proc[1]

我想以同步方式进行此通信。但是,由于基于其阻止功能的死锁, MPI_Request request; MPI_Status status; // All the elements of Q_send and Q_recv buffers // are set to 1.0 initially. Each processor // updates its Q_send buffer to prepare it // to be sent below.(above part is big, so it // is not added here...) /** * Transfer Q matrix blocks among processors * + Each processor sends the Q matrix * + to the previous processor while receives * + the Q matrix from the next processor * + It is like a ring communication * */ /* Receive Q matrix with MPI_Irecv */ source = (my_rank+1)%comm_size; recv_count = no_col_per_proc[source]*input_k; MPI_Irecv(Q_recv_matrix, recv_count, MPI_FP_TYPE, source, 0, MPI_COMM_WORLD, &request); /* Send Q matrix */ dest = (my_rank-1+comm_size)%comm_size; send_count = no_col_per_proc[my_rank]*input_k; MPI_Send(Q_send_matrix, send_count, MPI_FP_TYPE, dest, 0, MPI_COMM_WORLD); /* Wait status */ // MPI_Wait(request, status); /* Barrier */ MPI_Barrier(MPI_COMM_WORLD); /* Print Q send and receive matrices */ for( j = 0; j < send_count; j ++ ) { printf("P[%d] sends Q_send[%d] to P[%d] = %.2f\n", my_rank, j, dest, Q_send_matrix[j]); } for( j = 0; j < recv_count; j ++ ) { printf("P[%d] receives Q_recv[%d] from P[%d] = %.2f\n", my_rank, j, source, Q_recv_matrix[j]); } MPI_Send无法实现。因此,我将MPI_RecvMPI_IrecvMPI_Send一起使用。然而,它没有完成,所有的处理器都在等待。所以,我使用MPI_Wait而不是MPI_Barrier来使它们同步,并解决了处理器的等待问题,因此他们完成了工作。但是,它无法正常工作。以下代码的某些输出是错误的。每个处理器发送正确的数据,发送方没有问题。另一方面,接收的数据缓冲区没有变化。这意味着在某些处理器中,即使接收到来自其他处理器之一的数据,接收缓冲区的初始值仍然保持不变。

MPI_Wait

1 个答案:

答案 0 :(得分:2)

在<{1}}访问数据之前,您必须完成MPI_Wait或成功MPI_Test。你无法用屏障取而代之。

对于铃声通信,请考虑使用MPI_Irecv。它可以比使用异步通信更简单。