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?