并行的 fold
原文:Folding in Parallel 作者:Oleg Kiselyov 本文描述了一种有趣的方法,用 map 和幺半群 reduce 来表述顺序执行的 fold。这样一来,某些看似有顺序的算法不仅可以并行运行,甚至还拥有美妙的并行性质:我们可以将输入序列任意分割给工作单元(如有必要,甚至可以递归地分割出子部分),并让工作单元并行运行——没有竞态条件、数据依赖,甚至不会有内存 bank 冲突。这种美妙的并行性质是多核、GPU 或分布式计算的理想选择。 这种方法的内在原理早已人尽皆知,但同样众所周知的是:将原理应用到具体案例需要独创性。 导言:fold vs. 幺半群 reduce Guy Style 在二〇〇九年的 ICFP 会议上发表了一篇题为 «foldl and foldr considered slightly harmful» 的主题演讲1。在演讲中,他提倡用 (map)reduce 取代 fold。 回想一下,序列上的 fold 本质上是一种带状态的按顺序累加;为具体起见,我们在列表上定义 fold_left : ('z -> 'a -> 'z) -> 'z -> 'a list -> 'z fold_right : ('a -> 'z -> 'z) -> 'a list -> 'z -> 'z 有一说一,现在我们有两种 fold:左 fold 与右 fold。下面的例子应该可以清楚地看出它们对应的语义...