看起來您可以將信息傳遞給mpi_file_open
以指定在移至新文件之前等待多久。這似乎取決於實現,但從openmpi docs似乎暗示shared_file_timeout
指定在返回MPI_ERR_TIMEDOUT
之前文件被鎖定需要等待多長時間。像這樣的東西可以工作(我只測試過這個編譯/正確運行,當文件沒有被鎖定)。
#include "mpi.h"
#include <stdio.h>
#include <sys/file.h>
int main(int argc, char *argv[])
{
MPI_Fint handleA, handleB;
int rc, ec, rank;
MPI_File fh;
MPI_Info info;
//int fd = open("temp", O_CREAT | O_RDWR, 0666);
//int result = flock(fd, LOCK_EX);
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
MPI_Info_create(&info);
MPI_Info_set(info, "shared_file_timeout", "10.0");
ec = MPI_File_open(MPI_COMM_WORLD, "temp", MPI_MODE_RDONLY, info, &fh);
if (ec != MPI_SUCCESS) {
char estring[MPI_MAX_ERROR_STRING];
int len;
MPI_Error_string(ec, error_string, &len);
fprintf(stderr, "%3d: %s\n", rank, error_string);
} else{
fprintf(stderr, "%3d: %s\n", rank, "Success");
}
MPI_File_close(&fh);
MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL);
MPI_Finalize();
return 0;
}
幾個音符,你可能需要設置MPI_Errhandler
以確保MPI_ERR_TIMEDOUT
錯誤不會導致終止。不知道如何在不同版本的mpi上實現這種便攜式,但standard似乎沒有爲這種情況指定有用的提示,並將其留給實施者。對於mpich
這不起作用,只是無休止地阻塞(我看不到在mpich超時的選項)。非阻塞文件在advanced features of MPI-3正在考慮打開,所以可能不會很快。
另一種方法是簡單地檢查文件是否被鎖定在您正在使用的任何語言中,然後僅在未被鎖定時才用mpi打開。
所以最後我對MPI_Info的內容有所瞭解。感謝你的回答! –