Запишите огромные массивы в один файл, используя MPI-IO с указателем общего файла - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь записать несколько длинных распределенных массивов в один файл, используя 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.

Есть ли обходной путь для этого случая?

1 Ответ

0 голосов
/ 30 ноября 2018

Я думаю, что обходной путь - обновить реализацию MPI.И OpenMPI, и MPICH работали над такими "огромными ошибками ввода / вывода" - указатели на общие файлы не привлекают много внимания, но я думаю, что в прошлом году или около того исправления ошибок должны были об этом позаботиться.

...