我在Fortran上用MPI写文件,在查看写的内容时,我没有得到预期的结果

时间:2015-08-13 08:54:22

标签: mpi

每个进程都在构建一些数组,并使用mpi_file_write_at()将此数组写入“正确”的位置。 写入文件后,我从同一个地方读取,这不是我写的。代码附后。我只是MPI的初学者,如果问题不聪明,那就很抱歉。

program output
use mpi
implicit none
integer :: ierr,i,proc_num,file,intsize
integer :: status(mpi_status_size)
integer,parameter :: count=10
integer,dimension(count) :: buf
integer,dimension(3*count) :: arr
integer(kind=mpi_offset_kind) :: disp
call mpi_init(ierr)
call mpi_comm_rank(MPI_COMM_WORLD,proc_num,ierr)
do i=1,count
   buf(i) = proc_num*count+i
enddo
call mpi_file_open(MPI_COMM_WORLD,'out.txt',mpi_mode_wronly+mpi_mode_create,mpi_info_null,file,ierr)
call mpi_type_size(mpi_integer,intsize,ierr)
disp = proc_num*count*intsize
call mpi_file_write_at(file,disp,buf,count,mpi_integer,status,ierr)
if (proc_num==0) then
   call mpi_file_read_at(file,0,arr,3*count,mpi_integer,status,ierr)
   write(*,*),arr
endif
call mpi_file_close(file,ierr)
call mpi_finalize(ierr)
end program output

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在使用mpi_mode_wronly打开该文件。如上所述here,它对应于"只写"。因此,mpi_file_read_at()可能会失败。可以通过查看输出参数ierr来检查它。

你能试试mpi_mode_rdwr旗吗?这应该启用读写操作。

此外,MPI_File_write_at()是非集体操作。因此,流程0可以在流程1退出mpi_file_read_at()之前调用MPI_File_write_at()。可以添加mpi_barrier()来防止这种情况发生。看看http://www.mpi-forum.org/docs/mpi-2.2/mpi22-report/node305.htm。它使用MPI_File_write_at()提供了各种示例。可能还需要额外调用MPI_File_sync()MPI_File_set_view()

请注意,您提供的代码等同于对函数MPI_Gather()的调用。