Ho una funzione frequencyBy
che vorrei parallelizzare. Qui di seguito un semplice caso di test:Come usare Parallel Strategies in Haskell
import Control.Parallel.Strategies
import Control.DeepSeq
import System.Environment
frequencyBy :: (a -> b -> Bool) -> [a] -> [b] -> [(a,Int)]
frequencyBy f as bs = map
(\a ->(a, foldr (\b -> if f a b then (+) 1 else id) 0 bs)) as
main :: IO()
main = do
x:xs <- getArgs
let result = frequencyBy (==) [1::Int .. 10000] [1 .. (read x)] `using`
parList rdeepseq
print $ product $ map snd $ result
vorrei correre il map
in frequencyBy
in parallelo. Sto cercando di raggiungere questo obiettivo utilizzando parList rdeepseq
(tutte le altre cose nello main
servono solo a garantire che non tutto sia ottimizzato). Tuttavia, questo non funziona, due thread fanno il doppio del lavoro di un thread nello stesso tempo. Non capisco cosa sto facendo male qui.
Se due thread eseguono il doppio del tempo di un thread nello stesso tempo, non significa che sia in parallelo correttamente? – ehird