Adds parallelism

unboxed-vector
Abhinav Sarkar 2018-07-18 16:43:48 +05:30
parent f8aa4d7766
commit c6cc365151
2 changed files with 18 additions and 7 deletions

View File

@ -15,6 +15,8 @@ dependencies:
- base >= 4.7 && < 5 - base >= 4.7 && < 5
- containers - containers
- vector - vector
- parallel
- deepseq
executables: executables:
sudoku: sudoku:
@ -22,6 +24,9 @@ executables:
source-dirs: src source-dirs: src
ghc-options: ghc-options:
- -O2 - -O2
- -threaded
- -rtsopts
- -with-rtsopts=-N
dependencies: dependencies:
- split - split

View File

@ -14,6 +14,8 @@ import qualified Data.Bits
import Data.Vector.Unboxed ((!)) import Data.Vector.Unboxed ((!))
import qualified Data.Vector.Unboxed.Mutable import qualified Data.Vector.Unboxed.Mutable
import qualified Data.Vector.Unboxed import qualified Data.Vector.Unboxed
import qualified Data.Maybe
import Control.Parallel.Strategies (withStrategy, rdeepseq, parBuffer)
fixM :: (Eq t, Monad m) => (t -> m t) -> t -> m t fixM :: (Eq t, Monad m) => (t -> m t) -> t -> m t
fixM f x = f x >>= \x' -> if x' == x then return x else fixM f x' fixM f x = f x >>= \x' -> if x' == x then return x else fixM f x'
@ -250,10 +252,14 @@ solve grid = pruneGrid grid >>= solve'
main :: IO () main :: IO ()
main = do main = do
inputs <- lines <$> getContents grids <- lines <$> getContents
Control.Monad.forM_ inputs $ \input -> let solutions = parMap readAndSolve grids
case readGrid input of putStrLn $
Nothing -> putStrLn "Invalid input" show (length $ filter Data.Maybe.isJust solutions) ++ "/" ++ show (length grids) ++ " solved"
Just grid -> case solve grid of where
Nothing -> putStrLn "No solution found" readAndSolve grid = case readGrid grid of
Just grid' -> putStrLn $ showGrid grid' Nothing -> Nothing
Just b -> solve b
chunkSize = 1000
parMap f = withStrategy (parBuffer chunkSize rdeepseq) . map f