gpt4 book ai didi

memory - MPI Fortran 代码 : how to share data on node via openMP?

转载 作者:IT王子 更新时间:2023-10-28 23:33:49 27 4
gpt4 key购买 nike

我正在编写一个已经使用 MPI 的 Fortan 代码。

现在,我面临一种情况,一组数据增长得非常大,但每个进程都相同,所以我希望每个节点只将它存储在内存中一次,并且一个节点上的所有进程都访问相同的数据。

为每个进程存储一次会超出可用 RAM。

是否有可能使用 openMP 实现类似的目标?

每个节点的数据共享是我唯一想要的,不需要其他每个节点的并行化,因为这已经通过 MPI 完成。

最佳答案

如果仅用于共享数据 block ,则无需实现混合 MPI+OpenMP 代码。你实际上要做的是:

1) 将世界通信器分成跨越同一主机/节点的组。如果你的 MPI 库实现了 MPI-3.0,那真的很容易——你需要做的就是调用 MPI_COMM_SPLIT_TYPEsplit_type设置为 MPI_COMM_TYPE_SHARED :

USE mpi_f08

TYPE(MPI_Comm) :: hostcomm

CALL MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, &
MPI_INFO_NULL, hostcomm)

MPI-2.2 或更早版本不提供 MPI_COMM_SPLIT_TYPE操作和一个必须获得一些创意。例如,您可以使用我在 Github here 上找到的简单的按主机拆分实现。 .

2) 现在驻留在同一节点上的进程是同一通信器的一部分 hostcomm ,他们可以创建一 block 共享内存并用它来交换数据。同样,MPI-3.0 提供了一种(相对)简单且可移植的方式来做到这一点:

USE mpi_f08
USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_F_POINTER

INTEGER :: hostrank

INTEGER(KIND=MPI_ADDRESS_KIND) :: size
INTEGER :: disp_unit
TYPE(C_PTR) :: baseptr
TYPE(MPI_Win) :: win

TYPE(MY_DATA_TYPE), POINTER :: shared_data

! We only want one process per host to allocate memory
! Set size to 0 in all processes but one
CALL MPI_Comm_rank(hostcomm, hostrank)
if (hostrank == 0) then
size = 10000000 ! Put the actual data size here
else
size = 0
end if
disp_unit = 1
CALL MPI_Win_allocate_shared(size, disp_unit, MPI_INFO_NULL, &
hostcomm, baseptr, win)

! Obtain the location of the memory segment
if (hostrank /= 0) then
CALL MPI_Win_shared_query(win, 0, size, disp_unit, baseptr)
end if

! baseptr can now be associated with a Fortran pointer
! and thus used to access the shared data
CALL C_F_POINTER(baseptr, shared_data)

! Use shared_data as if it was ALLOCATE'd
! ...

! Destroy the shared memory window
CALL MPI_Win_free(win)

代码的工作方式是使用 MPI-3.0 功能来分配共享内存窗口。 MPI_WIN_ALLOCATE_SHARED在每个进程中分配一 block 共享内存。由于您要共享一个数据 block ,因此仅将其分配在单个进程中而不是将其分布在各个进程中才有意义,因此 size在进行调用时,除了一个等级之外的所有等级都设置为 0。 MPI_WIN_SHARED_QUERY用于找出该共享内存块在调用进程的虚拟地址空间中映射的地址。一个地址是已知的,可以使用 C_F_POINTER() 将 C 指针与 Fortran 指针相关联。子程序和后者可用于访问共享内存。完成后,必须通过使用 MPI_WIN_FREE 销毁共享内存窗口来释放共享内存。 .

MPI-2.2 或更早版本不提供共享内存窗口。在这种情况下,必须使用依赖于操作系统的 API 来创建共享内存块,例如标准 POSIX 序列 shm_open()/ftruncate()/mmap() .为了执行这些操作,必须编写一个可从 Fortran 调用的实用 C 函数。见 that code一些灵感。 void *mmap() 返回可以直接传递给 C_PTR 中的 Fortran 代码然后可以与 Fortran 指针关联的类型变量。

关于memory - MPI Fortran 代码 : how to share data on node via openMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24797298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com