假设您有一个二元加法树,其中每两个节点被加在一起,直到根是所有节点的总和。例如:
3 2 1 3
\ / \ /
5 4
\ /
9
最小化此树的深度很简单:例如,我可以在其上运行DSW。我能做到这一点的原因是因为加法运算符是可交换的。
现在如果每个节点有不同的操作会发生什么? *,/,+或 - ?如何找到该计算树的最佳最小深度?示例树如下所示:
3 * 2 1 - 3
\ / \ /
6 / -2
\ /
-3
到目前为止,我想到的是检查每个子树是否仅包含可交换操作,然后我可以在该特定子树中移动节点。但是,这是一个非常粗糙的一阶启发式算法。
是否有详细说明我们如何以可以减少计算图深度的方式重构方程的工作?这将允许更多并行化计算此树所需的代码。 / p>
动机:在我的具体案例中,我实际上并不是为软件做这件事。我正在构建自定义硬件来评估算术计算。因此,我的一个优化目标是减少硬件树深度,以便减少管道计算的延迟。