我在每个处理器(Quadtree)上都有一个树形结构,并使用以下函数遍历这些树:
void treeWalk(TreeNode *t){
if(t != NULL){
for(int i=0; i<4; i++){
treeWalk(t->child[i]);
}
// Start operation on *t
if (isSpecificNode(t) == TRUE){
// Do stuff
}
// End operation on *t
}
}
每个处理器上的树结构都不一样。如果我到达树中的某个节点(每个处理器都有,例如节点号x),我想使用MPI_Allreduce()
来总结节点的值并发送结果(所有节点的总和)对于所有其他处理器,他们可以像t->nodeValue = sumOfAllNodes;
一样保存此操作的结果。如果我执行以下操作则不起作用:
void treeWalk(TreeNode *t){
if(t != NULL){
for(int i=0; i<4; i++){
treeWalk(t->child[i]);
}
// Start operation on *t
if (isSpecificNode(t) == TRUE){
double thisNodeValue = t->nodeValue;
double sumOfAllNodes = 0;
MPI_Allreduce(&thisNodeValue, &sumOfAllNodes, 1,
MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
t->nodeValue = sumOfAllNodes;
}
// End operation on *t
}
}
在这种情况下,在调用MPI_Allreduce
后,t->nodeValue
的值不是所需的结果。如何在递归函数中使用MPI_Allreduce()
?我可以使用MPI_Barrier()
或MPI_Wait()
等其他功能来完成工作吗?
编辑:让我的问题更清楚:
让我们假设我有两棵只有两个节点的树。左侧树位于处理器1上,右侧位于处理器2上。两个处理器都执行递归树步行。如果处理器到达左侧节点(通常不会同时发生),则会调用MPI_Allreduce()
并计算1+0 = 1
。在此操作之后,对于右节点,每个处理器左侧的两个节点应该等于1或0+2=2
。