来自“并行和并发Haskell”的并行Fibonacci

时间:2015-06-17 16:22:23

标签: haskell parallel-processing

来自Simon Marlow的Parallel and Concurrent Haskell,他展示了以下示例(rpar.hs):

fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = do
  [n] <- getArgs
  let test = [test1,test2,test3,test4] !! (read n - 1)
  t0 <- getCurrentTime
  r <- evaluate (runEval test)
  printTimeSince t0
  print r
  printTimeSince t0

test2 = do
  x <- rpar (fib 36)
  y <- rseq (fib 35)
  return (x,y)

从命令行键入以下内容将在两个核心上运行第二个测试:

$rpar 2 +RTS -N2
time: 0.73s
(24157817,14930352)
time: 1.90s

据我了解,第一次表示完成rseq (fib 35)所用的时间。然后,调用print r会导致rpar (fib 36)的完整评估。

如果该解释是正确的,那么fib 36的计算似乎无法重新使用已经计算的fib 35。换句话说,所有的工作,即计算fib 35,都必须执行两次。

这种理解是否正确?请更正或详细说明我错过的任何内容。

0 个答案:

没有答案