我想在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
有什么建议吗?
最佳答案
MPI_FILE_OPEN
是一项集体行动它将由所有具有相同文件名的MPI列组调用,并且该名称还应指向共享文件系统上的某个位置否则就没有意义了mkstemp(3)
如果在不同的列组中调用,将生成不同的名称它还创建文件并返回其文件描述符如果您想使用MPI parallel 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:
前缀你也可以在广播后做,如果你需要放一些过程特定的装饰。