gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:01:16 26 4
gpt4 key购买 nike

我正在尝试测试 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

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

最佳答案

Why did it only use one core?

因为你使用了非线程运行时。使用 -threaded 进行编译,以利用新奇的线程运行时。但由于第二个问题的答案,这对您进行微基准测试没有帮助:您只编写了一个核心的计算量。

Why did it go faster?

因为它计算的东西较少:由于 par 的第一个参数从未被第二个参数使用,所以它被塞进一个永远不会被要求的 Spark 中,因此永远不会被迫完成它的工作。另一方面,pseq 始终执行第一个参数所需的工作,即使第二个参数未使用该值。

关于haskell - 为什么 `par`只使用一个核心但速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706873/

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