Qual é a política de várias transferências assíncronas sobrepostas no MPI?
Eu tenho um programa com várias irecvoperações assíncronas abertas . Acho que as transferências que podem ocorrer (o correspondente isendfoi chamado) aguardam outras transferências que ainda não estão prontas (o correspondente isendainda 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 Cparece estar desnecessariamente bloqueada pela transferência de A.
Acho que o waitligado variable Cna 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 Aconcluir.
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?