Mpi 使用由Xeon Phi上的open_shm创建的共享内存时出现分段错误

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

我已经为单个Xeon Phi节点(上面有61个内核)编写了代码。我有两个文件。在调用任何其他MPI调用之前,我已经调用了MPI_Init(2)。我发现了NTASK,排名也使用mpi调用。我还包括了所有必需的库。但我还是犯了一个错误。你能帮我解决这个问题吗

在文件1中:

 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++;

        }
 }