Versão não bloqueadora de MPI_Barrier no MPI 2

8

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)?

Geoffrey Irving
fonte
E, de fato, o MPI_Ibarrier está presente em todo o Google em referência ao grupo de trabalho do MPI 3. Agora só precisamos do futuro ...
Geoffrey Irving
Não vejo como isso funcionaria. Presumivelmente, você planeja chamar o MPI_Ibarrier em um processo quando terminar as mensagens para essa iteração e depois chamar o MPI_Wait quando? Se as tarefas continuarem após o MPI_Ibarrier, até onde elas poderão chegar antes de chamar o MPI_Wait? Se eles podem chegar tão longe antes que precisem saber que todos os procedimentos estão concluídos, por que não colocar o MPI_Barrier nesse ponto? IME, MPI_Barrier quase sempre está errado ao inserir seu código, exceto para fins de depuração. Quase sempre há uma maneira mais eficiente de estruturar o código.
Bill Barth
Nesse caso, acredito que o MPI_Ibarrier é a melhor maneira, já que nenhuma mensagem da próxima época de comunicação pode ser iniciada sem desalocar um grande pedaço de memória e realocar um novo. A barreira é necessária para saber quando essa memória pode ser desalocada, e não diretamente quando mensagens futuras podem ser enviadas.
Geoffrey Irving

Respostas:

11

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_Ibarriere 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_Ibarriercom o MPI-2, o MPICH2 fornece MPIX_Ibarrierno 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_Ibarriere outros coletivos sem bloqueio devem ser suportados. O ramo de desenvolvimento Open MPI possui uma implementação MPI_Ibarrierbaseada na libNBC.

Jed Brown
fonte
Eu acho que você pode implementar isso com uma mensagem de sinalização / tag especial que seja mais eficiente do que uma barreira de qualquer tipo possa ser. Você tem um link para o artigo de Hoefler?
Bill Barth
@ BillBarth Lembre-se de que isso não está estruturado e você não sabe quantas mensagens precisa receber. Quem enviaria a tag e para quem? Você acabará implementando seu próprio Ibarrier ponto a ponto, o que será mais lento que uma implementação nativa. O jornal provavelmente está em seu site. Nós conversamos sobre isso há alguns meses atrás.
precisa
Implementar minha própria redução de árvore ponto a ponto é exatamente o que acabei fazendo. Existem apenas 36 chamadas de barreira em todo o programa, portanto a desaceleração não deve ser problemática.
Geoffrey Irving