为什么`par`只使用一个核心但速度更快?

时间:2015-09-22 01:12:40

标签: haskell

我试图测试parallel包,特别是par函数。我写了一个简单的程序来测试并行性是否会加速其他顺序程序。

所以在这里我写了两个脚本,第一个顺序:

import Control.Parallel

n = 600000000

main = print $ pseq (mod (sum [1..n]) 5) (mod (sum [1..n]) 5)

第二个并行:

import Control.Parallel

n = 600000000

main = print $ par (mod (sum [1..n]) 5) (mod (sum [1..n]) 5)

我使用ghc -O2编译每个并运行它们,然后使用GNU time测量运行时间。这是我得到的:

依序:

User time (seconds): 13.79
System time (seconds): 0.04
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:13.85

并行:

User time (seconds): 6.89
System time (seconds): 0.05
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:06.97

这很有趣但令人困惑:为什么并行版本的速度要快两倍,但只使用一个核心?

1 个答案:

答案 0 :(得分:8)

  

为什么它只使用一个核心?

因为您使用了非线程运行时。使用-threaded进行编译以利用花哨的新线程运行时。但是由于第二个问题的答案,这不会帮助你实现这个微基准测试:你只编写了一个核心的计算值。

  

为什么它变得更快?

因为它计算的东西较少:因为par的第一个参数永远不会被第二个参数使用,所以它会被塞进一个永远不会被要求的火花中,因此永远不会被迫做它的工作。另一方面,pseq 总是完成第一个参数所需的工作,即使该值未被其第二个参数使用。