“并行和并发编程”中的这张图:http ://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity起初似乎表明火花过多会产生严重的开销。但是,如果您仔细查看 y 轴,您会注意到它已被放大到有趣的部分。事实上,显示的最佳和最差情况性能之间的比率约为 80%,这还不算太差。
一般来说,弄清楚如何分块以及分块的数量是困难的、容易出错的、极其特定于应用程序的,并且明年当你购买一台具有更强处理能力的新计算机时可能会发生变化。我更愿意始终将 rpar 与最细粒度的项目一起使用,并承受 25% 的开销。
引发火花的开销通常会产生比此图中显示的更糟糕的成本吗?(特别是如果我总是折叠二叉树而不是列表,所以关于“顺序工作量”的第二个要点不适用)
针对唐斯图尔特的回答更新了问题:
火花池是否只包含一个所有处理器都难以访问的队列?还是有很多?
例如,如果我有一台具有无限处理器和二叉树的计算机,并且我想对所有叶子求和,如下所示:
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(#leaves) 时间内运行吗?还是 O(深度)时间?有没有更好的方法来写这个?
如果我抽象太多而无法获得满意的答案,请告诉我。我对 haskell 并行性如何工作的心智模型仍然非常模糊。