MPI 共享 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则反之亦然

假设我知道在核心 B 中将我的指针指向一个数组fptrb

fptrb = GIVEN_ARRAY_OF_SIZEB

然后我是否能够通过访问 CORE a 中的内存fptr_query_A

例如
fptr_recv = fptr_query_A

其中fptr_recv是在核心 A 中声明的指针,与fptr_query_A相同 KIND

我之所以问这个问题,是因为手册中不清楚例程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是我们想要检索数据的任何核心的窗口,大小和等级也是如此。 所以从本质上讲,这是否意味着我总是需要传达胜利和规模才能做出这个决定?

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

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

是的,每个等级将分配一个具有相应大小的单独缓冲区,共享通信者组中的所有其他等级都可以访问该缓冲区。即使 rank 不需要分配共享缓冲区,它也应以零大小调用函数。

如果是,则意味着每个处理器声明它想要共享的内容,并且从接收者(想要访问共享内存的处理器)的审查点,它调用MPI_WIN_SHARED_QUERY以了解处理器在内存中的哪个位置存储了其可共享数据?

我就是这样理解的。

我的理解是MPI_WIN_SHARED_QUERY(win,rank,size,disp_unit,baseptr),win是我们想要检索数据的任何核心的窗口,大小和排名也是如此。所以从本质上讲,这是否意味着我总是需要传达胜利和规模才能做出这个决定?

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

最新更新