Types MPI用户定义的数据类型,即I';我安全吗?

Types MPI用户定义的数据类型,即I';我安全吗?,types,mpi,user-defined,Types,Mpi,User Defined,第一次在一些简单的实践应用程序之外使用MPI,结果出现了一些问题 我有一个由以下成员定义的类(为了可读性和节省屏幕空间,省略了方法): 我希望通过发送每个粒子的一些关键成员的值,并当场复制其他成员,在进程之间发送粒子集。为此,我定义了一个MPI数据类型;如您所见,不包括成员\u lastUpdate、\u isStatic和\u isForeign: MPI_Datatype types[] = { MPI_FLOAT, MPI_FLOAT, MPI_FLOAT, MPI_FLOAT, MPI_

第一次在一些简单的实践应用程序之外使用MPI,结果出现了一些问题

我有一个由以下成员定义的类(为了可读性和节省屏幕空间,省略了方法):

我希望通过发送每个粒子的一些关键成员的值,并当场复制其他成员,在进程之间发送粒子集。为此,我定义了一个MPI数据类型;如您所见,不包括成员\u lastUpdate、\u isStatic和\u isForeign:

MPI_Datatype types[] = { MPI_FLOAT, MPI_FLOAT, MPI_FLOAT, MPI_FLOAT, MPI_INTEGER, MPI_FLOAT };
std::vector<int> len(6, 1);
std::vector<MPI_Aint> disp(6, 0);
particle temp;
MPI_Aint base;
MPI_Address(&temp, &base);
MPI_Address(&temp._x, &disp[0]);
MPI_Address(&temp._y, &disp[1]);
MPI_Address(&temp._xvel, &disp[2]);
MPI_Address(&temp._yvel, &disp[3]);
MPI_Address(&temp._isStaticInt, &disp[4]);
MPI_Address(&temp._size, &disp[5]);
for (int i=0; i<6; ++i)
{
    disp[i] = disp[i] - base;
}
MPI_Type_struct(6, &len[0], &disp[0], types, &_particleType);
MPI_Type_commit(&_particleType);
MPI_数据类型[]={MPI_浮点、MPI_浮点、MPI_浮点、MPI_浮点、MPI_整数、MPI_浮点};
std::向量len(6,1);
std::向量disp(6,0);
粒子温度;
MPI_Aint基地;
MPI_地址(&temp,&base);
MPI_地址(&temp._x,&disp[0]);
MPI地址(&temp.\y,&disp[1]);
MPI地址(&温度等级,&显示[2]);
MPI地址(&temp.&yvel,&disp[3]);
MPI地址(&temp.&isStaticInt,&disp[4]);
MPI地址(&温度大小,&显示[5]);

对于(int i=0;i没关系,似乎简单地输入问题就让我意识到了问题所在

接收命令应为:

MPI_Recv(parts[0], 1, _recvType, ngb, 0, _cartesian_comm, &status);
std::vector<int> len(size, 1);
std::vector<MPI_Aint> disp(size, 0);
MPI_Aint base;
MPI_Address(parts[0], &base);                   // datatype begins at the first selected object
for (int select = 1; select < size; ++select)
{
    MPI_Address(parts[select], &disp[select]);
    disp[select] = disp[select] - base;
}
MPI_Type_hindexed(size, &len[0], &disp[0], _particleType, &_sendType);
MPI_Type_commit(&_sendType);

MPI_Request payload_req;
MPI_Isend(parts[0], 1, _sendType, ngb, 0, _cartesian_comm, &payload_req);
std::vector<int> len(size, 1);
std::vector<MPI_Aint> disp(size, 0);
MPI_Aint base;
MPI_Address(parts[0], &base);                       // datatype begins at the first newly inserted object
for (int part = 1; part < size; ++part)
{
    MPI_Address(parts[part], &disp[part]);
    disp[part] = disp[part] - base;
}
MPI_Type_hindexed(size, &len[0], &disp[0], _particleType, &_recvType);
MPI_Type_commit(&_recvType);
MPI_Status status;
MPI_Recv(parts[0], size, _particleType, ngb, 0, _cartesian_comm, &status);
MPI_Recv(parts[0], 1, _recvType, ngb, 0, _cartesian_comm, &status);