我想在 MPI 应用程序中生成一个唯一的文件名。
阅读 MPI_FILE_OPEN
下的“给实现者的建议”在规范的 2.2 版中表明文件名类似于 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 并行 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:
。也可以在广播后进行,如果需要放一些进程特定的装饰。
关于c - 用于 MPI_FILE_OPEN 的 MPI 感知 mkstemp(3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166972/