【发布时间】:2013-12-12 14:36:11
【问题描述】:
我有以下 MPI_DataType 代码
typedef struct resultset {
int rank, totalProcessed, bracket1, bracket2, bracket3, bracket4;
float bracket1percent, bracket2percent, bracket3percent, bracket4percent;
} resultset;
MPI_Datatype createResultType()
{
// Set-up the arguments for the type constructor
MPI_Datatype new_type;
int count = 2;
int blocklens[] = { 6, 4 };
MPI_Aint indices[2];
indices[0] = 0;
MPI_Type_extent( MPI_FLOAT, &indices[1] );
indices[1] *= 4; // There are 4 float
MPI_Datatype old_types[] = { MPI_INT, MPI_FLOAT };
// Call the data type constructor
MPI_Type_struct(count, blocklens, indices, old_types, &new_type);
MPI_Type_commit(&new_type);
return new_type;
}
我正在尝试使用以下代码从其他进程接收数据。 rank 是一个整数,用于定义进程的等级。
MPI_Datatype resType = createResultType();
if(rank != 0){
MPI_Gather(&results, sizeof(resultset), resType, NULL, 1, resType, 0, MPI_COMM_WORLD);
}
else {
resultset* all_results = new resultset[numProcs];
MPI_Gather(&results, sizeof(resultset), resType, all_results, sizeof(resultset), resType, 0, MPI_COMM_WORLD);
}
问题是我无法使用这种方法循环遍历 all_results:
for(int i = 0; i < numProcs; ++i){
std::cout << all_results[i].rank << " processed " << all_results[i].totalProcessed <<std::endl;
}
我认为问题出在我的数据类型上,但我不确定。任何建议将不胜感激。
编辑:我遇到了循环遍历它的问题,现在我得到的数据不完整。我在收集函数中将sizeof(resultset) 更改为1。现在我收到了正确的数据,除了最后 2 个浮点数是 -431602080 而不是应该的 0.0022234327654。
MPI_Datatype resType = createResultType();
if(rank != 0){
MPI_Gather(&results, 1, resType, NULL, 1, resType, 0, MPI_COMM_WORLD);
}
else {
resultset* all_results = new resultset[numProcs];
MPI_Gather(&results, 1, resType, all_results, 1, resType, 0, MPI_COMM_WORLD);
}
【问题讨论】:
标签: c++ parallel-processing mpi