无法使用Mpi_File_Read读取文件

时间:2018-05-04 11:28:29

标签: fortran mpi

我希望有人可以帮助我。我正在使用MPI库在Fortran 90中编码。我试图并行读取文件(使用函数Mpi_File_Read),但我无法。这是一个简单的代码,演示了这个问题:

    program Read_And_Write
    implicit none
    include "mpif.h"
    integer, parameter :: N = 16
    integer            :: i, this_proc, file_handle, error
    integer            :: read_data(N)
    integer            :: status(MPI_STATUS_SIZE)
    character(len=13)  :: file_name = 'one_array.dat'

    ! Start MPI run
    call Mpi_Init(error)
    call Mpi_Comm_Rank(MPI_COMM_WORLD,  &  ! integer comm
                       this_proc,       &  ! integer rank
                       error)              ! integer error

    ! Create a file from one processor, hence "sequentially"
    if(this_proc .eq. 0) then
      open(9, file=file_name, form='unformatted')
      do i = 1, N
        write(9) i*N
      end do
      close(9)
    end if

    ! Open the same file in MPI mode
    call Mpi_File_Open(MPI_COMM_WORLD,   &  ! integer comm
                       file_name,        &  ! character filename(*)
                       MPI_MODE_RDONLY,  &  ! integer amode
                       MPI_INFO_NULL,    &  ! integer info
                       file_handle,      &  ! integer file handle
                       error)               ! integer error

    ! Read the file in MPI mode
    call Mpi_File_Read_All(file_handle,  &  ! integer file handle
                           read_data,    &  ! buffer 
                           N,            &  ! integer count
                           MPI_INTEGER,  &  ! integer datatype 
                           status,       &  ! integer status
                           error)           ! integer error

    ! Write out what you got
    do i = 1, N
      print *, 'read: ', read_data(i)
    end do

    ! End MPI run
    call Mpi_Finalize(error) 

    end program

任何提示或想法我在这里做错了什么?

我在Xubuntu 16.04.09上使用gfortran 5.4.0和MPICH 3.2

由于

1 个答案:

答案 0 :(得分:1)

Fortran未格式化的顺序文件与MPI I / O不兼容。 MPI I / O文件与流访问文件兼容,其工作方式与C语言I / O类似。

只需更改

  open(9, file=file_name, form='unformatted')

  open(9, file=file_name, access="stream", form='unformatted')

结果将是:

 read:           16
 read:           32
 read:           48
 read:           64
 read:           80
 read:           96
 read:          112
 read:          128
 read:          144
 read:          160
 read:          176
 read:          192
 read:          208
 read:          224
 read:          240
 read:          256

顺序Fortran文件使用MPI I / O读取的其他记录标记(例如Fortran unformatted file format)。您必须使用编译器特定的MPI数据类型来避免记录标记。如果你不必这样做,那就不值得。