我正在尝试采用我的代码来利用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
。此函数还查询排名共享内存的大小。