Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MPI_File_open:如果发现一个文件正在使用,是否可以让它放弃?_File_Io_Mpi - Fatal编程技术网

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

MPI_File_open:如果发现一个文件正在使用,是否可以让它放弃?,file,io,mpi,File,Io,Mpi,我在MPI代码中遇到过这样一种情况:许多进程将读取许多文件,并通过从各种文件中获取各种数据来构建自己的域。大多数文件将由多个进程读取。大多数进程将从多个文件中读取。我正在试图找出一种方法来保持所有进程都处于活动状态。我想我可能会尝试编写代码,这样每个进程都会在其文件列表中循环(在运行时确定,以前无法确定),尝试使用MPI\u File\u open打开,然后,如果它看到其当前文件已在使用,则继续尝试下一个文件。此循环将继续,直到读取所有数据 但是有没有可能使MPI文件以这种方式打开?据我所知,如

我在MPI代码中遇到过这样一种情况:许多进程将读取许多文件,并通过从各种文件中获取各种数据来构建自己的域。大多数文件将由多个进程读取。大多数进程将从多个文件中读取。我正在试图找出一种方法来保持所有进程都处于活动状态。我想我可能会尝试编写代码,这样每个进程都会在其文件列表中循环(在运行时确定,以前无法确定),尝试使用
MPI\u File\u open
打开,然后,如果它看到其当前文件已在使用,则继续尝试下一个文件。此循环将继续,直到读取所有数据


但是有没有可能使MPI文件以这种方式打开?据我所知,如果
MPI\u File\u open
看到一个文件已经在使用中,它只会等待它可以打开它。我找不到任何可以改变此行为的内容。

看起来您可以将信息传递到
mpi\u file\u open
以指定在移动到新文件之前等待的时间。这似乎取决于实现,但从openmpi来看,提示似乎是
共享文件\u超时
指定在返回
MPI\u ERR\u TIMEDOUT
之前,如果文件被锁定,等待多长时间。类似的方法可以工作(我只测试了在文件未锁定的情况下编译/运行是否正确)

#包括“mpi.h”
#包括
#包括
int main(int argc,char*argv[])
{
MPI_Fint把手,把手;
国际区议会、欧洲议会、等级;
MPI_文件fh;
MPI_信息;
//int fd=打开(“临时”,O|U创建| O|U RDWR,0666);
//int结果=群集(fd,锁定_EX);
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_Errhandler_集(MPI_COMM_WORLD,MPI_ERRORS_RETURN);
MPI\u信息\u创建(&Info);
MPI_信息集(信息,“共享文件超时”,“10.0”);
ec=MPI文件打开(MPI通信世界,“临时”、MPI模式、信息和fh);
如果(ec!=MPI_成功){
字符串[MPI_MAX_ERROR_STRING];
内伦;
MPI_错误字符串(ec、错误字符串和len);
fprintf(标准,“%3d:%s\n”,秩,错误\u字符串);
}否则{
fprintf(标准,“%3d:%s\n”,排名,“成功”);
}
MPI文件关闭(&fh);
MPI_错误处理程序集(MPI_通信世界,MPI_错误是致命的);
MPI_Finalize();
返回0;
}
请注意,您可能需要设置
MPI\u Errhandler
,以确保
MPI\u ERR\u TIMEDOUT
错误不会导致终止。不确定如何在不同版本的mpi上进行移植,但似乎没有为这种情况指定有用的提示,将其留给实现者。对于
mpich
这不起作用,只是无限地阻塞(我在mpich中看不到超时选项)。非阻塞文件打开正在考虑中,所以可能不会很快


另一种方法是简单地检查文件是否以您正在使用的任何语言锁定,然后仅在未锁定的情况下使用mpi打开

所以我终于对MPI_信息有了一点了解。谢谢你的回答!
#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;
}