Parallel processing 使用MPI-IO读取文本文件?

Parallel processing 使用MPI-IO读取文本文件?,parallel-processing,mpi,mpi-io,Parallel Processing,Mpi,Mpi Io,我有一个文本文件,其中包含一个带有矩阵维度的标题,然后是矩阵。以下是3x3矩阵的示例: 3 3 1 56 8 12 3 0 9 44 81 我一直用MPI-IO获取垃圾值,发现它只适用于二进制文件,而不适用于文本文件 我想我应该读入一个字符流并转换成整数,但我不确定如何处理这个问题,因为矩阵元素的位数是可变的。我真的不知道如何处理这个问题?通常,您知道二进制文件中写入的内容的类型和数量(例如,所有整数、10int3float,等等)。您可以读取字节数,但MPI二进制文件通常作为一个完整的类型读

我有一个文本文件,其中包含一个带有矩阵维度的标题,然后是矩阵。以下是3x3矩阵的示例:

3 3
1 56 8
12 3 0
9 44 81
我一直用MPI-IO获取垃圾值,发现它只适用于二进制文件,而不适用于文本文件


我想我应该读入一个字符流并转换成整数,但我不确定如何处理这个问题,因为矩阵元素的位数是可变的。我真的不知道如何处理这个问题?

通常,您知道二进制文件中写入的内容的类型和数量(例如,所有整数、10
int
3
float
,等等)。您可以读取字节数,但MPI二进制文件通常作为一个完整的类型读取/写入,在您的情况下是9个整数(因此位数并不重要)。你打开文件,读一些类似的东西

    call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, & 
                   MPI_MODE_RDONLY , MPI_INFO_NULL, fh, ierr)

    bufsize = 3*3
    allocate(buf(bufsize))
    call MPI_FILE_READ_ALL(fh, buf, bufsize, MPI_integer, & 
                           MPI_STATUS_IGNORE, ierr)

对于可变矩阵大小,可以使用类似于
MPI\u File\u get\u size
的方法来获取大小并计算要读取的元素数。对于混合数据,您可以将二进制文件的第一部分(或最后一部分)作为头,首先读取该头,然后使用该头对文件的其余部分进行解码。您仍然需要知道头的格式,这可能会有问题,因为更改代码/头格式时会破坏向后兼容性。这是HDF5等数据格式比较棘手的部分原因,因为您需要知道“字节”而不是“数字”。e、 g.
11
1015123355

现在,如果您的约定是“每个数字将被零填充到6位数”,那么您可以让每个进程从(大小/NPROC)*秩-th读取

或者,您需要一个索引器来读取文件并记录矩阵每行的起始偏移量


或者,正如您所观察到的,使用二进制数据会变得容易得多。

为什么要/需要使用MPI-IO?每个进程应该读取/管理矩阵的哪一部分?@Gilles每个进程都会获得一个连续的行块。这是一项作业,因此我必须使用MPI-IO。(我知道家庭作业帮助是不受欢迎的,所以我要求的是一种方法,而不是解决方案!)