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