Безопасно ли открывать различные окна совместно используемой памяти в MPI? - PullRequest
0 голосов
/ 26 июня 2019

Я пишу код с чистым 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 могут перезаписывать друг друга (один и тот же физический адрес в памяти)

1 Ответ

0 голосов
/ 28 июня 2019

Я быстро просмотрел и не могу найти ничего в стандарте, но var1 и var2 должны не перекрываться, иначе было бы невозможно написать какой-либо полезный код.Если бы var1 и var2 были обычными размещаемыми массивами, то было бы гарантировано, что выделенная память будет полностью отличаться после вызова выделения Fortran.То же самое должно быть верно для MPI_Win_allocate_shared (), чтобы он был полезен в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...