0

对于以下代码(这不是整个程序;它只是一个代码片段),我不知道我应该如何设置位移数组以使用 MPI_Gatherv。因为 getBrdy 的结果对于每个等级都是可变的;我必须使用MPI_Gatherv. 当我搜索时,我不确定当我将消息作为结构向量发送时,人们用于类似类型的相同方式是否仍然正确intstring

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];
 };
4

0 回答 0