MPI_File_open:如果它发现一个正在使用的文件,可以让它放弃吗



在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打开。

相关内容

  • 没有找到相关文章

最新更新