Fortran 如何在节点之间使用mpi_共享内存?
mpi_共享内存的想法是在进程之间创建一个窗口,这种想法可能适用于一个节点中进程具有共享内存的进程,但是也可能为两个节点之间的进程创建一个窗口吗?我的意思是在节点1和节点2中的所有进程中创建一个窗口? 例如,我有2个节点,每个节点有4个进程。 我有一个简单的代码,其中我在一个节点(4个进程中)使用了mpi_共享_内存,每个进程将更新2d数组的一部分(该数组在代码中称为矩阵),之后,所有进程都可以直接访问该共享数组。 我的意思是,在这个例程结束时,每个进程都将看到阵列的完整版本 这段代码适用于单个节点,但我想知道如何使用2个节点(8个进程中)获得相同的结果Fortran 如何在节点之间使用mpi_共享内存?,fortran,mpi,shared-memory,Fortran,Mpi,Shared Memory,mpi_共享内存的想法是在进程之间创建一个窗口,这种想法可能适用于一个节点中进程具有共享内存的进程,但是也可能为两个节点之间的进程创建一个窗口吗?我的意思是在节点1和节点2中的所有进程中创建一个窗口? 例如,我有2个节点,每个节点有4个进程。 我有一个简单的代码,其中我在一个节点(4个进程中)使用了mpi_共享_内存,每个进程将更新2d数组的一部分(该数组在代码中称为矩阵),之后,所有进程都可以直接访问该共享数组。 我的意思是,在这个例程结束时,每个进程都将看到阵列的完整版本 这段代码适用于单个
原则上,一个非常聪明的MPI实现可以通过提供一个软件层来覆盖底层硬件的细节来完成这类工作。但实际上,根据定义,节点是不相交的内存区域,因此共享内存窗口仅限于单个节点。如果您在默认情况下使用MPI编程,您真的应该考虑分布式对象,这在大多数情况下会导致更具可伸缩性的代码。那么您还需要前面的问题吗?如果没有,考虑删除它,因为它可能会吸引下行。谢谢@ VLADIMIRF,我已经删除它感谢答案@ Ian Bush,实际上我的代码已经与按摩传递通信并行化,我需要MPI的这种新功能,以提高并行化效率。
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