MPI:如何正确使用MPI_Win_allocate_shared
我希望在进程之间使用共享内存。我尝试了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
/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的回答中提到
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