【发布时间】:2013-04-02 18:10:19
【问题描述】:
下面的 Haskell 代码使用 par 和 pseq 进行一些多核数字运算,作为玩具来显示正在使用的多个内核。在 Scala 中表达这一点的最简单和最惯用的方式是什么? Futures and Promises 看起来很有希望(咳咳),我一直在看scalaz.concurrent,例如this example,但我找不到文档来解释这一切。
import Control.Parallel
main = a `par` b `par` c `pseq` print (a + b + c)
where
a = ack 3 10
b = fac 42
c = fib 35
fac 0 = 1
fac n = n * fac (n-1)
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
【问题讨论】:
-
不应该强制 a、b 和 c 以实际执行并行工作吗?
-
这不是必须的,至少在使用
ghc -O2 -threaded Par.hs --make -fforce-recomp进行编译时 -
@jozefg:必须至少在打印总和后立即对它们进行评估。
-
@NiklasB。是的,我不确定 GHC 是否会将它们评估为 WHNF,然后在打印期间在单个核心上进行全面评估。
-
哦,对了...我很愚蠢..谢谢你的澄清
标签: scala haskell concurrency multicore scalaz