Wie schreibe ich parallelen Code mit Haskell-Vektoren?

8

Einerseits in Haskell Vector a scheint der bevorzugte Typ zu sein, der als ein Array von Zahlen verwendet wird. Es gibt sogar ein (unvollständiges) Vektor Tutorial .

Auf der anderen Seite Control.Parallel.Strategies werden hauptsächlich in Traversable definiert. Die Vektorbibliothek stellt diese Instanzen nicht zur Verfügung.

Die minimale vollständige Definition von Traversable t sollte auch Foldable und

definieren %Vor%

Ich sehe nicht, wie sequenceA für Data.Vector.Unboxed.Vector definiert werden kann. Also, was ist der beste Ansatz zum Schreiben von parallelem Code mit ungeschachtelten Vektoren? Definieren Sie einige neue Ad-hoc-Strategien wie evalVector oder verwenden Sie par und pseq explizit oder verwenden Sie anstelle von Vektoren plain Data.Array ?

P.S. Plain Array s sind ohne Probleme parallelisierbar: Ссылка

    
sastanin 15.11.2010, 17:04
quelle

2 Antworten

6

Es ist ein Hack-Job für parVector , aber das hat für mich funktioniert:

%Vor%

Und diesen Code ausführen:

%Vor%

Wenn ich den Code mit Integer anstelle von Int in der Typ-Signatur starte:

%Vor%

Fels!

EDIT: Und eine Lösung, die Ihrem früheren Versuch etwas näher ist, ist sauberer (es verwendet keine Funktionen aus drei separaten Modulen) und funktioniert großartig:

%Vor%

Aus dieser Lösung lernen:

  1. Es benutzt die Eval Monade, was streng ist, also werden wir sicher alles entzünden (im Vergleich zum Einschließen von Dingen in let und erinnern daran, Bang-Muster zu verwenden).
  2. Im Gegensatz zu Ihrer vorgeschlagenen Implementierung erstellt es (a) keinen neuen Vektor, der teuer ist (b) evalChunk erzwingt die Auswertung jedes Elements mit rpar und rdeepseq (Ich glaube nicht, dass rpar vec erzwingt eines der Elemente des Vektors).
  3. Im Gegensatz zu meiner Annahme, verwendet slice einen Startindex und eine Länge, nicht einen Start- und Endindex. Ups!
  4. Wir müssen weiterhin Control.DeepSeq (NFData) importieren, aber ich habe die Bibliotheksliste per E-Mail gesendet, um das Problem zu beheben.

Die Leistung scheint der ersten parVector Lösung in dieser Antwort ähnlich zu sein, also werde ich keine Zahlen posten.

    
Thomas M. DuBuisson 16.11.2010, 17:53
quelle
2

1) Wie Sie wahrscheinlich wissen, ist vector ein Produkt der DPH Arbeit, die sich als härter erwiesen hat als die Forscher ursprünglich erwartet hatten.

2) Ungepackte Vektoren können die Arbeit für einzelne Elemente nicht auf mehrere CPUs verteilen.

3) Ich wäre viel hoffnungsvoller für verpackte Vektoren. Etwas wie:

%Vor%

Oder Sie können es vermeiden, die Liste zu erstellen und die Parlist zu verwenden. Ich denke, nur Teile des Arrays zuzuweisen ist ausreichend. Der folgende Code ist wahrscheinlich fehlerhaft, aber das Konzept, dass Sie Ihre eigene parVector mit rnf erstellen und den Vektor in zwei Hälften teilen, bis es ein einzelnes Element (oder eine einstellbare Größe von Elementen) ist, sollte funktionieren.

%Vor%     
Thomas M. DuBuisson 15.11.2010 18:58
quelle