Fortran 中具有不同 window 大小的 MPI 共享内存

MPI shared memory with different window sizes in Fortran

我正在尝试采用我的代码来利用 MPI 共享内存。

为了尽可能简单,假设我只有两个内核。 核心 A 需要来自核心 b 的 size_b 数组,核心 b 需要来自核心 a size_a 的数组

在核心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, (/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_SEND/RECV win_a 和 win_b 与核心 B 和核心 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 反之亦然

假设我知道在 Core B 中将我的指针 fptrb 指向一个数组,即

  fptrb = GIVEN_ARRAY_OF_SIZEB

然后我是否可以通过访问 fptr_query_A 来检索 CORE a 中的内存,例如

   fptr_recv = fptr_query_A

其中 fptr_recv 是在与 fptr_query_A

相同种类的核心 A 中声明的指针

我问这个是因为手册中不清楚例程 MPI_WIN_ALLOCATE_SHARED 除了是 comm_shm 的集体之外是否必须对所有共享内存核心具有相同的赢和大小

请在回答时,我认为我的一些困惑源于以下内容

1) 调用 MPI_WIN_ALLOCATE_SHARED 时,我是否将本地内存从调用处理器分配给共享环境,即共享通信组。

1.a) 如果是,则意味着每个处理器都声明了它想要共享的内容,并且从接收方(想要访问共享内存的处理器)的审查点,它调用了 MPI_WIN_SHARED_QUERY 知道处理器在内存中的什么地方存储了它的可共享数据?

最后,如果后两点总体上有效,我不确定我是否理解如何进行 MPI_WIN_SHARED_QUERY 调用。

我的理解是 MPI_WIN_SHARED_QUERY( win, rank, size,disp_unit, baseptr) win 是我们想要检索数据的任何核心的 window,对于大小和等级也是如此。 那么从本质上讲,这是否意味着我总是需要传达胜利和大小才能做出决定?

同时我自己能够回答这个问题,答案是

1) When calling MPI_WIN_ALLOCATE_SHARED am I allocating a local memory from the calling processor to the shared environment i.e. the shared communication group.

是的,每个 Rank 将分配一个单独的缓冲区,该缓冲区具有各自的大小,供共享通信器组中的所有其他 Rank 访问。即使 rank 不需要分配共享缓冲区,它也应该调用零大小的函数。

If yes, It then means that each processor declares what it wants to share and from the receiver's (the processor that wants to access shared memory) point of review, it make a call to MPI_WIN_SHARED_QUERY to know where in memory a processor has stored its shareable data?

我是这么理解的

My understanding is MPI_WIN_SHARED_QUERY( win, rank, size,disp_unit, baseptr) that win is the window of whatever core we want to retrieve the data, similarly for the size and rank. So essentially does that mean I always need to communicate the win and size in order to make that call?

由于所有 MPI 等级都必须调用 MPI_WIN_ALLOCATE_SHARED,每个等级都将有自己的 MPI 句柄 win。因此,您使用此句柄调用 MPI_WIN_SHARED_QUERY 以获得指向由 MPI 等级 rank 分配的共享缓冲区的指针。此函数还查询列的共享内存的大小。