我有一个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_Recv
和MPI_Irecv
与MPI_Send
一起使用。然而,它没有完成,所有的处理器都在等待。所以,我使用MPI_Wait
而不是MPI_Barrier
来使它们同步,并解决了处理器的等待问题,因此他们完成了工作。但是,它无法正常工作。以下代码的某些输出是错误的。每个处理器发送正确的数据,发送方没有问题。另一方面,接收的数据缓冲区没有变化。这意味着在某些处理器中,即使接收到来自其他处理器之一的数据,接收缓冲区的初始值仍然保持不变。
MPI_Wait
答案 0 :(得分:2)
在<{1}}访问数据之前,您必须完成MPI_Wait
或成功MPI_Test
。你无法用屏障取而代之。
对于铃声通信,请考虑使用MPI_Irecv
。它可以比使用异步通信更简单。