每个进程都在构建一些数组,并使用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
谢谢!
答案 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()
的调用。