我有一个使用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)做同样的事情时,我的结果很好。 嵌套类型在发送时是否有错误? 怎么回事?