问题使用2个数组的分散

时间:2013-11-15 17:02:27

标签: c++ mpi

我想在我的程序中使用散列数组a,b。但是当我运行时这会有问题。

int main(int argc, char *argv[]) {
int n,subarrsize,rank,p,nproc,j,i,sizearr=16;
int **A,**B,**C,**SA,**SB;


MPI::Init(argc, argv);
nproc = MPI::COMM_WORLD.Get_size();
rank = MPI::COMM_WORLD.Get_rank();

sizearr=atoi(argv[1]);
if(sizearr%nproc!=0)
{
        MPI::COMM_WORLD.Abort(1);
}

subarrsize=sizearr/(int)nproc;
SA=alloc_2d_init(subarrsize,sizearr);
SB=alloc_2d_init(subarrsize,sizearr);

if(rank==0)
{
    A=alloc_2d_init(sizearr,sizearr);
    B=alloc_2d_init(sizearr,sizearr);
    C=alloc_2d_init(sizearr,sizearr);

    for (i = 0; i < sizearr; ++i) {
        for (j = 0; j < sizearr; ++j) {
            A[i][j]=rand()%100;
            B[i][j]=rand()%100;
        }
    }
    }
   MPI::COMM_WORLD.Scatter(&(A[0][0]),subarrsize*sizearr,MPI_INT,&(SA[0]
     [0]),subarrsize*sizearr,MPI_INT,0);
MPI::COMM_WORLD.Scatter(&(B[0][0]),subarrsize*sizearr,MPI_INT,&(SB[0]
     [0]),subarrsize*sizearr,MPI_INT,0);
    for(int p=0;p<nproc;++p)
{
    if(rank==p)
    {
        cout<<"\n"<<"RANK: "<<rank<<"\n";
        cout<<"A:\n";
        for(i=0;i<subarrsize;++i)
            {
                for(j=0;j<sizearr;++j)
                        cout<<SA[i][j]<<"\t";
                cout<<"\n";
            }
                   cout<<"B:\n";
            for(i=0;i<subarrsize;++i)
            {
                    for(j=0;j<sizearr;++j)
                        cout<<SB[i][j]<<"\t";
                    cout<<"\n";
            }
    }
    MPI::COMM_WORLD.Barrier();
}
   if(rank==0)
{
    free2d(&SA);
    free2d(&A);
}
MPI::Finalize();
return 0;
}

更新:

我发现proble.scatter函数得到第一个参数,它是指向数组的指针A,B和我只是在进程0中定义这些指针,所以其他进程没有得到指针。 我改变了我的代码:

int *Aptr,*Bptr;
if(rank==0)
{
  A=alloc_2d_init(sizearr,sizearr);
  B=alloc_2d_init(sizearr,sizearr);
  Aptr=&(A[0][0]);
  Bptr=&(B[0[0]);
  .
  .
}
 else
{
    Aptr=NULL;
    Bptr=NULL;
}
MPI::COMM_WORLD.Scatter(Aptr,subarrsize*sizearr,MPI_INT,&(SA[0]
    [0]),subarrsize*sizearr,MPI_INT,0);
MPI::COMM_WORLD.Scatter(Bptr,subarrsize*sizearr,MPI_INT,&(SB[0]
    [0]),subarrsize*sizearr,MPI_INT,0);

1 个答案:

答案 0 :(得分:0)

你需要分配(子)数组,以便数据在连续的内存中(例如,如果你在循环中malloc,数据布局不适合MPI)。

您可以发布alloc_2d_init()功能,以便我们从那里看一下建议吗?