Mpi 使用由Xeon Phi上的open_shm创建的共享内存时出现分段错误
我已经为单个Xeon Phi节点(上面有61个内核)编写了代码。我有两个文件。在调用任何其他MPI调用之前,我已经调用了MPI_Init(2)。我发现了NTASK,排名也使用mpi调用。我还包括了所有必需的库。但我还是犯了一个错误。你能帮我解决这个问题吗 在文件1中:Mpi 使用由Xeon Phi上的open_shm创建的共享内存时出现分段错误,mpi,shared-memory,xeon-phi,Mpi,Shared Memory,Xeon Phi,我已经为单个Xeon Phi节点(上面有61个内核)编写了代码。我有两个文件。在调用任何其他MPI调用之前,我已经调用了MPI_Init(2)。我发现了NTASK,排名也使用mpi调用。我还包括了所有必需的库。但我还是犯了一个错误。你能帮我解决这个问题吗 在文件1中: int buffsize; int *sendbuff,**recvbuff,buffsum; int *shareRegion; shareRegion = (int*)gInit(MPI_COMM_WORL
int buffsize;
int *sendbuff,**recvbuff,buffsum;
int *shareRegion;
shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks); /* gInit is in file 2 */
buffsize=atoi(argv[1]);
sendbuff=(int *)malloc(sizeof(int)*buffsize);
if( taskid == 0 ){
recvbuff=(int **)malloc(sizeof(int *)*ntasks);
recvbuff[0]=(int *)malloc(sizeof(int)*ntasks*buffsize);
for(i=1;i<ntasks;i++)recvbuff[i]=recvbuff[i-1]+buffsize;
}
else{
recvbuff=(int **)malloc(sizeof(int *)*1);
recvbuff[0]=(int *)malloc(sizeof(int)*1);
}
for(i=0;i<buffsize;i++){
sendbuff[i]=1;
MPI_Barrier(MPI_COMM_WORLD);
call(sendbuff, buffsize, shareRegion, recvbuff[0],buffsize,taskid,ntasks);
int-buffsize;
int*sendbuff,**recvbuff,buffsum;
int*共享区域;
shareRegion=(int*)gInit(MPI_COMM_WORLD、buffsize、ntasks);/*它在文件2中*/
buffsize=atoi(argv[1]);
sendbuff=(int*)malloc(sizeof(int)*buffsize);
如果(taskid==0){
recvbuff=(int**)malloc(sizeof(int*)*ntasks);
recvbuff[0]=(int*)malloc(sizeof(int)*ntasks*buffsize);
for(i=1;iMPI表示消息传递范式。也就是说,进程(秩)是隔离的,通常在分布式计算机上运行。它们通过显式通信消息进行通信,最新版本也允许单向但仍然显式的数据传输。您不能假设共享内存可用于进程。请参阅任何MPI教程,了解MPI的使用方法
由于您没有指定要在哪种机器上运行,因此任何进一步的建议都纯粹是推测性的。如果您实际在共享内存机器上,则可能需要使用真正的共享内存范例,例如OpenMP。,同时可以限制MPI仅使用一台机器并具有共享内存(参见RMA一章,特别是在MPI-3中),如果您只打算使用一台机器,那么使用其他范例就更容易了
但是,如果要使用多个节点,并且在一个节点上有多个列组(例如多核心流程),那么也许有必要看看MPI-3 RMA,看看它如何帮助您实现本地共享内存和远程内存访问。关于这一主题的论文有很多,但由于它们都是新的,所以还没有很多好的教程。您必须仔细研究一下,才能找到对您有用的东西。这两篇文章的顺序是什么线路:
shareRegion=(int*)gInit(MPI_COMM_WORLD,buffsize,ntasks);/*gInit在文件2中*/
buffsize=atoi(argv[1]);
建议在调用gInit
之前和之后,buffsize
可能具有不同的值。如果在调用gInit
时,在程序的第一个参数中传递的buffsize
大于其初始值,则稍后将发生越界内存访问,并导致分段错误。
提示:从调试器内部(例如gdb
)以MPI单例运行代码(例如,不使用mpirun
),或者更改限制,以便在出现错误时转储内核(例如,使用ulimit-c unlimited
),然后使用调试器检查内核文件。使用调试信息编译(例如,在编译器选项中添加-g
)在这种情况下会有很大帮助
void* gInit( MPI_Comm comm, int size, int num_proc)
{
int share_mem = shm_open("share_region", O_CREAT|O_RDWR,0666 );
if( share_mem == -1)
return NULL;
int rank;
MPI_Comm_rank(comm,&rank);
if( ftruncate( share_mem, sizeof(int)*size*num_proc) == -1 )
return NULL;
int* shared = mmap(NULL, sizeof(int)*size*num_proc, PROT_WRITE | PROT_READ, MAP_SHARED, share_mem, 0);
if(shared == (void*)-1)
printf("error in mem allocation (mmap)\n");
*(shared+(rank)) = 0
MPI_Barrier(MPI_COMM_WORLD);
return shared;
}
void call(int *sendbuff, int sendcount, volatile int *sharedRegion, int **recvbuff, int recvcount, int rank, int size)
{
int i=0;
int k,j;
j=rank*sendcount;
for(i=0;i<sendcount;i++)
{
sharedRegion[j] = sendbuff[i];
j++;
}
if( rank == 0)
for(k=0;k<size;k++)
for(i=0;i<sendcount;i++)
{
j=0;
recvbuff[k][i] = sharedRegion[j];
j++;
}
}