Замедление при использовании параллельных стратегий в Haskell

Я прорабатывал упражнения детерминированного параллельного программирования Андре Ло в упражнениях на Haskell. Я пытался преобразовать последовательный код N-Queens в параллельный с помощью стратегий, но заметил, что параллельный код работает намного медленнее, чем последовательный, а также выдает ошибки из-за нехватки места в стеке.

Это код для параллельных N-Queens,

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)

Строка (\l -> concat (map (addQueen n) l using parListChunk (n div numCapabilities) rdeepseq))это то, что Я изменил исходный код. Я видел решение Саймона Марлоу, но хотел узнать причину замедления и ошибки в моем коде.

Заранее спасибо.

14
задан user151019 14 May 2012 в 13:05
поделиться