在MPI中打开不同的共享内存窗口是安全的吗?



我正在编写一个纯MPI代码,其中我需要在共享内存通信器中的所有任务中共享几个变量。使用不同的窗口安全吗?例如:是否有这些窗口在物理内存中重叠的风险?

! number: number of elements in var1 and var2, number=n1*n2
! varsize: size_of(double), size of each element of var1 and var2
! shape: shape of var1 and var2, shape[n1,n2]
type(c_ptr) :: baseptr
integer(kind=mpi_address_kind) :: varsize,lb
integer :: dispunit
integer :: number
integer :: shape(2)
double precision, pointer, dimension(:,:) :: var1,var2
integer :: window_1,window_2
if(rank.eq.0)then
 ! only #0 allocates memory, others get zero memory
 call mpi_type_get_extent(mpi_double_precision,lb,varsize,ierr)
 dispunit=varsize
elseif(rank.gt.leader)then
 varsize=0
 dispunit=1
endif
! allocate var1
call mpi_win_allocate_shared(number*varsize,dispunit,mpi_info_null,part_comm,baseptr,window_1,ierr)
! get location of memory segment
if(rank.gt.0)then
  call mpi_win_shared_query(window_1,0,number*varsize,dispunit,baseptr,ierr)
endif
! associate C pointer to Fortran pointer
call c_f_pointer(baseptr,var1,shape)
! allocate var2
call mpi_win_allocate_shared(number*varsize,dispunit,mpi_info_null,part_comm,baseptr,window_2,ierr)
! get location of memory segment
if(rank.gt.0)then
  call mpi_win_shared_query(window_2,0,number*varsize,dispunit,baseptr,ierr)
endif
! associate C pointer to Fortran pointer
call c_f_pointer(baseptr,var2,shape)

var1和var2可能会互相覆盖(内存中相同的物理地址(?

我已经快速看了,我找不到标准中的任何东西,但是var1和var2 必须是不重叠的,否则是不可能的编写任何有用的代码。如果VAR1和VAR2是正常的可分配阵列,则可以确保在fortran分配呼叫后,分配的内存将完全不同。mpi_win_allocate_shared((必须以任何方式有用。

最新更新