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