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.