Estou configurando IO para um código CFD de larga escala usando a biblioteca MPI e o IO do arquivo está começando a consumir tempo de computação à medida que meus problemas aumentam.
Até onde posso perceber, o que está "pronto" no contexto moderno é a utilização pesada de operações de E/S coletivas ( Desempenho de E/S paralelas no ARCHER - whitepaper de 2015).
Meu problema é que parece haver três maneiras de chamar uma gravação coletiva:
MPI_File_write_all
, bloqueandoMPI_File_iwrite_all
, não bloqueante
e um tanto especulativamente:
MPI_File_iwrite
seguido por uma chamada paraMPI_File_sync
, não bloqueante e depois bloqueante?Digo especulativamente porque a primeira chamada é explicitamente não coletiva, mas a última (que, até onde sei, é o que realmente envia os dados para o armazenamento) é coletiva.
Minha pergunta é: múltiplos MPI_File_iwrite
s seguidos por a são MPI_File_sync
equivalentes a um MPI_File_write_all
, no sentido de que a sincronização de arquivo torna a gravação não coletiva efetivamente coletiva? Edit - para maior clareza, estou ciente de que sync é uma rotina coletiva. Estou perguntando se a E/S que ocorre quando sync é chamado é análoga à E/S coletiva de um write_all.
acompanhamento: uma MPI_File_iwrite_all
chamada requer uma MPI_File_sync
chamada e, se isso ocorrer, qual é o propósito de uma gravação coletiva não bloqueante se ela se torna apenas bloqueadora no futuro?
Estou focando bastante em bloqueio vs. não bloqueio aqui porque estou tentando remover completamente toda a sincronização do meu código para melhorar a utilização da CPU (ou seja, os processos só esperam se não tiverem as informações que precisam dos seus vizinhos, em vez de esperar que todos os processos sincronizem), mas obviamente isso se torna um pouco problemático quando se trata de saída.
Do padrão MPI
4.1
(14.6
página do capítulo704
)Sua pergunta diz respeito a três conceitos ortogonais de MPI: conclusão local de operações, sincronização de processos e consistência de dados.
A principal diferença entre operação com bloqueio e operação sem bloqueio diz respeito ao estado local da operação no processo. Uma operação com bloqueio é concluída antes do retorno da chamada de bloqueio; uma operação sem bloqueio é concluída com uma chamada de conclusão bem-sucedida. Até que a operação seja concluída localmente, a biblioteca MPI "possui" os buffers que você passa para uma função.
Apenas um pequeno subconjunto de funções do MPI implica sincronização. A comunicação coletiva, em especial, não implica necessariamente sincronização.
A conclusão das funções File-IO não estabelece consistência de dados (ou visibilidade global do impacto da operação).
MPI_File_sync
Estabelece a consistência dos dados para acessos a arquivos. Isso só é necessário se os dados gravados em um arquivo forem visíveis para leituras sucessivas de um processo diferente. O Exemplo 14.6 em MPI-4.1 aponta que, na verdade, uma sequência equivalente aMPI_File_sync
++ é necessária para estabelecer a consistência dos dados entre a gravação e a leitura de um arquivo. O motivo é que isso éMPI_Barrier
coletivo , mas não sincroniza.MPI_File_sync
MPI_File_sync
Se você precisa
MPI_File_sync
ou não depende de como seu aplicativo acessa o arquivo. Se precisar deMPI_File_sync
, você precisará dele independentemente do tipo de chamada de gravação. Você precisará dele com as funções de gravação coletiva e não coletiva. Usando gravações não bloqueantes, você precisa concluir localmente (testar/aguardar) todas as operações de E/S de arquivo ativas para o identificador de arquivo antes de poder chamarMPI_File_sync
.