Я пытаюсь записать несколько длинных распределенных массивов в один файл, используя MPI-I / O (реализация OpenMPI) с указателем общего файла.Я получаю следующие сообщения об ошибках
lseek: неверный аргумент
WRITE FAILED
Я подготовил упрощенный фрагмент кода для воспроизведения проблемы.
long long globalUpperBnd = 2200000000;// more than size of int
long long average = globalUpperBnd/commSize;
long long length = (commRank == commSize-1) ? globalUpperBnd-(average*commRank) : average;
char *buf = new char[length];
... // fill the buffer
MPI_File file;
MPI_File_open(comm, "test.bin", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file);
MPI_File_set_view(file, 0, MPI_BYTE, MPI_BYTE, "native", MPI_INFO_NULL);
MPI_File_write_ordered(file, buf, length, MPI_BYTE, MPI_STATUS_IGNORE);
// here I got an error message
MPI_File_write_ordered(file, buf, length, MPI_BYTE, MPI_STATUS_IGNORE);
MPI_File_close(&file);
delete []buf;
Похоже, что MPI_Offset
это просто int
, а второй вызов MPI_File_write_ordered
вызывает переполнение MPI_Offset
, смещение становится отрицательным.Интересно, что запись одного и того же объема данных может быть успешно выполнена умножением globalUpperBnd
на 2 и вызовом MPI_File_write_ordered
только один раз.Похоже, что MPI_File_write_ordered
позволяет избежать переполнения смещения.
Я использую 64-битную библиотеку OpenMPI.
Есть ли обходной путь для этого случая?