Как использовать любой параллелизм в моем параллельном коде haskell?

Я только что сообщил о работе с полуявным параллелизмом haskell с GHC 6.12. Я написал следующий код haskell для параллельного вычисления карты функции fibonnaci по 4 элементам в списке, и в то же время отображение функции sumEuler на двух элементах.

import Control.Parallel
import Control.Parallel.Strategies

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

mkList :: Int -> [Int]
mkList n = [1..n-1]

relprime :: Int -> Int -> Bool
relprime x y = gcd x y == 1

euler :: Int -> Int
euler n = length (filter (relprime n) (mkList n))

sumEuler :: Int -> Int
sumEuler = sum . (map euler) . mkList

-- parallel initiation of list walk                                                                                                                                    
mapFib :: [Int]
mapFib = map fib [37, 38, 39, 40]

mapEuler :: [Int]
mapEuler = map sumEuler [7600, 7600]

parMapFibEuler :: Int
parMapFibEuler = (forceList mapFib) `par` (forceList mapEuler `pseq` (sum mapFib + sum mapEuler))

-- how to evaluate in whnf form by forcing                                                                                                                                
forceList :: [a] -> ()
forceList [] = ()
forceList (x:xs) = x `pseq` (forceList xs)


main = do putStrLn (" sum : " ++ show parMapFibEuler)

для параллельного улучшения моей программы я переписал ее с помощью par и pseq и форсирования для принудительной оценки WHNF. Моя проблема в том, что, глядя в область потоков, кажется, что я не получил никакого параллелизма. Ситуация хуже, потому что я не получил никакого ускорения.

Threadscope observation

Вот почему у меня есть два этих вопроса

Вопрос 1 Как я могу изменить свой код, чтобы использовать любой параллелизм?

Вопрос 2 Как Могу ли я написать свою программу, чтобы использовать стратегии (parMap, parList, rdeepseq и так далее ... )?

Первое улучшение в Strategies

Согласно его вкладу

parMapFibEuler = (mapFib, mapEuler) `using` s `seq` (sum mapFib + sum mapEuler) where
    s = parTuple2 (seqList rseq) (seqList rseq)

параллелизм появляется в Threadcope, но его недостаточно для значительного ускорения

enter image description here

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