Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中使用并行策略时的减速_Haskell_Parallel Processing - Fatal编程技术网

在Haskell中使用并行策略时的减速

在Haskell中使用并行策略时的减速,haskell,parallel-processing,Haskell,Parallel Processing,我在haskell练习中练习Andre Loh的确定性并行编程。我试图通过使用策略将N-Queens序列代码转换为并行代码,但我注意到并行代码的运行速度比序列代码慢得多,并且在堆栈空间不足的情况下出错 这是平行N皇后的代码 import Control.Monad import System.Environment import GHC.Conc import Control.Parallel.Strategies import Data.List import Data.Function t

我在haskell练习中练习Andre Loh的确定性并行编程。我试图通过使用策略将N-Queens序列代码转换为并行代码,但我注意到并行代码的运行速度比序列代码慢得多,并且在堆栈空间不足的情况下出错

这是平行N皇后的代码

import Control.Monad
import System.Environment
import GHC.Conc
import Control.Parallel.Strategies
import Data.List
import Data.Function

type PartialSolution = [Int] -- per column, list the row the queen is in
type Solution = PartialSolution

type BoardSize = Int

chunk :: Int -> [a] -> [[a]]
chunk n [] = []
chunk n xs = case splitAt n xs of
         (ys, zs) -> ys : chunk n zs

-- Generate all solutions for a given board size.
queens :: BoardSize -> [Solution]
--queens n = iterate (concatMap (addQueen n)) [[]] !! n
queens n = iterate (\l -> concat (map (addQueen n) l `using` parListChunk (n `div`            numCapabilities) rdeepseq)) [[]] !! n


-- Given the size of the problem and a partial solution for the
-- first few columns, find all possible assignments for the next
-- column and extend the partial solution.
addQueen :: BoardSize -> PartialSolution -> [PartialSolution]
addQueen n s = [ x : s | x <- [1..n], safe x s 1 ]

-- Given a row number, a partial solution and an offset, check
-- that a queen placed at that row threatens no queen in the
-- partial solution.
safe :: Int -> PartialSolution -> Int -> Bool
safe x []    n = True
safe x (c:y) n = x /= c && x /= c + n && x /= c - n && safe x y (n + 1)

main = do
        [n] <- getArgs
        print $ length $ queens (read n)
import-Control.Monad
导入系统。环境
进口温室气体浓度
进口管制.平行战略
导入数据。列表
导入数据。函数
键入PartialSolution=[Int]--每列列出皇后所在的行
类型解决方案=部分解决方案
类型BoardSize=Int
chunk::Int->[a]->[[a]]
块n[]=[]
chunk n xs=n xs处的大小写拆分
(ys,zs)->ys:chunk n zs
--生成给定电路板尺寸的所有解决方案。
queens::BoardSize->[解决方案]
--queens n=迭代(concatMap(addQueen n))[[]]!!N
queens n=迭代(\l->concat(映射(addQueen n)l`using`parlistcunk(n`div`numCapabilities)rdeepseq))[[[]]!!N
--考虑到问题的规模和问题的部分解决方案
--在前几列中,查找下一列的所有可能分配
--列并扩展部分解。
addQueen::BoardSize->PartialSolution->[PartialSolution]
addQueen n s=[x:s | x部分解->整数->布尔
安全x[]n=True
安全x(c:y)n=x/=c&&x/=c+n&&x/=c-n&&safe xy(n+1)
main=do
[n] concat(map(addQueen n)l using parListChunk(n div numCapabilities)rdeepseq))
是我对原始代码所做的更改。我看过Simon Marlow的解决方案,但我想知道代码中出现减速和错误的原因


提前谢谢。

您引发了太多的工作。
div n numCapabilities
parListChunk
参数在您的系统上可能是,什么,7(2个内核,您使用的是n~14)。列表将非常快地增长,因此引发如此小的工作单元是没有意义的(我不明白为什么把它与
n
的值联系起来是有意义的)

如果我加上一个因子10(在本例中使触发单元为70),那么我就可以获得比单线程更明显的性能优势。此外,我没有您提到的堆栈问题-如果它随着
parListChunk
值的更改而消失,那么我会将其报告为一个bug

如果我每800次进行一次分块,那么分块的次数将从5.375s增加到7.9s。超过800次,性能又开始变得更差,ymmv

编辑:


您是否使用
-O2
编译并使用
-threaded-Nn
运行(其中
n
是您的cpu计数?)请注意,
-threaded
是一个编译时选项,而不是运行时选项。另外,你什么时候回到贝利家,水龙头会想念你。不要忘了-rtsopts和+RTS。即使使用
-threaded
和其他一些注意事项。我对并行策略一无所知,但在我的机器上运行线程版本大约慢了3倍。为什么仅仅通过添加-threaded选项代码运行会慢一些?我有一些代码正在做同样的事情。这是由于不正确的并行设计/使用还是其他原因?感谢您指出这个错误。我实际上想在核心之间平均分配部分解决方案。现在我将其修改为'div(长度l)numCapabilities`这应该没问题。即使这样做了,我发现并行版本仍然比顺序版本慢(编译时没有线程选项)对于-N1选项,我得到了相同的堆栈溢出异常。当我尝试对电路板大小14使用相同的堆栈溢出异常时,顺序版本工作正常,但并行版本出现内存不足错误。我知道这些信息可能不够,如果我可以为这些情况附加事件日志文件,会有帮助吗?GHC版本将与代码y一起提供帮助您当前正在使用以及如何为每个案例编译它(我希望包括
-fforce recomp
标志)。我不建议您使用
长度l
,只需选择一个足够大的值,使火花的成本微不足道,但选择一个足够小的值,使您不会注意到一个或两个内核为一个火花工作时的时间差。我目前使用的是ghc 7.4.1。我尝试运行的代码与上面的代码相同,只有change我在评论中提到过。当我使用length时,创建的火花数量急剧下降(最大值约为60)。我也尝试使用其他值,但仍然出现错误。我使用-threaded-O2-fforce recomp-rtsopts-eventlog标志编译文件,并使用-N2,-N3,-N4.flags运行
[tommd@mavlo Test]$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.4
[tommd@mavlo Test]$ ghc -O2 so.hs -rtsopts -threaded -fforce-recomp ; time ./so 13 +RTS -N2
[1 of 1] Compiling Main             ( so.hs, so.o )
Linking so ...
73712
real    0m5.404s

[tommd@mavlo Test]$ ghc -O2 so.hs -rtsopts -fforce-recomp ; time ./so 13
[1 of 1] Compiling Main             ( so.hs, so.o )
Linking so ...
73712
real    0m8.134s