2016-06-14 1 views
0

У меня есть следующий код. Префикс M обозначает функции от Data.Map.Strict, а Table - это тип псевдонима для Data.Map.Strict.Map Mapping Bool, где Mapping - произвольная непрозрачная структура.Работа с Data.Map.StrictMap.Карты с использованием Control.Parallel

computeCoverage :: Table -> Expr -> Maybe Coverage 
computeCoverage t e = go t True M.empty 
    where go src flag targ 
      | null src = if flag 
         then Nothing 
         else Just (M.size t, targ) 
      | otherwise = let ((m, b), rest) = M.deleteFindMin src 
          result = interpret e m 
          flag' = result && flag in 
       go rest flag' (if b == result then targ else M.insert m b targ) 

Я хотел бы иметь возможность использовать Control.Parallel выполнить это с таким же параллелизмом, как это возможно. Однако я не уверен, как это сделать. Основываясь на чтении Data.Map.Strict, кажется, что вы должны сделать, это позвонить splitRoot, а затем сделать все, что вам нужно, в результирующем списке, а затем перекомбинировать (я думаю?). Я в принципе получил правильную идею? Если нет, что мне следует делать, чтобы распараллелить код выше?

+1

А что такое 'Coverage'? Каков обзор этого алгоритма высокого уровня? – pdexter

ответ

3

Вот надуманный пример. Вы просто использовать parMap над M.splitRoot m:

import qualified Data.Map.Strict as M 
import Control.Parallel.Strategies 
import System.Environment 

fib 0 = 0 
fib 1 = 1 
fib n = fib (n-2) + fib (n-1) 

theMap :: Int -> M.Map Int Int 
theMap n = M.fromList [ (x, 33 + mod x 3) | x <- [1..n] ] 

isInteresting n = mod (fib n) 2 == 0 

countInteresting :: M.Map Int Int -> Int 
countInteresting m = length $ filter isInteresting (M.elems m) 

doit :: Int -> [Int] 
doit n = parMap rseq countInteresting (M.splitRoot $ theMap n) 

main :: IO() 
main = do 
    (arg1 : _) <- getArgs 
    let n = read arg1 
    print $ doit n 

Заметим, однако эти предостережения:

  • шпагат не может быть одинакового размера
  • использования splitRoot при работе с картой полезно для вычисления; этот конкретный пример не извлекает выгоду из структуры карты root - он мог бы просто parMapped над элементами.
Смежные вопросы