как использовать память mpi_shared среди узлов? - PullRequest
0 голосов
/ 04 июня 2019

Идея mpi_shared memory состоит в том, чтобы создать окно между процессами, эта идея может быть осуществима для процессов в одном узле, в котором процессы имеют общую память, но также возможно создать окно для процессов между 2узлы?Я имею в виду создание одного окна среди всех процессов в узле 1 и узле 2?например у меня есть 2 узла, каждый узел имеет 4 процесса.У меня есть простой код, в котором я использовал mpi_shared_memory в одном узле (среди 4 процессов), каждый процесс будет обновлять часть 2d-массива (этот массив называется матрицей в коде), а затем все процессы имеют прямой доступ кэтот общий массив.Я имею в виду, что в конце этой процедуры каждый процесс увидит полную версию массива.

этот код работает для одного узла, но мне было интересно, как получить тот же результат с 2 узлами (среди 8процессы)?

program mpi_shared
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER
use mpi
implicit none
integer :: win,hostcomm,hostrank
INTEGER(KIND=MPI_ADDRESS_KIND) :: windowsize
INTEGER :: disp_unit,my_rank,ierr,total, i
TYPE(C_PTR) :: baseptr,baseptr2
integer, POINTER :: matrix(:,:)
integer,allocatable :: arrayshape(:)

call MPI_INIT( ierr )

call MPI_COMM_RANK(MPI_COMM_WORLD,my_rank, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,total,ierr)
CALL MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,&
           MPI_INFO_NULL, hostcomm,ierr)
CALL MPI_Comm_rank(hostcomm, hostrank,ierr)


allocate(arrayshape(2))
arrayshape=[4,3]
if (hostrank == 0) then
 windowsize = int(10**4,MPI_ADDRESS_KIND)*8_MPI_ADDRESS_KIND
else
  windowsize = 0_MPI_ADDRESS_KIND
end if
disp_unit = 1
CALL MPI_Win_allocate_shared(windowsize, disp_unit, MPI_INFO_NULL,&
  hostcomm, baseptr, win, ierr)


 if (hostrank /= 0) then
 CALL MPI_Win_shared_query(win, 0, windowsize, disp_unit, baseptr,&  
 ierr)
 end if


CALL C_F_POINTER(baseptr, matrix,arrayshape)



if (hostrank == 0) then
 matrix=0
endif

call MPI_WIN_FENCE(0, win, ierr)

  if (hostrank == 0) then
    matrix(1,:)=1
 elseif (hostrank == 1) then
    matrix(2,:)=2
 elseif (hostrank == 2)  then
     matrix(3,:)=3
 elseif (hostrank == 3)  then
     matrix(4,:)=4
  endif

 call MPI_WIN_FENCE(0, win, ierr)
 write(*,*) 'iam rank',hostrank,'with matrix= ',matrix



 call MPI_WIN_FENCE(0, win, ierr)
 call MPI_BARRIER(MPI_COMM_WORLD,ierr)
 call MPI_Win_free(win,ierr)
 call MPI_FINALIZE(IERR)

 end program

1 Ответ

1 голос
/ 04 июня 2019

В принципе, очень умная реализация MPI могла бы сделать такую ​​вещь, предоставив программный уровень, чтобы охватить детали базового оборудования. Но на практике нет, узлы по определению являются непересекающимися областями памяти, и поэтому такие окна совместно используемой памяти ограничены одним узлом. И если вы программируете в MPI по умолчанию, вам действительно следует думать о распределенных объектах, это в большинстве случаев приведет к более масштабируемому коду.

...