Fortran中具有不同窗口大小的MPI共享内存
我正试图采用我的代码来利用MPI共享内存 为了使事情尽可能简单,假设我只有两个内核。 Core A需要Core b的大小为_b的数组,Core b需要Core A的大小为_A的数组 在core A上执行时,我可以执行以下操作吗?Fortran中具有不同窗口大小的MPI共享内存,fortran,mpi,shared-memory,Fortran,Mpi,Shared Memory,我正试图采用我的代码来利用MPI共享内存 为了使事情尽可能简单,假设我只有两个内核。 Core A需要Core b的大小为_b的数组,Core b需要Core A的大小为_A的数组 在core A上执行时,我可以执行以下操作吗? call MPI_WIN_ALLOCATE_SHARED(size_a_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_a, mpierr) call C_F_pointer(ptr, fptr, (/s
call MPI_WIN_ALLOCATE_SHARED(size_a_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_a, mpierr)
call C_F_pointer(ptr, fptr, (/size_a/))
对于核心B
call MPI_WIN_ALLOCATE_SHARED(size_b_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_b, mpierr)
call C_F_pointer(ptr, fptrb, (/size_b/))
现在假设我随后分别通过MPI_发送/接收win_a和win_b与core b和core a进行通信。现在的逻辑是按照以下方式进行这两个查询
核心A:
call MPI_WIN_SHARED_QUERY( win_b
& , rank_of_core_B
& , size_b
& , disp_unit
& , ptr_buf
& , mpierr )
call C_F_pointer(ptr_buf, fptr_query_A, (/size_b/))
对于核心B,则反之亦然
call MPI_WIN_ALLOCATE_SHARED(size_b_in_BYTES, disp_unit, MPI_INFO_NULL, comm_shm, ptr, win_b, mpierr)
call C_F_pointer(ptr, fptrb, (/size_b/))
假设我知道在核心B中,我的指针fptrb
指向一个数组,即
fptrb = GIVEN_ARRAY_OF_SIZEB
例如,我是否能够通过访问fptr\u query\u a
来检索核心a中的内存
fptr_recv = fptr_query_A
其中,fptr\u recv
是在核心a中声明的指针,其类型与fptr\u query\u a
我问这个问题是因为手册中不清楚例程MPI\u WIN\u ALLOCATE\u SHARED
,除了是通信shm的集合外,所有共享内存核是否必须具有相同的WIN和大小
请在回答时,我想我的一些困惑源于以下几点
1) 调用MPI\u WIN\u ALLOCATE\u SHARED
时,我是否将本地内存从调用处理器分配到共享环境,即共享通信组
1.a)如果是,则表示每个处理器声明其想要共享的内容,并从接收器(想要访问共享内存的处理器)的审查点,调用MPI\u WIN\u shared\u QUERY
,以了解处理器在内存中存储其可共享数据的位置
最后,如果后两点总体有效,我不确定我是否理解如何执行MPI\u WIN\u SHARED\u查询
调用
我的理解是MPI\u-WIN\u共享\u查询(WIN、rank、size、disp\u unit、baseptr)
即WIN
是我们想要检索数据的任何核心的窗口,大小和排名也是如此。
那么本质上,这是否意味着我总是需要传达胜利和规模,以便作出决定 与此同时,我自己也能回答这个问题,答案是 1) 调用MPI_WIN_ALLOCATE_SHARED时,我将本地内存从调用处理器分配到共享环境,即共享通信组 是,每个列组将分配一个单独的缓冲区,其大小由共享通信器组中的所有其他列组访问。即使rank不需要分配共享缓冲区,它也应该调用大小为零的函数 如果是,则意味着每个处理器声明它想要共享的内容,并从接收方(想要访问共享内存的处理器)的审查点,调用MPI_WIN_shared_查询,以了解处理器在内存中存储其可共享数据的位置 这就是我的理解 我的理解是MPI_WIN_SHARED_QUERY(WIN、rank、size、disp_unit、baseptr),WIN是我们想要检索数据的任何核心的窗口,大小和等级也是如此。那么本质上,这是否意味着我总是需要传达胜利和规模,以便作出决定 由于所有MPI列组都必须调用
MPI\u WIN\u ALLOCATE\u SHARED
,因此每个列组都有自己的MPI句柄WIN
。因此,您可以使用此句柄调用MPI\u WIN\u SHARED\u QUERY
,以获取指向由MPI秩秩分配的共享缓冲区的指针。此函数还查询列组共享内存的大小