Ich habe eine geschlossene Quelle nicht-threadsafe C++ freigegebene Lib, die eine Funktion f :: ByteString -> ByteString bietet. Die Laufzeit dieser Funktion kann zwischen einer Sekunde und einigen Stunden liegen.Haskell Framework parallel zu non-threadsafe C++ Lib
Ich bin auf der Suche nach einer Möglichkeit, die Berechnung auf mehrere Kerne/Server (SIMD) zu verteilen.
Auf den Punkt gebracht, ich bin auf der Suche nach einem Rahmen, der eine Funktion
g :: Strategy b -> (a -> b) -> a -> b
heben eine Funktion bereitstellt, die nur sequentiell in eine Funktion aufgerufen werden kann, die wie jede andere reine Funktion in Haskell verhält.
Zum Beispiel ich möchte in der Lage sein, zu schreiben:
parMap rwhnf f args -- will not work
Da f eine C-Funktion in einer nicht-Thread-sichere lib über FFI nennt, das wird nicht funktionieren. Daher könnte ich die Funktion f durch eine Funktion g ersetzen, die eine Jobwarteschlange enthält und die Tasks an N separate Prozesse verteilt. Die Prozesse können lokal oder verteilt laufen:
parMap rwhnf g args -- should works
Mögliche Frameworks Ich sah bereits in sind
MPI: Client (Haskell) < - MPI -> Broker (C++) < - - MPI -> Arbeiter (C++) < -> Lib (C++)
ZeroMQ: Client (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Arbeiter (C++) < -> Lib (C++)
Wolke Haskell: Client (Haskell) < - CloudHaskell - > Arbeiter (Haskell) < - FFI -> Lib (C++)
Gearman
Erlang: Client (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN ode -> Arbeiter (C++)
Jeder Ansatz hat Vor- und Nachteile.
MPI wird viele Sicherheitsprobleme verursachen und ist eine ziemlich schwere Lösung.
ZeroMQ ist eine nette Lösung, aber würde erfordern, dass ich den Broker/Load Balancer etc. ganz alleine schreibe (besonders die Zuverlässigkeit zu bekommen ist nicht trivial).
CloudHaskell sieht nicht sehr ausgereift aus.
Gearmman läuft nicht unter Windows und hat keine Haskell-Bindungen.Ich weiß über Java-Gearman-Service, aber es ist viel weniger reif als der C-Daemon und hat einige andere Probleme (z. B. kein doc, schaltet sich ab, wenn es für einige Zeit keine eingehenden Aufgaben gibt, etc.).
Ähnlich wie 1 und erfordert die Verwendung einer dritten Sprache.
Vielen Dank!
Sie arbeiten daran, eine Funktion zu verteilen, die mit denselben Daten auf mehreren Kernen arbeitet, um sie fehlerfrei zu machen? Wenn nicht, wie kann Ihre Closed-Source-Funktion parallelisiert werden? –
Ich suche eine SIMD-Lösung. Closed Source bedeutet, dass ich die lib selbst nicht modifizieren kann, um sie threadsicher zu machen. Daher muss ich jeden Funktionsaufruf in einem separaten Prozess ausführen. Was ich suche, ist eine einfache Lösung zum Lastenausgleich/Verbinden der Prozesse. In Scala würde ich Akka mit Arbeitern als Remote-Knoten verwenden, die in einer separaten JVM ausgeführt werden. – Chronos
ah, also willst du die Funktion mehrfach an verschiedenen Eingängen berechnen? das ist überhaupt nicht klar von deiner Frage, du möchtest vielleicht die ersten paar Sätze bearbeiten, um es zu erwähnen :) –