最近研究前缀子节点,稍微总结一下,以后继续补充:
本文参考Calvin Lin和Lawrence Snyder的,《Principles of Parallel Programming》(并行程序设计准则)。
与乞降严密关相的操纵是前缀乞降,在很多并行程序设计语言中也称为描扫(scan)。与乞降操纵一样,首先仍有n个值的序列,
但望希算计的是如下的序列,
其中,个每 yi 是输入前 i 个元素的和,即有,
以并行式方求解前缀和不如求累加和那样显明(累加和树形分层乞降,间时责负度为 logn),因为它须要序顺求解全部间中值。初看起来,似乎前缀乞降既没有优势,又不可能找到更好的解,但事实上前缀乞降能以并行的式方成完。
通过对成对乞降法方的视察,可以现发只要对该法方略加改修以可就算计前缀值。求解的思绪是,个每存储有 xi 的叶处理器可以算计值 yi ,只要它晓得在它左边全部元素的和,即他的前缀,在成对乞降的中程过,我们晓得全部子树的和,而如果能留保这些信息,能就定确这些前缀而无需直接对它们乞降。为做到这一点,我们从根开始,它的前缀(即在序列元素之前的全部元素和)是0。这也是它的左子树的前缀,而它的左子树的总和则是它的右子树的前缀。纳归地应用这一思绪,我们可以到得如下规矩:
- 首先,从下往上,一层层的并行,算计出总和
- 结束后,设想根从它的父节点(现实不存在)处收接一个 0 。
- 全部的非叶子节点,从它的父节点处收接一个值,将该值转发给它们的左子节点,并将父节点值与它们的左子节点值(这些值在向上成对乞降时已到得)的和发送给右子节点;这些值也是其子节点的前缀。
- 叶子节点将来自面上的前缀值与它所存保的输入值相加。
图:前缀和的算计。其中,黄色节点是沿树向上描扫,用成对乞降算法算计到得的值;浅绿色节点是前缀,沿树向下描扫,用以下简略规矩到得:将来自父节点的值送往左子节点,而将来自左子节点的和(上传而来)与来自父节点的值两者相加,并将结果送往右子节点
沿树向下动移的值是子节点的前缀(参见图,其中向下动移的值是浅绿色方框表现)。
这类算计称为并行前缀算计。它在树中停止一次向上和向下描扫,但描扫中处于每一层上的全部操纵可以同时成完。因此,在个每节点上最多只须要停止两次加法,一次向上和一次向下,加上由路的逻辑操纵。由上可见,并行前缀乞降拥有对数的间时复杂性。很多类似的序顺操纵在这方面要差于并行前缀法方。
序顺和并行算法的基本别差在于造构并行算法时须要转变算计的序次。
文章结束给大家分享下程序员的一些笑话语录:
雅虎最擅长的不是开通新业务,是关闭旧业务。