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

A2L*_*LBK 5 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/))
Run Code Online (Sandbox Code Playgroud)

对于核心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/))
Run Code Online (Sandbox Code Playgroud)

现在,假设我事后分别通过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/))
Run Code Online (Sandbox Code Playgroud)

反之亦然,核心B

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

  fptrb = GIVEN_ARRAY_OF_SIZEB
Run Code Online (Sandbox Code Playgroud)

然后,我能否通过访问fptr_query_A例如在CORE中检索内存

   fptr_recv = fptr_query_A
Run Code Online (Sandbox Code Playgroud)

fptr_recv与相同KIND的内核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是我们想要检索数据的任何核心的窗口,大小和等级也是如此。因此,从本质上讲,这意味着我总是需要传达获胜和参赛人数才能打出电话吗?