对于以下代码(这不是整个程序;它只是一个代码片段),我不知道我应该如何设置位移数组以使用 MPI_Gatherv。因为 getBrdy 的结果对于每个等级都是可变的;我必须使用MPI_Gatherv
. 当我搜索时,我不确定当我将消息作为结构向量发送时,人们用于类似类型的相同方式是否仍然正确int
。string
MPI_Init(NULL,NULL);
int rank,size;
int totalLengthBuffer,localSize;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_rank(MPI_COMM_WORLD, &size);
int *receiveCount = new int[size];
int *disps = new int[size];
std::vector<struct Bdry> temp;
temp=this->getBdry(rank);
localSize=temp.size();
MPI_Allreduce(&localSize,&totalLengthBuffer,1,MPI_INT, MPI_SUM,MPI_COMM_WORLD);
std::vector<struct Bdry> buffer(totalLengthBuffer);
constexpr std::size_t num_members=3;
int lengths[num_members]={1,1,3};
MPI_Aint offsets[num_members]={
offsetof(struct Bdry,ID),offsetof(struct Bdry,Part), offsetof(struct Bdry,coord)
};
MPI_Datatype types[num_members]={MPI_INT,MPI_INT,MPI_DOUBLE};
MPI_Datatype type;
MPI_Type_create_struct(num_members,lengths,offsets,types,&type);
MPI_Type_commit(&type);
for(emInt i=0; i<nPart;i++){
receiveCount[i]= this->getBdry(i).size();
}
MPI_Gatherv(temp.data(), temp.size(), type,
&buffer, receiveCount, const int *displs,
type, 0,MPI_COMM_WORLD);
MPI_Type_free(&type);
MPI_Finalize();
我的结构是这种形式:
struct Bdry{
emInt ID;
emInt Part;
double coord[3];
};