gpt4 book ai didi

haskell - 为什么 (Haskell) Repa 只使用一个 CPU?

转载 作者:行者123 更新时间:2023-12-02 04:33:45 25 4
gpt4 key购买 nike

我一直在使用 Repa 库开发路径追踪器。我最近通过使用 monadic computeP 重构它以合并并行性。但是,我发现性能提升可以忽略不计。此外,监控htop,程序似乎仍然只使用一个CPU。为了深入了解问题,我打开了 ghci 并运行了以下命令:

~
❯ stack ghci --package repa
Configuring GHCi with the following packages:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /tmp/ghci12667/ghci-script
Prelude> import Data.Array.Repa
Prelude Data.Array.Repa> import System.Random
Prelude Data.Array.Repa System.Random> randomList = randoms (mkStdGen 0)
Prelude Data.Array.Repa System.Random> shape = (Z :. 1000000)
Prelude Data.Array.Repa System.Random> array = fromFunction shape $ \(Z :. i) -> randomList !! i
Prelude Data.Array.Repa System.Random> sumP array

没有骰子。 repa 似乎仍然只使用一个 CPU 内核,如 htop 所示:

enter image description here

此外,执行团队在 sumPsumS 之间几乎没有变化,略微偏向于 sumS:

Prelude Data.Array.Repa System.Random> array = fromListUnboxed (Z :. 1000000) $ take 1000000 $ randoms (mkStdGen 0)
(0.01 secs, 0 bytes)
Prelude Data.Array.Repa System.Random> sumP array
AUnboxed Z [500140.92257232184]
(0.99 secs, 1,916,158,952 bytes)
Prelude Data.Array.Repa System.Random> sumS array
AUnboxed Z [500140.92257232184]
(0.93 secs, 2,348,156,248 bytes)

我错过了什么?以防万一,我使用的是 Arch Linux:

~
❯ uname -a
Linux roskolnikov 4.11.9-1-ARCH #1 SMP PREEMPT Wed Jul 5 18:23:08 CEST 2017 x86_64 GNU/Linux

更新

一些评论表明我应该为 ghci 使用 -threaded 选项,如 repa 文档中所示。我的(错误?)印象是 ghci 默认使用 -threaded。无论如何,我的程序已经在使用这些标志——这是来自 .cabal 文件的片段:

executable write
hs-source-dirs: app
main-is: Write.hs
ghc-options: -Odph
-rtsopts
-threaded
-fno-liberate-case
-funfolding-use-threshold1000
-funfolding-keeness-factor1000
-fllvm
-optlo-O3
build-depends: base
, pathtracer
, repa
, JuicyPixels
default-language: Haskell2010

此外,我使用(我认为)正确的 ghci 选项重新运行 ghci 中的命令:

~
❯ stack ghci\
--package repa\
--ghc-options -Odph\
--ghc-options -rtsopts\
--ghc-options -with-rtsopts=-N\
--ghc-options -threaded\
--ghc-options -fno-liberate-case\
--ghc-options -funfolding-use-threshold1000\
--ghc-options -funfolding-keeness-factor1000\
--ghc-options -fllvm\
--ghc-options -optlo-O3

Configuring GHCi with the following packages:

when making flags consistent: warning:
-O conflicts with --interactive; -O ignored.
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /tmp/ghci31252/ghci-script
Prelude> import Data.Array.Repa
Prelude Data.Array.Repa> import System.Random
Prelude Data.Array.Repa System.Random> randomList = randoms (mkStdGen 0)
Prelude Data.Array.Repa System.Random> shape = (Z :. 1000000)
Prelude Data.Array.Repa System.Random> array = fromFunction shape $ \(Z :. i) -> randomList !! i
Prelude Data.Array.Repa System.Random> sumP array

仍然没有骰子:

enter image description here

对于此事的任何进一步帮助,我深表感谢。

最佳答案

无论出于何种原因,ghci 似乎忽略了某些输入选项,因此像 sumP 这样的单子(monad)计算将只使用一个 CPU 核心。然而,这个实验的目的是为我正在进行的个人项目使用多核,我成功地实现了这个目标。我认为,关键是在我的 .cabal 文件中的 ghc-options 下添加 -with-rtsopts=-N。最终的ghc-options如下:

executable write
hs-source-dirs: app
main-is: Write.hs
ghc-options: -Odph
-rtsopts
-with-rtsopts=-N
-threaded
-fno-liberate-case
-funfolding-use-threshold1000
-funfolding-keeness-factor1000
-fllvm
-optlo-O3

关于haskell - 为什么 (Haskell) Repa 只使用一个 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985530/

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