Qual é a política de várias transferências assíncronas sobrepostas no MPI?
Eu tenho um programa com várias irecv
operações assíncronas abertas . Acho que as transferências que podem ocorrer (o correspondente isend
foi chamado) aguardam outras transferências que ainda não estão prontas (o correspondente isend
ainda não foi chamado). Para ficar claro, essa ineficiência não decorre da contenção de rede; minha rede está desnecessariamente ociosa.
Meu programa é semelhante ao seguinte:
Máquina 1
call irecv(variable A from machine 2)
call irecv(variable B from machine 2)
call irecv(variable C from machine 2)
call wait(variable C from machine 2)
call do_important_work_with(variable C)
....
Máquina 2
call isend(variable C to machine 1)
call isend(variable B to machine 1)
call do a bunch of costly work
call isend(variable A to machine 1)
....
Problema
A transferência de C
parece estar desnecessariamente bloqueada pela transferência de A
.
Acho que o wait
ligado variable C
na Máquina 1 não é concluído até que o dispendioso trabalho na Máquina 2 seja concluído. Isso é lamentável, porque essa transferência poderia ter começado no início do meu programa. Parece esperar desnecessariamente a transferência de A
concluir.
Questões
Em particular, tenho um cálculo como o seguinte.
- Isso é esperado?
- Qual é a política de várias transferências assíncronas sobrepostas?
- Isso pode ser evitado sem reorganizar meu código (há alguma configuração interna relevante)?
- Onde devo saber mais sobre a política da MPI para várias transferências ao vivo?
fonte
Respostas:
Não há garantia no padrão de que seja feito qualquer progresso nos envios sem bloqueio até que você realmente ligue
MPI_WAIT
. É uma implementação perfeitamente válida para enfileirar as operações e quando você chamaMPI_WAIT
, todas asMPI_ISEND
operações são concluídas de uma só vez. Na realidade, eles geralmente tendem a ter a chance de progredir sempre que você entra na biblioteca MPI e, se você habilitar threads de progresso assíncronos, eles terão uma chance maior de progredir em segundo plano.Quanto ao problema de assinatura, o MPI garante que as mensagens no mesmo comunicador para as mesmas fileiras serão recebidas na mesma ordem em que foram enviadas.
No padrão MPI versão 3.0:
Isso não diz nada sobre como a implementação escolhe enviar as mensagens, mas pelo menos elas serão recebidas na ordem correta.
Meu conselho seria primeiro verificar se os threads de progresso estão ativados e, em seguida, verifique se você está ligando para wait, onde realmente precisa das mensagens enviadas (embora, com os threads de progresso, você provavelmente esteja bem).
fonte