Fortran代码: 试图利用MPI共享内存窗口,我对fortran指针没有多少经验。
要求: 我想做的是有多个(两个或更多)处理器分配共享内存,但将这些位置映射到单个阵列 A , 例如,如果使数组为100,则分配2个内存
以下是代码:
N=10
!allocate shared memory window
if(shmrank<2)then !allocate all memory on proc 1 and 2
winsize=8_MPI_ADDRESS_KIND*N*(N/2)
else
winsize=0_MPI_ADDRESS_KIND
end if
!Begin shared memory window
call mpi_win_allocate_shared(winsize,1,MPI_INFO_NULL,shmcomm,baseptr,win,ierr)
然后我可以使用shared_query获取大小和指针位置,其中 baseptr0 指的是由处理器0
分配的内存>call MPI_Win_shared_query(win,0,winsize,disp_unit,baseptr0,ierr)
! write(6+rank,*)'post shared_query',shmrank,winsize0
call MPI_Win_shared_query(win,1,winsize,disp_unit,baseptr1,ierr)
! write(6+rank,*)'post shared_query',shmrank,winsize1
要在单个处理器上分配所有内存,我只需执行以下操作,
!associate Fortran pointer with shared memory
call C_F_POINTER(baseptr, A, arrayshape)
我现在可以访问A(1:100)。
如果可能,我想访问A,例如,A(1)从baseptr0开始,A(50)从baseptr1开始。
我的问题: 有没有办法做到这一点?或者替代方案不需要对代码的其余部分进行太多更改?