是否有一种标准方法来同步 MPI 共享文件指针,以便MPI_File_get_position_shared
在所有进程上返回相同的值?
例如以下程序:
#include <mpi.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(NULL, NULL);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_File fh;
MPI_File_open(MPI_COMM_WORLD, "foo", MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh);
char* buf;
buf = "hello";
MPI_Status status;
sleep(rank);
MPI_File_write_shared(fh, buf, strlen(buf), MPI_CHAR, &status);
MPI_File_sync(fh);
MPI_Offset offset;
MPI_File_get_position_shared(fh, &offset);
printf("rank: %i, offset: %in", rank, (int) offset);
MPI_File_close(&fh);
MPI_Finalize();
}
将打印
rank: 0, offset: 5
rank: 1, offset: 10
rank: 2, offset: 15
rank: 3, offset: 20
如果我用MPI_Barrier(MPI_COMM_WORLD)
替换MPI_File_sync(fh)
,它确实有效:这保证可以正常工作吗?
您可以使用以下函数来同步共享文件指针。
MPI_File_seek_shared( fh, OFFSET, MPI_SEEK_SET );
语法:
int MPI_File_seek_shared(
MPI_File mpi_fh,
MPI_Offset offset,
int whence
);
MPI_FILE_SEEK_SHARED
根据whence
更新共享文件指针,该指针具有以下可能的值:
MPI_SEEK_SET
:指针设置为offset
MPI_SEEK_CUR
:指针设置为当前指针位置加offset
MPI_SEEK_END
:指针设置为文件末尾加offset
参考