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
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: Ссылка
Es ist ein Hack-Job für parVector
, aber das hat für mich funktioniert:
Und diesen Code ausführen:
%Vor% Wenn ich den Code mit Integer
anstelle von Int
in der Typ-Signatur starte:
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:
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). evalChunk
erzwingt die Auswertung jedes Elements mit rpar
und rdeepseq
(Ich glaube nicht, dass rpar vec
erzwingt eines der Elemente des Vektors). slice
einen Startindex und eine Länge, nicht einen Start- und Endindex. Ups! 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.
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.
Tags und Links haskell vector parallel-processing