我一直在使用
我错过了什么?如果有影响的话,我正在使用Arch Linux:
此外,我使用(我想是)正确的ghci选项在
Repa
库制作路径追踪器。最近我进行了重构,使用单子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
不行。根据 htop
显示,repa
似乎仍然只使用一个 CPU 核心:
sumP
和sumS
之间几乎没有差异,略微偏向于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
更新
一些评论表明我应该像repa
文档中所示使用-threaded
选项来运行ghci
。我曾经(误?)认为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
仍然没有结果:
我非常感谢对此事的任何进一步协助。