Идея 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