2017-10-06 4 views
4

Quand je lance ce programme avec -s:parTraversable ne pas créer d'étincelles

module Main where 

import Control.Parallel.Strategies 

main :: IO() 
main = do let xs = take 1000 $ product . take 1000 . repeat <$> [1..] 
       x = product (xs `using` parList rseq) 
      putStrLn (show x) 

Sparks sont créés:

SPARKS: 1000 (993 convertis, 0 débordait, 0 dud, 6 GC'd , 1 pétillé)

Si je change parList-parTraversable

x = product (xs `using` parTraversable rseq) 

pas d'étincelles sont créés:

SPARKS: 0 (0 converti, 0 débordait, 0 fringue, 0 GC'd, 0 pétillé)

Si je change rseq-rdeepseq:

main = do let xs = (take 1000 $ product . take 1000 . repeat <$> [1..]) :: [Integer] 
       x = product (xs `using` parList rdeepseq) 
      putStrLn (show x) 

Aucun produit des étincelles

SPARKS: 0 (0 converti, 0 débordait, 0 fringue, 0 GC'd, 0 pétillé)

J'utilise en parallèle 3.2.1.1 et dans le code source, parList est définie à l'aide parTraversable!

parList :: Strategy a -> Strategy [a] 
parList = parTraversable 

Que manque-t-il?

Répondre

5

Je peux reproduire votre comportement (ghc-8.2.1, parallèle-3.2.1.1).

Plus tard sur le Strategies.hs est un RULES pragma que les cas spéciaux parList rseq. Je suppose que c'est un bug qui a un comportement différent de parTraversable (je ne connais pas assez les internes pour être sûr de l'endroit où se trouve le bug). Je vous suggère de déposer un billet au suivi des problèmes parallel: https://github.com/haskell/parallel/issues

Voici le code en question, à partir de la ligne 505 du fichier:

-- Non-compositional version of 'parList', evaluating list elements 
-- to weak head normal form. 
-- Not to be exported; used for optimisation. 

-- | DEPRECATED: use @'parList' 'rseq'@ instead 
parListWHNF :: Strategy [a] 
parListWHNF xs = go xs `pseq` return xs 
    where -- go :: [a] -> [a] 
      go []  = [] 
      go (y:ys) = y `par` go ys 

-- The non-compositional 'parListWHNF' might be more efficient than its 
-- more compositional counterpart; use RULES to do the specialisation. 

{-# NOINLINE [1] parList #-} 
{-# NOINLINE [1] rseq #-} 
{-# RULES 
"parList/rseq" parList rseq = parListWHNF 
#-}