Подскажите, пожалуйста, как организовать последовательную запись в файл для N процессов?
Следующий кусок кода на 64 узлах Blue Gene/P работает нормально, а на 128 узлах происходит что-то не то. Может быть это как-то связано с работой с увеличением количества i/o потоков?
if(rank==0)
{
remove(name);
}
for(i=0;i<size;i++)
{
if(rank==i)
{
output=fopen(name,"ab");
// fseek(output,sizeof(double)*rank*total,SEEK_SET);
fwrite((void *)ion5D1,sizeof(double),total,output);
fflush(output);
fclose(output);
}
MPI_Barrier(MPI_COMM_WORLD);
}
* io.c
*
* Example of MPI-IO usage
* /bgsys/drivers/ppcfloor/comm/bin/mpicc io.c -Wall -Wextra -ansi
*
* Alexander Pozdneev
* http://hpc.cmc.msu.ru
*/
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char **argv)
{
const MPI_Comm comm = MPI_COMM_WORLD;
int rank;
char fname[] = "mpi-io.bin";
MPI_File fout;
int *buf;
int buf_size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(comm, &rank);
/* Each process writes its rank to file */
buf = &rank;
buf_size = 1;
MPI_File_open(comm, fname, MPI_MODE_CREATE | MPI_MODE_WRONLY,
MPI_INFO_NULL, &fout);
MPI_File_set_view(fout, rank * buf_size * sizeof(buf[0]),
MPI_INT, MPI_INT, "native", MPI_INFO_NULL);
MPI_File_write_all(fout, buf, buf_size, MPI_INT, MPI_STATUS_IGNORE);
MPI_File_close(&fout);
MPI_Finalize();
return 0;
}
На самом деле вместо
MPI_File_write_all(...);
MPI_File_write_ordered(...)
, которая имеет те же параметры, что иMPI_File_write_all
. Эта функция гарантирует, что записи в файле будут сделаны последовательно в соответствии с нумерацией процессов.Альтернативным вариантом может служить также такой набор команд
offset=...;
MPI_File_write_at(.,offset,..);
Да, согласен, в данном случае
MPI_File_write_ordered()
будет оптимальным выбором.Честно говоря, не знал про эту функцию, потому что я пишу последовательно, а читаю параллельно, используя
MPI_File_write_all()
и нетривиальный вид на файл.Документация по MPI-функциям с примерами: http://mpi.deino.net/mpi_functions/index.htm