【问题标题】:Is it safe to open different shared memory windows in MPI?在 MPI 中打开不同的共享内存窗口是否安全?
【发布时间】:2019-06-26 17:39:05
【问题描述】:

我正在编写一个纯 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 是否有可能相互覆盖(内存中的物理地址相同)?

【问题讨论】:

    标签: mpi shared-memory


    【解决方案1】:

    我快速浏览了一下,在标准中找不到任何内容,但 var1 和 var2 必须不重叠,否则无法编写任何有用的代码。如果 var1 和 var2 是正常的可分配数组,那么可以保证在 Fortran 分配调用之后分配的内存完全不同。 MPI_Win_allocate_shared() 也必须如此,它才能以任何方式发挥作用。

    【讨论】:

    • 这正是我的想法,只是想确定一下,因为我在 mpi_win_allocate_shared 的 MPI 标准中找不到任何内容。他们应该分配不同的内存块是有道理的,但由于我没有找到任何明确的确认,我想 100% 确定。
    • 记住一个窗口会消耗资源,一个好的做法是尽量减少它们。例如,在 Open MPI 中,会为每个窗口创建一个通信器,而幼稚的方法可能会导致耗尽所有通信器 id。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2020-03-31
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2013-04-08
    相关资源
    最近更新 更多