使用MPI-IO和共享文件指针将巨大的数组写入单个文件

时间:2018-10-23 09:21:45

标签: file mpi distributed mpi-io parallel-io

我正在尝试使用MPI-I / O(OpenMPI实现)和共享文件指针将多个长的分布式数组写入单个文件。我收到以下错误消息

  

lseek:无效的参数

     

写失败

我准备了一个简化的代码片段来重现该问题。

        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 :(得分:0)

我认为解决方法是升级MPI实施。 OpenMPI和MPICH都在研究这类“巨大的I / O”错误-共享文件指针并没有引起足够的重视,但我认为在去年左右的错误修复中应该解决这一问题。