Io MPI文件读取忽略文件(不读取文件)

Io MPI文件读取忽略文件(不读取文件),io,parallel-processing,mpi,Io,Parallel Processing,Mpi,我是MPI和并行计算的新手。我用Fortran编写了简单的MPI程序。但问题是处的MPI\u FILE\u READ\u忽略并不读取该文件 我的代码是: program O72 use mpi !implicit none INTEGER :: NINTS, DATATYPE, STATUS(MPI_STATUS_SIZE), mpierr, FH, i integer :: taskid, no_tasks, FILESIZE, FILENO_2 INTEGER(KIN

我是MPI和并行计算的新手。我用Fortran编写了简单的MPI程序。但问题是处的
MPI\u FILE\u READ\u忽略并不读取该文件

我的代码是:

  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
然后,输入文件是一个包含两列的ASCII文件,其中第一列始终为1,第二列始终为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只执行二进制操作系统,而你在这里尝试实现的是格式化操作系统

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

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

  • 有了这一点,您的代码应该可以正常工作。

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

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

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

  • 这样,您的代码就可以工作了。

    谢谢您的回答:)谢谢您的回答:)