Eu tenho um monte de processos MPI trocando mensagens de solicitação para frente e para trás. Os processos não sabem quais outros processos enviarão a eles mensagens ou quantos. Diante dessa situação, quero uma maneira eficiente de saber se todos os outros processos se consideram concluídos no envio de mensagens.
Isso seria realizado perfeitamente pela seguinte versão não-bloqueadora do MPI_Barrier, que chamaremos de MPI_Ibarrier:
int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request);
MPI_Ibarrier
retornaria imediatamente e as operações padrão no objeto de solicitação nos informariam quando a barreira fosse alcançada por todos.
Existe uma maneira de simular esse comportamento com eficiência no MPI 2 (ou seja, sem coletivos oficiais não bloqueadores)?
Respostas:
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 comMPI_Issend
(sim, um uso raro de envio síncrono) e inserindo um ciclo de alternânciaMPI_Testall
(para ver se os envios foram concluídos) eMPI_Iprobe
(para processar mensagens recebidas). Quando os envios são concluídos, você publicaMPI_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.pdfObserve 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 forneceMPIX_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çãoMPI_Ibarrier
baseada na libNBC.fonte
Consulte http://www.unixer.de/research/nbcoll/ , especialmente http://www.unixer.de/research/nbcoll/libnbc/ , que é a implementação de referência que fica no topo do MPI-1. Como Jed disse, o MPICH2 1.5 já possui NBC e a implementação é semelhante à do Torsten (embora quase certamente mais rápida devido à menor sobrecarga).
fonte