我有一些MPI进程,它们应该在完成任务后写入同一个文件。问题是结果的长度是可变的,我不能假设每个进程都会写入某个偏移量。
一种可能的方法是在每个进程中打开文件,在结尾写入输出,然后关闭文件。但这样可能会出现竞争条件。
如何打开和写入该文件,以便结果是预期的结果?
答案 0 :(得分:1)
您可能认为您需要共享文件或有序模式例程。但是这些例程几乎没有用处,因此没有得到很好的优化(所以它们几乎没有用到......完全循环......)
我希望你打算集体这样做。然后你可以使用MPI_SCAN来收集偏移量,然后调用MPI_FILE_WRITE_AT_ALL让MPI库为你优化I / O.
(如果你是独立完成这个,那么你将不得不做一些像...主奴隶?传递一个令牌?回到共享文件指针例程,即使我讨厌它们?)
这是一种良好的集体方法:
incr = (count*datatype_size);
/* you can skip this call and assume 'offset' is zero if you don't care
about the contents of the file */
MPI_File_get_position(mpi_fh, &offset);
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT,
MPI_SUM, MPI_COMM_WORLD);
new_offset -= incr;
new_offset += offset;
ret = MPI_File_write_at_all(mpi_fh, new_offset, buf, count,
datatype, status);