Могу ли я использовать MPI_Barrier () для синхронизации данных между этапами итерации - PullRequest
1 голос
/ 01 апреля 2012

Хорошо ли использовать 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 голосов
/ 01 апреля 2012

Ваш код будет заблокирован, с барьером или без него. Вы получаете в каждом ранге перед отправкой каких-либо данных, поэтому ни один из рангов никогда не попадет на звонок. Большинство приложений будут иметь вызов, такой как MPI_Allreduce вместо барьера после каждой итерации, поэтому все ранги могут решить, достаточно ли мал уровень ошибок, очередь задач пуста и т. Д., И, таким образом, решить, следует ли прекратить работу.

0 голосов
/ 04 февраля 2014

В этой статье http://static.msi.umn.edu/rreports/2008/87.pdf говорится, что вам нужно позвонить MPI_Free_request() до MPI_Bsend_init().

0 голосов
/ 01 апреля 2012

Барьеры следует использовать только в том случае, если от этого зависит правильность программы. По вашему псевдокоду я не могу сказать, так ли это, но один барьер на полпути через петлю выглядит очень подозрительно.

...