支持MPI的mkstemp(3)用于MPI_FILE_OPEN?

时间:2012-10-31 20:30:19

标签: c mpi mkstemp

我想在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合并?

1 个答案:

答案 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}}作为前缀。如果您需要放置一些特定于流程的装饰,您也可以在广播之后进行此操作。