0

我已经为单个 Xeon Phi 节点(上面有 61 个内核)编写了我的代码。我有两个文件。在调用任何其他 mpi 调用之前,我已经调用了 MPI_Init(2)。我找到了 ntasks,排名也使用 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);

在文件 2 中:

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

        }
 }

然后我在这个rec​​vbuff的文件1中做一些计算。 我在使用 sharedRegion 变量时遇到了这个分段错误。

4

3 回答 3

1

MPI代表消息传递范式。这意味着,进程(等级)是隔离的,并且通常在分布式机器上运行。它们通过显式通信消息进行通信,最近的版本也允许单方面但仍显式的数据传输。您不能假设共享内存可用于进程。查看任何 MPI 教程以了解如何使用 MPI。

由于您没有指定您正在运行哪种机器,因此任何进一步的建议纯属推测。如果您实际上是在共享内存机器上,您可能希望使用真正的共享内存范例,例如 OpenMP。

于 2013-07-29T09:37:34.900 回答
0

虽然可以将 MPI 限制为仅使用一台机器并具有共享内存(请参阅 RMA 章节,尤其是在 MPI-3 中),但如果您只打算使用一台机器,则使用其他范例会更容易。

但是,如果您要使用多个节点并在一个节点上有多个等级(例如多核进程),那么可能值得一看 MPI-3 RMA 以了解它如何在本地帮助您共享内存和远程内存访问。关于这个主题有多篇论文,但是因为它们太新了,所以还没有很多好的教程。您必须四处挖掘才能找到对您有用的东西。

于 2013-07-29T12:51:30.673 回答
0

这两行的顺序:

shareRegion = (int*)gInit(MPI_COMM_WORLD, buffsize, ntasks);   /* gInit is in file 2 */
buffsize=atoi(argv[1]);

建议buffsize在调用 . 之前和之后可能有不同的值gInit。如果buffsize在调用时传递给程序的第一个参数大于其初始值gInit,则稍后将发生越界内存访问并导致分段错误。

mpirun提示:从调试器(例如 )内部将您的代码作为 MPI 单例(例如不带)运行gdb或更改限制,以便内核在错误时转储(例如带ulimit -c unlimited),然后使用调试器检查内核文件。在这种情况下,使用调试信息进行编译(例如添加-g到编译器选项)有很大帮助。

于 2013-07-29T16:39:53.637 回答