我想在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:前缀你也可以在广播后做,如果你需要放一些过程特定的装饰。

10-02 05:40