Parallel anzeigen in haskell
Gibt es einige Ersatz map
die Auswertung der Liste in parallel? Ich brauche es nicht, faul zu sein.
Etwas wie: pmap :: (a -> b) -> [a] -> [b]
lassen Sie mich pmap expensive_function big_list
und habe alle meine cores bei 100%.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, siehe die parallel-Paket:
bewertet jedes element der Liste parallel über die
rdeepseq
Strategie. Beachten Sie die Verwendung vonparListChunk
mit einem guten Stück könnte der Wert eine bessere Leistung, wenn Ihre Elemente sind auch Billig zu bekommen ein Vorteil die Auswertung jeweils parallel (weil es spart auf Funkenbildung für jedes element).EDIT: Bezogen auf deine Frage, ich glaube, ich sollte erklären warum das ist eine Antwort. Es ist, weil Haskell ist faul! Betrachten Sie die Anweisung
Nichts bewertet wurde. Sie haben gerade einen thunk, die Google maps
expensiveFunction
. So, wie wir es bewerten parallel?Nun nicht die
bs
Liste in Ihrem zukünftigen Berechnungen, sondern verwenden Sie dascs
Liste. IOW, brauchen Sie nicht eine parallel-Karte, die Sie verwenden können, die regelmäßige (faul) Karten und eine parallele evaulation-Strategie.EDIT: Und wenn man sich weit genug herum sehen Sie die parMap Funktion, die das macht, was ich hier gezeigt, aber eingewickelt in eine helper-Funktion.
In Antwort auf Ihren Kommentar nicht der code unten nicht für Sie arbeiten? es funktioniert für mich.
pmap f x = (map f x) `using` parList rdeepseq
, aber GHC beschwert sich, dass rdeepseq braucht ein argument.parMap rdeepseq f as
sollten das gleiche tun.NFData
Instanz - das ist erforderlich für den Einsatz vonrdeepseq
. Wem das zu lästig ist, dann verwenden Sierseq
statt, die evalutes zu whnf.ghc -O2 -threaded blah.hs --make
) und verwenden Sie die rechts-RTS-Optionen (./blah +RTS -Nx
), wox
ist die Anzahl der Kerne, die Sie verwenden möchten, wie2
? Hinweis auf GHC 7 sollten Sie nur in der Lage sein zu gebenghc -O2 -threaded -with-rtsopts=-N blah.hs
und führen./blah
.-fforce-recomp
, nur um sicher zu sein) und wie Sie ausgeführt? Außerdem finden Sie mich auf #haskell im IRC-wenn Sie möchten, diese arbeiten in Echtzeit.Neben der Verwendung von expliziten Strategien, die sich, wie Tom beschrieben hat, die parallel Paket auch die Exporte
parMap
:wo das Strategie-argument ist so etwas wie
rdeepseq
.Und es gibt auch
parMap
in der par-Monade-Paket (Sie Schritt aus purem Haskell, und in einem parallel-Monade):Dem par-Monade Paket ist hier dokumentiert.