gpt4 book ai didi

haskell - 写入 "fib"并行运行: -N2 is slower?

转载 作者:行者123 更新时间:2023-12-02 12:20:32 24 4
gpt4 key购买 nike

我正在学习 Haskell 并尝试编写并行执行的代码,但 Haskell 总是按顺序运行它。当我使用 -N2 运行时标志执行时,执行时间比省略此标志要长。

这里是代码:

import Control.Parallel
import Control.Parallel.Strategies

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

fib2 :: Int -> Int
fib2 n = a `par` (b `pseq` (a+b))
where a = fib n
b = fib n + 1

fib3 :: Int -> Int
fib3 n = runEval $ do
a <- rpar (fib n)
b <- rpar (fib n + 1)
rseq a
rseq b
return (a+b)

main = do putStrLn (show (fib3 40))

我做错了什么?我在基于 Intel core i5 的 Windows 7 和基于 Atom 的 Linux 中尝试了此示例。

这是我的控制台 session 的日志:

ghc -rtsopts -threaded -O2 test.hs
[1 of 1] Compiling Main ( test.hs, test.o )

test +RTS -s
331160283
64,496 bytes allocated in the heap
2,024 bytes copied during GC
42,888 bytes maximum residency (1 sample(s))
22,648 bytes maximum slop
1 MB total memory in use (0 MB lost due to fragmentation)

Generation 0: 0 collections, 0 parallel, 0.00s, 0.00s elapsed
Generation 1: 1 collections, 0 parallel, 0.00s, 0.00s elapsed

Parallel GC work balance: nan (0 / 0, ideal 1)

MUT time (elapsed) GC time (elapsed)
Task 0 (worker) : 0.00s ( 6.59s) 0.00s ( 0.00s)
Task 1 (worker) : 0.00s ( 0.00s) 0.00s ( 0.00s)
Task 2 (bound) : 6.33s ( 6.59s) 0.00s ( 0.00s)

SPARKS: 2 (0 converted, 0 pruned)

INIT time 0.00s ( 0.00s elapsed)
MUT time 6.33s ( 6.59s elapsed)
GC time 0.00s ( 0.00s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 6.33s ( 6.59s elapsed)

%GC time 0.0% (0.0% elapsed)

Alloc rate 10,191 bytes per MUT second

Productivity 100.0% of total user, 96.0% of total elapsed

gc_alloc_block_sync: 0
whitehole_spin: 0
gen[0].sync_large_objects: 0
gen[1].sync_large_objects: 0


test +RTS -N2 -s
331160283
72,688 bytes allocated in the heap
5,644 bytes copied during GC
28,300 bytes maximum residency (1 sample(s))
24,948 bytes maximum slop
2 MB total memory in use (0 MB lost due to fragmentation)

Generation 0: 1 collections, 0 parallel, 0.00s, 0.00s elapsed
Generation 1: 1 collections, 1 parallel, 0.00s, 0.01s elapsed

Parallel GC work balance: 1.51 (937 / 621, ideal 2)

MUT time (elapsed) GC time (elapsed)
Task 0 (worker) : 0.00s ( 9.29s) 0.00s ( 0.00s)
Task 1 (worker) : 4.53s ( 9.29s) 0.00s ( 0.00s)
Task 2 (bound) : 5.84s ( 9.29s) 0.00s ( 0.01s)
Task 3 (worker) : 0.00s ( 9.29s) 0.00s ( 0.00s)

SPARKS: 2 (1 converted, 0 pruned)

INIT time 0.00s ( 0.00s elapsed)
MUT time 10.38s ( 9.29s elapsed)
GC time 0.00s ( 0.01s elapsed)
EXIT time 0.00s ( 0.00s elapsed)
Total time 10.38s ( 9.30s elapsed)

%GC time 0.0% (0.1% elapsed)

Alloc rate 7,006 bytes per MUT second

Productivity 100.0% of total user, 111.6% of total elapsed

gc_alloc_block_sync: 0
whitehole_spin: 0
gen[0].sync_large_objects: 0
gen[1].sync_large_objects: 0

最佳答案

我认为答案是“GHC 将优化 fib 函数,使其不进行分配,并且不进行分配的计算会给 RTS 带来问题,因为调度程序永远不会运行并进行负载平衡(即并行性所必需的)”,正如 Simon 在 discussion group 中所写。我还发现很好的 tutorial

关于haskell - 写入 "fib"并行运行: -N2 is slower?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com