如何确定在Haskell中使用parBuffer时要使用的大小缓冲区

时间:2015-07-26 15:03:39

标签: haskell parallel-processing

parBuffer的{​​{3}}说

  

parBuffer :: Int -> Strategy a -> Strategy [a]
  与evalBuffer类似,但在将列表元素推入缓冲区时会并行计算列表元素。“

     

evalBuffer :: Int -> Strategy a -> Strategy [a]
  evalBuffer是(懒惰)列表的滚动缓冲区策略组合器。   evalBuffer并不像类型所暗示的那样具有组合性。实际上,它只是将列表元素评估为弱头正常形式,而忽略了策略参数r0。“

我的问题的第一部分是否意味着parBuffer也忽视了它的战略论点?如果它只是忽视它,为什么它甚至会提供一个战略论点呢?

我的问题的第二部分是如何确定使用parBuffer的缓冲区大小?如果parBuffer始终保持缓冲区大小为n,那么n=1n=10除了必须在内存中保留更多火花之外还有什么区别?我认为选择n=<number of threads>"可能是明智之举,但我不知道这会如何改善,因为parBuffer在消耗火花时仍会产生火花,无论是n=1n=4

1 个答案:

答案 0 :(得分:1)

第一个答案:parBuffer需要Strategy来评估列表的一个元素,然后返回Strategy来评估整个列表。所以是的,它并行地评估列表。但它仍然需要知道如何评估每个项目。 (你想要正常形式还是弱头正常形式还是......?)所以它不会忽略第一个参数。

第二......基准吗?我怀疑答案取决于每个火花的确切工作量,您拥有的数据依赖性等等。