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

MPI_FILE_READ_AT ignores file (don't read the file)

我是 MPI 的新手,并行 computing.I 用 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(:)

你能帮帮我吗?

我想简单的答案是 MPI-IO 只执行 binary IOs,而你在这里尝试实现的是 formatted IOs.

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

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

这样,您的代码应该可以工作了。