我希望有人可以帮助我。我正在使用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
由于
答案 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数据类型来避免记录标记。如果你不必这样做,那就不值得。