En parallèle de la carte en haskell
Est-il un substitut de map
qui évalue la liste en parallèle? Je n'ai pas besoin d'être paresseux.
Quelque chose comme: pmap :: (a -> b) -> [a] -> [b]
me laisser pmap expensive_function big_list
et toutes mes cores à 100%.
Vous devez vous connecter pour publier un commentaire.
Oui, voir la en parallèle paquet:
permettra d'évaluer chaque élément de la liste en parallèle via le
rdeepseq
stratégie. Notez l'utilisation deparListChunk
avec une bonne partie de la valeur pourrait donner de meilleures performances si vos éléments sont trop bon marché pour obtenir un avantage de l'évaluation de chacun en parallèle (car il permet d'économiser sur les étincelles pour chaque élément).EDIT: d'après votre question, je pense que je devrais expliquer pourquoi c'est une réponse. C'est parce que Haskell est paresseux! Considérons la déclaration
Rien n'a été évaluée. Vous avez juste créé un thunk que les cartes de
expensiveFunction
. Alors, comment faisons-nous l'évaluer en parallèle?Maintenant, ne pas utiliser le
bs
liste dans votre avenir calculs, au lieu d'utiliser l'cs
liste. OIE, vous n'avez pas besoin, en parallèle, une carte, vous pouvez utiliser la régulière (paresseux) cartes et une parallèle à évaluer la stratégie.EDIT: Et si vous regardez autour, assez, vous verrez le parMap fonction qui fait ce que j'ai montré ici, mais enveloppé dans une fonction d'assistance.
En réponse à votre commentaire, le code ci-dessous fonctionne pas pour vous? il fonctionne pour moi.
pmap f x = (map f x) `using` parList rdeepseq
, mais GHC est de se plaindre que rdeepseq a besoin d'un argument.parMap rdeepseq f as
devrait faire la même chose.NFData
exemple - qui est nécessaire pour l'utilisation derdeepseq
. Si c'est trop difficile alors utiliserrseq
au lieu de cela, ce qui evalutes à whnf.ghc -O2 -threaded blah.hs --make
) et utilisez le bouton droit de la RTS options (./blah +RTS -Nx
) oùx
est le nombre de coeurs que vous souhaitez utiliser, comme2
? Note sur GHC 7, vous devez simplement être en mesure de typeghc -O2 -threaded -with-rtsopts=-N blah.hs
et exécuter./blah
.-fforce-recomp
, juste pour être sûr) et comment vous avez exécuté? Aussi, retrouvez-moi sur #haskell en IRC si vous voulez faire ce travail en temps réel.En plus, en utilisant des stratégies explicites de vous-même comme Tom l'a décrit, le en parallèle paquet aussi les exportations
parMap
:où la stratégie argument est quelque chose comme
rdeepseq
.Et il y a aussi
parMap
dans le par-monade paquet (vous sortez de la pure Haskell, et en parallèle une monade):Le par-monade paquet est documenté ici.