Mkstemp(3) с поддержкой MPI для использования с MPI_FILE_OPEN?
Я хотел бы создать уникальное имя файла в приложении 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
?
1 ответ
MPI_FILE_OPEN
это коллективная операция. Он предназначен для вызова всеми рангами MPI с одним и тем же именем файла, и имя также должно указывать на местоположение в общей файловой системе. В противном случае это не имеет смысла. mkstemp(3)
будет генерировать разные имена, если вызывается в разных рангах. Также он создает файл и возвращает его дескриптор файла. Вероятно, не то, что вы хотите, если вы хотите использовать параллельный ввод-вывод MPI.
Если вы действительно хотите создать уникальный файл, то вы можете сделать что-то вроде этого:
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:
, Вы также можете сделать это после трансляции, если вам нужно добавить некоторые специфичные для процесса декорации.