在Fortran中具有不同窗口大小的MPI共享内存

时间:2019-04-02 16:42:48

标签: fortran mpi shared-memory

我正在尝试采用我的代码来利用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是在内核A中声明的与fptr_query_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是我们想要检索数据的任何核心的窗口,大小和等级也是如此。 因此,从本质上讲,这意味着我总是需要传达获胜和参赛人数才能打出电话吗?

1 个答案:

答案 0 :(得分:2)

与此同时,我自己也可以回答问题,答案是

  

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

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

  

如果是,则意味着每个处理器都声明了要共享的内容,并从接收者(要访问共享内存的处理器)的角度进行了声明,它调用MPI_WIN_SHARED_QUERY以了解处理器在内存中的位置存储了它的共享数据?

这就是我的理解。

  

我的理解是MPI_WIN_SHARED_QUERY(胜利,等级,大小,disp_unit,baseptr),胜利是我们要检索数据的任何核心的窗口,大小和等级也是如此。因此,从本质上讲,这意味着我总是需要传达获胜和参赛人数才能打出电话吗?

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