我想在我的程序中使用散列数组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);
答案 0 :(得分:0)
你需要分配(子)数组,以便数据在连续的内存中(例如,如果你在循环中malloc
,数据布局不适合MPI)。
您可以发布alloc_2d_init()
功能,以便我们从那里看一下建议吗?