我正在尝试采用我的代码来利用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
例如
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
是我们想要检索数据的任何核心的窗口,大小和等级也是如此。
因此,从本质上讲,这意味着我总是需要传达获胜和参赛人数才能打出电话吗?
答案 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
分配的共享缓冲区的指针。此函数还查询等级的共享内存的大小。