MPI_Allreduce()在递归树遍历中

时间:2017-07-27 15:50:24

标签: recursion mpi

我在每个处理器(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

enter image description here

0 个答案:

没有答案