在MPI代码中,许多进程将读取许多文件,并通过从各种文件中获取各种数据来构建自己的域。大多数文件将由多个进程读取。大多数进程将从多个文件中读取。我正试图找出一种方法来保持所有流程的活跃。我想我可能会尝试编写代码,这样每个进程都会循环浏览其文件列表(在运行时确定,以前不可能确定),尝试使用MPI_File_open
打开,然后,如果它看到其当前文件已经在使用,则继续并尝试下一个文件。此循环将持续到读取所有数据为止。
但是,有可能使MPI_File_open
以这种方式运行吗?据我所知,如果MPI_File_open
看到一个文件已经在使用,它只会等待,直到它可以打开它。我还没有找到任何可以改变这种行为的东西。
看起来您可以将信息传递给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: %sn", rank, error_string);
} else{
fprintf(stderr, "%3d: %sn", 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上移植,但该标准似乎没有为这种情况指定有用的提示,将其留给实现者。对于mpich
,这不起作用,只是无休止地阻塞(我在mpich中看不到超时选项)。MPI-3的高级功能正在考虑非阻塞文件打开,所以可能不会很快。
另一种选择是简单地检查文件是否以您使用的任何语言锁定,然后仅在未锁定的情况下使用mpi打开。