下面的问题是使用 mpiio 写一个 4 * 4 buff 数组。我使用 4 个核心,所以子数组应该是 2 * 2。问题是,当我将 buff 设置为 integer(2,2),并将所有 MPI_DOUBLE_PRECISION 设置为 MPI_INTEGER 时,代码运行良好。但是,MPI_DOUBLE_PRECISION 给出了错误的结果。这很奇怪,因为我认为设置 buff 数组时没有错误。
Integer results::
0000000 1 1 1 1
0000016 1 1 1 1
0000032 1 1 1 1
0000048 1 1 1 1
0000064
Double Precision results::
0000000 0 1072693248 0 1072693248
0000016 0 1072693248 0 1072693248
0000032 0 1072693248 0 1072693248
0000048 0 1072693248 0 1072693248
0000064 0 1072693248 0 1072693248
0000080 0 1072693248 0 1072693248
0000096 0 1072693248 0 1072693248
0000112 0 1072693248 0 1072693248
0000128
This is the code:
program test
use mpi
implicit none
integer::rank,nproc,ierr,buffsize,status(MPI_STATUS_SIZE),intsize,i,j,filetype,cart_comm,count
integer::fh
integer(kind=mpi_offset_kind):: offset=0
double precision,dimension(2,2)::buff
character:: filename*50
integer::sizes(2)
integer::gsize(2)
integer::start(2)
integer::subsize(2)
integer::coords(2)
integer:: nprocs_cart(2)=(/2,2/)
logical::periods(2)
character:: name*50,para*100,zone*100
gsize=(/4,4/)
subsize=(/2,2/)
offset=0
buff=1.d0
count=1
call MPI_init(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nproc, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
CALL MPI_Dims_create(nproc, 2, nprocs_cart, ierr)
CALL MPI_Cart_create(MPI_COMM_WORLD, 2, nprocs_cart, periods, .TRUE., &
cart_comm, ierr)
CALL MPI_Comm_rank(cart_comm, rank, ierr)
CALL MPI_Cart_coords(cart_comm, rank, 2, coords, ierr)
start=coords*2
call MPI_TYPE_CREATE_SUBARRAY(2,gsize,subsize,start,MPI_ORDER_FORTRAN,&
MPI_DOUBLE_PRECISION,filetype,ierr)
call MPI_TYPE_COMMIT(filetype,ierr)
If( rank == 0 ) Then
Call mpi_file_delete( 'out.dat', MPI_INFO_NULL, ierr )
End If
Call mpi_barrier( mpi_comm_world, ierr )
call MPI_File_open(MPI_COMM_WORLD,'out.dat',&
MPI_MODE_WRONLY + MPI_MODE_CREATE, MPI_INFO_NULL, fh,ierr)
call MPI_File_set_view(fh,offset,MPI_DOUBLE_PRECISION,filetype,&
"native",MPI_INFO_NULL,ierr)
CALL MPI_FILE_WRITE_all(fh, buff,4, MPI_DOUBLE_PRECISION, MPI_STATUS_ignore, ierr)
call MPI_File_close(fh,ierr)
call MPI_FINALIZE(ierr)
end program test