了解基于parBuffer的策略运行结果

时间:2015-06-05 18:54:01

标签: haskell parallel-processing ghc

我想了解Haskell评估策略,并发现parBuffer概念非常有趣。所以我创建了一个计算阶乘的哑函数,并尝试创建它的并行版本。

考虑以下代码

module Main where

import System.Environment
import Control.Parallel.Strategies

fac :: Int -> Int
fac n
    | n <= 1 = 1
    | otherwise = n * fac (n-1)

-- sequential version
facsum :: Int -> Int
facsum n = sum $ map fac [1..n]

facsum_par :: Int -> Int
facsum_par n = sum lst  where
    lst = (map fac [1..n]) `using` parBuffer 50 rseq

main :: IO ()
main = do args <- getArgs 
          let (n:_) = args 
          print (facsum_par $ read n)

我原以为,parBuffer会创建50个火花串,但* n = 9000和-N2的统计数据我得到输出

  

SPARKS:9000(8277转换,688溢出,0哑,1 GC,34失败)

为什么会出现溢出的火花?据我所知,只有当火花量大于火花池的大小时才会发生这种情况,但这应该限制在50?

为什么会有34个失败的火花,是否仅适用于小型,快速计算的输入?

0 个答案:

没有答案