Notavelmente, MPI_Ibarrier
é uma rotina muito útil. Por exemplo, você pode entregar uma rodada não estruturada de mensagens para grupos que não sabem quantas mensagens receber enviando com MPI_Issend
(sim, um uso raro de envio síncrono) e inserindo um ciclo de alternância MPI_Testall
(para ver se os envios foram concluídos) e MPI_Iprobe
(para processar mensagens recebidas). Quando os envios são concluídos, você publica MPI_Ibarrier
e alterna o teste da barreira e procura as mensagens recebidas. Torsten Hoefler tem um artigo sobre isso, onde ele prova a otimização da comunicação, consulte o Algoritmo 2: http://unixer.de/publications/img/hoefler-dsde-protocols.pdf
Observe que uma barreira não garante que as mensagens ponto a ponto ou outros coletivos não bloqueados sejam postados antes da conclusão da barreira. Se você deseja que eles sejam concluídos, verifique se eles foram concluídos antes de lançar a barreira. Como Bill diz, (o bloqueio) MPI_Barrier
é incorreto / desnecessário na maioria dos casos. Uma exceção está se comunicando através de canais laterais, como o sistema de arquivos.
Embora não exista uma maneira de desempenho semelhante para simular MPI_Ibarrier
com o MPI-2, o MPICH2 fornece MPIX_Ibarrier
no ramo 1.5 (atual). As redes de fornecedores geralmente oferecem suporte a essas operações, portanto as implementações de fornecedores (geralmente derivadas do MPICH2) precisam apenas de uma interface. Assim que seus patches passarem para 1,5, MPI_Ibarrier
e outros coletivos sem bloqueio devem ser suportados. O ramo de desenvolvimento Open MPI possui uma implementação MPI_Ibarrier
baseada na libNBC.