我想在MPI应用程序中生成唯一的文件名。
在规范2.2版中的MPI_FILE_OPEN
下阅读“对实施者的建议”表明除了通常的uriPrefix:foo/bar/baz
之外,foo/bar/baz
等文件名也是可能的。和baz/PASSWORD=SECRET
这样的文件名一样。预计MPI实现将使用这些附加信息做正确的事情。
这些额外的文件名元素将对mkstemp(3)
造成严重破坏。在前一种情况下,uriPrefix
可以指示文件的存放位置。在后一种情况下,bazXXXXXX/PASSWORD=SECRET
会搞砸mkstemp(3)
的模板约定。
有没有人建议如何安全地将mkstemp(3)
与MPI_FILE_OPEN
合并?
答案 0 :(得分:1)
MPI_FILE_OPEN
是一项集体行动。它旨在由具有相同文件名的所有MPI排名调用,并且名称还应指向共享文件系统上的位置。否则没有意义。如果在不同的级别调用,mkstemp(3)
将生成不同的名称。它还创建文件并返回其文件描述符。如果您想使用MPI并行IO,可能不是您想要的。
如果你真的想创建一个独特的文件,那么你可能会做这样的事情:
int rank;
char name[PATH_MAX] = "/path/to/shared/directory/prefixXXXXXX";
MPI_File fh;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// Create the temporary file in rank 0 only
if (rank == 0)
{
int fd = mkstemp(name);
// Close the handle - we don't need it
close(fd);
// <----- Decorate name here
}
// Broadcast the file name to all other ranks
MPI_Bcast(name, PATH_MAX, MPI_CHAR, 0, MPI_COMM_WORLD);
// Now open the file for MPI parallel IO
MPI_File_open(MPI_COMM_WORLD, name, MPI_MODE_RDWR, MPI_INFO_NULL, &fh);
从mkstemp(3)
获取名称后,在标记为Decorate name here
的位置,您可以对名称进行其他修饰,例如将/PASSWORD=SECRET
附加到fstype:
或以{{1}}作为前缀。如果您需要放置一些特定于流程的装饰,您也可以在广播之后进行此操作。