Je ne pense pas qu'une liste soit le bon type de données pour cela. Parce que c'est juste une liste liée, les données seront nécessairement accédées séquentiellement. Bien que vous puissiez évaluer les éléments en parallèle, vous ne gagnerez pas grand-chose dans l'étape de réduction. Si vous avez vraiment besoin d'une liste, je pense que la meilleure fonction serait juste
parFold f = foldl1' f . withStrategy (parList rseq)
ou peut-être
parFold f = foldl1' f . withStrategy (parBuffer 5 rseq)
Si l'étape de réduction est complexe, vous pourriez obtenir un gain en subdivisant la liste comme ceci:
parReduce f = foldl' f mempty . reducedList . chunkList . withStrategy (parList rseq)
where
chunkList list = let (l,ls) = splitAt 1000 list in l : chunkList ls
reducedList = parMap rseq (foldl' f mempty)
J'ai pris la liberté d'assumer vos données est un Monoid
pour mempty, si cela est impossible, vous pouvez remplacer mempty avec votre propre type vide, ou pire des cas d'utilisation foldl1'
.
Deux opérateurs de Control.Parallel.Strategies
sont utilisés ici. Le parList
évalue tous les éléments de la liste en parallèle. Après cela, le chunkList
divise la liste en blocs de 1000 éléments. Chacun de ces morceaux est ensuite réduit en parallèle par le parMap
.
Vous pouvez également essayer
parReduce2 f = foldl' f mempty . reducedList . chunkList
where
chunkList list = let (l,ls) = splitAt 1000 list in l : chunkList ls
reducedList = parMap rseq (foldl' f mempty)
Selon exactement comment le travail est distribué, l'un d'entre eux peuvent être plus efficaces que les autres. Si vous pouvez utiliser une structure de données supportant bien l'indexation (Array, Vector, Map, etc.), alors vous pouvez faire des subdivisions binaires pour l'étape de réduction, ce qui sera probablement meilleur dans l'ensemble.
Comme l'ont noté les gens, list est une structure de données médiocre pour la division parallèle récursive. Vous voulez une sorte de structure arbre/corde binaire comme dans le langage Fortress: http://labs.oracle.com/projects/plrg/Publications/ICFPAugust2009Steele.pdf – sclv