Haskell 无影响的PAR

Haskell 无影响的PAR,haskell,parallel-processing,Haskell,Parallel Processing,我在Haskell中进行并行计算时遇到困难。我只是尝试了一个非常简单的并行计算和非并行计算,非并行计算比并行计算快了几秒钟。我做错什么了吗?你知道为什么会这样吗?提前谢谢 这是我的测试代码的并行版本: -- par.hs import Control.Parallel a = sum [1, 3 .. 99999999] b = sum [2, 4 .. 100000000] main = (a `par` b) `pseq` print (a + b) 这是非并行版本: -- nopar

我在Haskell中进行并行计算时遇到困难。我只是尝试了一个非常简单的并行计算和非并行计算,非并行计算比并行计算快了几秒钟。我做错什么了吗?你知道为什么会这样吗?提前谢谢


这是我的测试代码的并行版本:

-- par.hs
import Control.Parallel
a = sum [1, 3 ..  99999999]
b = sum [2, 4 .. 100000000]
main = (a `par` b) `pseq` print (a + b)
这是非并行版本:

-- nopar.hs
a = sum [1, 3 ..  99999999]
b = sum [2, 4 .. 100000000]
main = print (a + b)
但当我尝试它时,并行化没有任何影响,甚至没有负面影响:

➜  ghc par.hs
[1 of 1] Compiling Main             ( par.hs, par.o )
Linking par ...
➜  ghc nopar.hs 
[1 of 1] Compiling Main             ( nopar.hs, nopar.o )
Linking nopar ...
➜  time ./par 
5000000050000000
./par  35.02s user 12.83s system 92% cpu 51.501 total
➜  time ./nopar 
5000000050000000
./nopar  31.33s user 6.44s system 98% cpu 38.441 total 

IIUC,@Carl和@Zeta的评论结合在一起解决了以下问题:

 $ ghc -threaded -O2 par.hs && time ./par 
 50000005000000

 real    0m2.303s
 user    0m2.124s
 sys     0m0.176s

$ ghc par.hs && ./par +RTS -N2
Linking par ...
par: the flag -N2 requires the program to be built with -threaded
par:
par: Usage: <prog> <args> [+RTS <rtsopts> | -RTS <args>] ... --RTS <args>
par:
par:    +RTS    Indicates run time system options follow
par:    -RTS    Indicates program arguments follow
par:   --RTS    Indicates that ALL subsequent arguments will be given to the
par:            program (including any of these RTS flags)

 $ ghc -threaded -O2 par.hs && time ./par +RTS -N2
 50000005000000

 real    0m1.572s
 user    0m2.816s
 sys     0m0.296s
<代码> $GHC -线程- O2 PARHS & &时间/PAR 50000005000000 实0m2.303s 用户0m2.124s sys 0m0.176s GHC PAR.H.&/PAR+RTS -N2 连接PAR… par:flag-N2要求用-threaded构建程序 标准: par:用法:

默认情况下,GHC生成只使用一个核心的程序,即使我们编写显式并发代码。要使用多核,我们必须明确选择这样做。当我们生成一个可执行程序时,我们在链接时做出这个选择。。。如果我们将
-threaded
选项传递给编译器,它将根据线程运行库链接我们的程序

我们可以在程序的命令行上将选项传递给GHC的运行时系统。在将控制权交给我们的代码之前,运行时会扫描程序的参数,寻找特殊的命令行选项+RTS。。。线程化运行时接受选项-N。这需要一个参数,该参数指定GHC运行时系统应使用的内核数


你只是把数字相加。这可能太琐碎了,看不出有什么区别。尝试将
-threaded
标志添加到GHC中,这样它实际上使用了可以使用多个系统线程的RTS。@Carcigenicate显然它非常琐碎,单线程需要30秒。似乎有理由假设您可以使用两个线程将其减半。请显示
/par+RTS-s-N
的输出。