Verwendung von parallelen Strategien in Haskell

9

Ich habe eine Funktion frequencyBy , die ich parallelisieren möchte. Hier folgt ein einfacher Testfall:

%Vor%

Ich möchte das map in frequencyBy parallel ausführen. Ich versuche das mit parList rdeepseq zu erreichen (all die anderen Sachen in main sollen nur sicherstellen, dass nicht alles weg optimiert ist). Dies funktioniert jedoch nicht, zwei Threads machen doppelt so viel Arbeit wie ein Thread in der gleichen Zeit. Ich verstehe nicht, was ich hier falsch mache.

    
user362382 13.01.2012, 14:42
quelle

2 Antworten

10

Es könnte sein, dass der Overhead die Dinge verlangsamt, je nachdem, wie groß x ist; Wenn die Arbeit, die du in jedem Funken machst, vergleichbar ist mit der Zeit, die es braucht, um jeden Funken zu spawnen (und natürlich gibt es einen Zeitplan-Overhead usw.), dann wirst du auf Probleme stoßen.

Sie könnten parListChunk , z %Code%; Sie müssen experimentieren, um herauszufinden, welche Chunk-Größe verwendet werden soll. Während Ihre aktuelle Strategie einen Funken für jedes Element der Liste erzeugt, erzeugt parListChunk 64 rdeepseq einen Funken für jedes Stück einer bestimmten Größe in der Liste und verwendet die Strategie, die Sie sequentiell für jedes Element dieses Stücks angeben.

By the way, die parListChunk in foldr verlangsamt wahrscheinlich die Dinge aufgrund übermäßiger Thunk-Erstellung; etwas wie

%Vor%

sollte das beheben.

Natürlich, wie immer, stellen Sie sicher, dass Sie mit frequencyBy kompilieren und mit -O2 laufen.

    
ehird 13.01.2012, 14:59
quelle
7

Ich denke, Ihre Parallelität ist zu feinkörnig. parList versucht, jedes Element parallel zu bewerten, und es gibt wirklich nicht viel Arbeit für ein einzelnes Element.

Wenn ich von parList zu parListChunk 500 wechsel, erhöht sich die Ausführungszeit um fast 50%; da ich auf einer Dual-Core-Maschine bin, die ungefähr so ​​gut ist wie es geht.

Als Referenz habe ich mit x=20000 getestet.

    
John L 13.01.2012 15:14
quelle

Tags und Links