我有一个MPI代码的情况,许多进程将通过从各种文件中获取各种数据来读取许多文件并构建自己的域。大多数文件将由多个进程读取。大多数进程将从多个文件中读取。我试图找到一种方法来保持所有进程活跃。我以为我可能会尝试编写代码,以便每个进程循环遍历其文件列表(在运行时确定,之前无法确定),尝试使用MPI_File_open
打开,然后,如果它看到当前文件已经在使用,继续尝试下一个文件。这个循环将持续到读取所有数据为止。
但是有可能让MPI_File_open
以这种方式表现吗?据我所知,如果MPI_File_open
看到一个已经在使用的文件,它只会等到它可以打开它。我还没有找到任何可以改变这种行为的东西。
答案 0 :(得分:1)
看起来您可以将信息传递给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中的选项超时)。 <{3}}正在考虑打开非阻止文件,因此可能不会很快。
另一种方法是简单地检查文件是否以您正在使用的语言锁定,然后仅在未锁定的情况下使用mpi打开。