【问题标题】:MPI_FILE_READ_AT ignores file (don't read the file)MPI_FILE_READ_AT 忽略文件(不读取文件)
【发布时间】:2016-04-18 20:09:26
【问题描述】:

我是 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(:)

你能帮帮我吗?

【问题讨论】:

    标签: io parallel-processing mpi


    【解决方案1】:

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

    所以从这里开始,你会发现你的代码有一些问题:

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

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

    【讨论】:

    • 谢谢你的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2018-01-03
    • 2018-08-31
    • 1970-01-01
    • 2014-02-23
    • 2012-03-15
    相关资源
    最近更新 更多