在《并行与并发编程》一书中的这张图片:http://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity,起初似乎表明触发过多会带来严重的开销。但如果你仔细看纵轴,你会注意到它已经放大到感兴趣的部分。实际上,所示最好和最坏情况性能之间的比率约为80%,这并不算太糟糕。
总体而言,确定如何以及以多大的块是困难的,容易出错,极度依赖应用程序,并且可能会在明年购买具有更多处理能力的新计算机时发生变化。我更喜欢始终使用最精细的元素和rpar,并接受25%的开销。
触发的开销是否可能比此图显示的要高得多?(特别是如果我总是在二叉树上执行fold而不是列表,因此第二个项目“顺序工作量”的数量就不适用)
针对Don Stewart回答的问题更新:
闪电池是否只包含一个队列,所有处理器都难以访问?还是有很多个?
例如,如果我拥有一台带有无限处理器的计算机和一个二叉树,并且我想对所有叶子进行求和,如:
data Node = Leaf Int | Branch Node Node
sumL (Leaf x) = x
sumL (Branch n1 n2) = let (x,y) = (sumL n1, sumL n2) in (x `par` y) `seq` (x + y)
这个程序能在O(#叶子节点数量)的时间内运行吗?还是在 O(深度)的时间内运行? 有没有更好的编写方式?
如果我为了得到令人满意的答案而过于抽象,请让我知道。 我对 Haskell 并行性的心理模型仍然非常模糊。