में समांतर रणनीतियों का उपयोग करते समय मंदी, मैं हैकेल अभ्यास में आंद्रे लोह के निर्धारक समानांतर प्रोग्रामिंग के अभ्यास के माध्यम से काम कर रहा था। मैं एन-क्वींस अनुक्रमिक कोड को रणनीतियों का उपयोग करके समानांतर में बदलने की कोशिश कर रहा था, लेकिन मैंने देखा कि समांतर कोड अनुक्रमिक कोड की तुलना में बहुत धीमी गति से चलता है और अपर्याप्त स्टैक स्पेस के साथ त्रुटियों को भी चलाता है।हास्केल
यह समानांतर एन क्वींस के लिए कोड,
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))
मैं क्या मूल कोड से बदल रहा है। मैंने साइमन मार्लो के समाधान को देखा है लेकिन मैं अपने कोड में मंदी और त्रुटि के कारण को जानना चाहता था।
अग्रिम धन्यवाद।
आप कैसे संकलित किया था और चला सकता हूँ? – is7s
क्या आप '-O2' के साथ संकलित हैं और' -थ्रेडेड-एनएन 'के साथ चल रहे हैं (जहां आपकी सीपीयू गिनती है?) –
ध्यान दें कि' -थ्रेडेड 'एक संकलित समय विकल्प है, रन टाइम विकल्प नहीं है। इसके अलावा, आप बेली के वापस कब आ रहे हैं, डॉन? नल आपको याद करते हैं। –