我可以使用MPI_Barrier()在迭代步骤之间同步数据

时间:2012-03-31 23:01:40

标签: parallel-processing mpi

使用MPI_Barrier()在迭代步骤之间同步数据是否是个好主意。请参阅下面的伪代码。

While(numberIterations< MaxIterations)
{
   MPI_Iprobe() -- check for incoming data
    while(flagprobe !=0)
    {
        MPI_Recv() -- receive data
        MPI_Iprobe() -- loop if more data
    }

   updateData() -- update myData

   for(i=0;i<N;i++) MPI_Bsend_init(request[i]) -- setup request

   for(i=0;i<N;i++) MPI_Start(request[i]) -- send data to all other N processors

   if(numberIterations = MaxIterations/2) 
      MPI_Barrier() -- wait for all processors -- CAN I DO THIS

   numberIterations ++

}

3 个答案:

答案 0 :(得分:0)

只有在程序的正确性取决于它的情况下才应使用障碍。从您的伪代码中,我无法判断是否是这种情况,但是循环中途的一个障碍看起来非常可疑。

答案 1 :(得分:0)

无论是否有障碍,您的代码都会陷入僵局。您在发送任何数据之前会在每个级别中收到,因此所有级别都不会进入发送呼叫。大多数应用程序在每次迭代后都会调用MPI_Allreduce而不是屏障,因此所有排名都可以决定错误级别是否足够小,任务队列是否为空等等,从而决定是否终止。

答案 2 :(得分:0)

在本文http://static.msi.umn.edu/rreports/2008/87.pdf中,它表示您必须在MPI_Free_request()之前致电MPI_Bsend_init()