MPI_FILE_READ_AT忽略文件(不读取文件)

时间:2016-01-13 17:54:46

标签: io parallel-processing mpi

我是MPI和并行计算的新手。我在Fortran中编写了简单的MPI程序。但问题是MPI_FILE_READ_AT忽略并且不读取文件。

我的代码是:

  program O72
  use mpi
  !implicit none
  INTEGER :: NINTS, DATATYPE, STATUS(MPI_STATUS_SIZE), mpierr, FH, i
  integer :: taskid, no_tasks, FILESIZE, FILENO_2
  INTEGER(KIND=MPI_OFFSET_KIND) :: OFFSET
  INTEGER :: BUF(10)
  character :: filename='ab.dat'

  FILESIZE=10
  BUF(:)=0

  call MPI_INIT(mpierr)
  call MPI_COMM_SIZE(MPI_COMM_WORLD,no_tasks,mpierr)
  call MPI_COMM_RANK(MPI_COMM_WORLD,taskid,mpierr)

  NINTS = FILESIZE/no_tasks  !*INTSIZE)
  OFFSET= taskid*NINTS  !*INTSIZE

  call MPI_File_open(MPI_COMM_WORLD, "ab.dat", MPI_MODE_RDONLY, &
                     MPI_INFO_NULL, FH, mpierr)
  call MPI_FILE_READ_AT(FH, OFFSET, BUF, NINTS, MPI_INT, STATUS, mpierr)

  write(6,*) taskid, no_tasks
  call MPI_BARRIER(MPI_COMM_WORLD, mpierr)
  write(6,*) 'taskid=',taskid,'NINTS=', NINTS
  write(6,*) 'taskid_',taskid,'OFFSET=',OFFSET

  write(6,*) BUF(:)

  !call MPI_FILE_WRITE(FILENO_2, OFFSET, BUF, NINTS, DATATYPE, STATUS, mpierr)

  call MPI_FILE_CLOSE(FH, mpierr)
  !call MPI_FILE_CLOSE(FILENO_2)

  call MPI_FINALIZE(mpierr)

  end

然后,输入文件是一个包含2列的ASCII文件,其中第1列始终为1,第2列始终为2。

1      2
1      2
1      2
1      2
1      2
1      2
1      2
1      2
1      2
1      2

输出就像这样,使用了2个处理器:

0           2
1           2
taskid=           1 NINTS=           5
taskid_           1 OFFSET=                    5
taskid=           0 NINTS=           5
taskid_           0 OFFSET=                    0
171051313   171051313   171051313   171051313   171051313           0           0           0           0           0
822751753   822751753   822751753   822751753   822751753           0           0           0           0           0

我不明白问题出在哪里以及为什么将随机值分配给BUF(:)

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

我想简单的答案是MPI-IO只执行二进制 IO,而你在这里尝试实现的是格式化 IO。

从这里开始,您会发现代码中存在一些问题:

  1. 您的文件已格式化。正如我在序言中所说,MPI-IO只执行二进制IO,你必须切换到二进制输入文件,或者将文件读作一组你必须在内部理解的字符串。让我们假设这篇文章的其余部分你的输入文件现在是二进制文件。
  2. offset中要使用的MPI_File_read_at()以字节为单位。你传递的是许多元素。因此,您需要将此偏移量乘以您想要读取的大小,即integer的大小。
  3. 最后,您打印的是buf的整数,这是一个10 integer的数组,而您只读了nintsbuf(1:nints)。您可能只应打印python
  4. 这样,您的代码就可以运行。