MPI:如何正确使用MPI_Win_allocate_shared

MPI:如何正确使用MPI_Win_allocate_shared,mpi,mpi-rma,Mpi,Mpi Rma,我希望在进程之间使用共享内存。我尝试了MPI_Win_allocate_shared,但在执行程序时出现了一个奇怪的错误: 在文件/src/mpid/ch3/include/mpid\u rma\u shm.h第592行的断言失败:local\u target\u rank>=0 内部中止 以下是我的消息来源: #包括 #包括 #包括 #包括“mpi.h” intmain(intargc,char*argv[]); 无效pt(int t[],int s); int main(int argc,c

我希望在进程之间使用共享内存。我尝试了MPI_Win_allocate_shared,但在执行程序时出现了一个奇怪的错误:

在文件
/src/mpid/ch3/include/mpid\u rma\u shm.h
第592行的断言失败:
local\u target\u rank>=0
内部中止

以下是我的消息来源:

#包括
#包括
#包括
#包括“mpi.h”
intmain(intargc,char*argv[]);
无效pt(int t[],int s);
int main(int argc,char*argv[])
{
整数秩,大小,共享元素=0,i;
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
MPI_Win Win;
int*共享;
如果(秩==0)共享元素=大小;
MPI_Win_allocate_shared(共享元素*sizeof(int)、sizeof(int)、MPI_INFO_NULL、MPI_COMM_WORLD、&shared、&Win);
如果(秩==0)
{
MPI_Win_lock(MPI_lock_EXCLUSIVE,0,MPI_MODE_NOCHECK,Win);
对于(i=0;i
我得到以下结果:

processus 0 (avant): -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 0 (apres): 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 4 (avant): 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 
processus 4 (apres): 0 -1 -1 -1 4 -1 -1 -1 -1 -1 
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0
internal ABORT - process 5
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0
internal ABORT - process 6
Assertion failed in file ./src/mpid/ch3/include/mpid_rma_shm.h at line 592: local_target_rank >= 0
internal ABORT - process 9

有人能帮我找出哪里出了问题&这个错误意味着什么?非常感谢。

MPI\u Win\u allocate\u shared
背离了MPI的抽象本质。它公开了底层的内存组织,并允许程序绕过昂贵(且经常令人困惑)的MPI RMA操作,并直接在具有此功能的系统上使用共享内存。虽然MPI通常处理列组不共享物理内存地址空间的环境,但如今典型的HPC系统由许多互连节点组成。因此,在同一节点上执行的列组可以连接到共享内存段,并通过共享数据而不是消息传递进行通信

MPI提供通信器拆分操作,允许创建列组的子组,以便每个子组中的列组能够共享内存:

MPI_Comm_split_type(comm, MPI_COMM_TYPE_SHARED, key, info, &newcomm);
在一个典型的集群上,这本质上是根据它们在其上执行的节点对列组进行分组。分割完成后,可以在每个
newcomm
中的列组上执行共享内存窗口分配。请注意,对于多节点群集作业,这将导致多个独立的
newcomm
通信程序,从而导致多个共享内存窗口。一个节点上的列组不能(也不应该)看到其他节点上的共享内存窗口


在这方面,
MPI\u Win\u allocate\u shared
是一个独立于平台的包装器,围绕操作系统特定的共享内存分配机制。

此代码和使用方法存在一些问题。其中一些在@hristoliev的回答中提到

  • 必须在同一节点中运行所有进程,才能使用内部节点通信器或使用“通信器拆分共享”
  • 您需要使用至少10个进程运行此代码
  • 第三,
    local
    应该处理
    free()
  • 您应该从查询中获取
    shared
    指针
  • 您应该取消分配
    shared
    (我认为这是由
    Win\u free
    负责的)
  • 这是生成的代码:

    #包括
    #包括
    #包括
    #包括“mpi.h”
    intmain(intargc,char*argv[]);
    无效pt(int t[],int s);
    int main(int argc,char*argv[])
    {
    整数秩,大小,共享元素=0,i;
    MPI_Init(&argc,&argv);
    MPI通信等级(MPI通信世界和等级);
    MPI_通信大小(MPI_通信世界和大小);
    MPI_Win Win;
    int*共享;
    //如果(秩==0)共享元素=大小;
    //MPI_Win_allocate_shared(共享元素*sizeof(int)、sizeof(int)、MPI_INFO_NULL、MPI_COMM_WORLD、&shared、&Win);
    如果(秩==0)
    {
    MPI\u Win\u allocate\u shared(大小、大小(int)、MPI\u信息\u NULL、,
    MPI_COMM_WORLD、共享和赢取);
    }
    其他的
    {
    内部显示单元;
    MPI_______;s ize;
    MPI_Win_allocate_shared(0,sizeof(int),MPI_INFO_NULL,
    MPI_COMM_WORLD、共享和赢取);
    MPI\u Win\u共享\u查询(Win、0、&ssize、&disp\u单元、&shared);
    }
    如果(秩==0)
    {
    MPI_Win_lock(MPI_lock_EXCLUSIVE,0,MPI_MODE_NOCHECK,Win);
    对于(i=0;i