MPI派生的数据类型。使用MPI(C)发送结构数组的行

时间:2016-07-30 10:50:26

标签: arrays struct parallel-processing mpi derived-types

我有一个使用MPI派生数据类型的MPI程序。 我有一个结构:

typedef struct Cars {
float x;
float y;
float z;
float maxDist;
int type; //Nq or Nc
int bx;
int by;
int bz;
int process;
} car;

并创建MPI数据类型:

   MPI_Type_create_struct(items,blocklengths,offsets,car,&car_type);


   MPI_Datatype   types[9]={ MPI_FLOAT,MPI_FLOAT,MPI_FLOAT,MPI_FLOAT,MPI_INT,
   MPI_INT,MPI_INT,MPI_INT,MPI_INT};
   MPI_Datatype   mpi_point_type;
   MPI_Aint       offsets[9];

   offsets[0]=offsetof(point,x);
   offsets[1]=offsetof(point,y);
   offsets[2]=offsetof(point,z);
   offsets[3]=offsetof(point,maxDist);
   offsets[4]=offsetof(point,type);
   offsets[5]=offsetof(point,bx);
   offsets[6]=offsetof(point,by);
   offsets[7]=offsetof(point,bz);
   offsets[8]=offsetof(point,process);
              MPI_Type_create_struct(items,blocklengths,offsets,types,&mpi_point_type);


     MPI_Type_commit(&car_type);


     MPI_Datatype rowtype;
     MPI_Type_contiguous(column,car_type,&rowtype);
     MPI_Type_commit(&rowtype);


                MPI_Type_create_struct(items,blocklengths,offsets,types,&car_type);
     MPI_Type_commit(&car_type);

我有

类型的数组
   car *recvBuf=malloc(sizeof *recvBuf *(column+4));  
   car *forSent=malloc(sizeof *forSent * row * column); // 2d array                              //stored in 1d (points sent between processes)



  for(j=0;j<numTasks;j++){

  if(j!=rank){
   MPI_Isend(&forSent[j*column],1,rowtype,j,0,MPI_COMM_WORLD,&req[2]);

[j*column]指的是应该指向要发送的地址的第j个进程。每行指的是不同的过程 例如:第一个流程发送到第二个流程点&forSent[1*column]

             MPI_Irecv(recvBuf,1,rowtype,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&req[3]);  

   if(rank==0){
   for(i=0;i<1000;i++){
   printf("RECEIVED %d \n",recvBuf[i].bz);}
   }
   }

  }
  }

其中“bz”是汽车类型结构的成员,它在程序的函数中初始化,并且测试是以正确的方式初始化的。 但是在接收部分我得到了垃圾。当我用MPI_INT争论而不是(car_type)做同样的事情时,我的结果很好。 嵌套类型在发送时是否有错误? 怎么回事?

0 个答案:

没有答案