Существует ли стандартный способ синхронизации указателей общих файлов 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: %i\n", 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_File_sync(fh)
на MPI_Barrier(MPI_COMM_WORLD)
: гарантированно ли это будет работать правильно?