我正在尝试使用 MPI_SET_VIEW 和 MPI_WRITE_ALL 编写一个 4 * 4 数组。xx 是一个 4 * 4 数组,我希望此代码为 xx = (0,1,2,3; 0,1,2,3; 0,1,2,3; 0,1,2,3)。globle_size 和 local_size 等于 4 和 2。我首先创建了一个子数组 2 * 2 文件类型,因此我将这个 4 * 4 数组分成 4 个部分,即 2 * 2。然后我设置了这个文件类型的视图,并且写xx。结果应该等于 (0,1,2,3; 0,1,2,3; 0,1,2,3; 0,1,2,3),但事实并非如此。结果有些是对的,有些是错的。
1 当我做 j=ls2,le2, i = ls1,le1, xx(i,j)=i 时,数组 xx() 是 4*4 数组还是 2*2 数组?ls1=ls2=0,le1=le2=1。
2 对于 MPI_WRITE_ALL,我应该使用 4 * 4 数组还是 2 * 2 数组?我应该算什么?1 还是 4?
3 对于 MPI_WRITE_ALL,我应该使用文件类型作为类型样式吗?
integer::filesize,buffsize,i,Status(MPI_STATUS_SIZE),charsize,disp,filetype,j,count
integer::nproc,cart_comm,ierr,fh,datatype
INTEGER(KIND=MPI_OFFSET_KIND) offset
integer,dimension(dim):: sizes,inersizes,start,sb,ss
character:: name*50,para*100,zone*100
do j=local_start(2),local_end(2)
do i=local_start(1),local_end(1)
xx(i,j)=i
enddo
enddo
count=1
offset=0
start=cart_coords*local_length
call MPI_TYPE_CREATE_SUBARRAY(2,global_length,local_length,start,MPI_ORDER_FORTRAN,&
MPI_integer,filetype,ierr)
call MPI_TYPE_COMMIT(filetype,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_integer,filetype,&
"native",MPI_INFO_NULL,ierr)
CALL MPI_FILE_WRITE(fh, xx,1, filetype, MPI_STATUS_ignore, ierr)