f:ByteString - > ByteStringという1つの関数を提供する非スレッドセーフなC++共有ライブラリがあります。この関数の実行時間は、1秒から2時間の間になることがあります。非スレッドセーフなC++ライブラリを並列化するHaskellフレームワーク
私は計算を複数のコア/サーバー(SIMD)に配布する方法を探しています。一言で言えば
、私はHaskellでは、他の純粋な機能のように振る舞う関数に順次呼び出すことができる機能を持ち上げるように機能
g :: Strategy b -> (a -> b) -> a -> b
を提供するフレームワークを探しています。例えば
、私は書くことができるようにしたい:
parMap rwhnf f args -- will not work
fはFFIを経由して非スレッドセーフlibにC関数を呼び出すので、これは動作しません。したがって、関数fをジョブキューを保持する関数gに置き換え、タスクをN個の別々のプロセスにディスパッチすることができます。プロセスがローカルで実行するか、または分散できます
parMap rwhnf g args -- should works
潜在的なフレームワークは、私がすでにある
に見えたMPI:クライアント(ハスケル)< - MPI - >ブローカー(C++)< - - MPI - >労働者(C++)< - >のLib(C++)
ZeroMQ:クライアント(ハスケル)< - ZeroMQ - >ブローカー(C++)< - ZeroMQ - >ワーカー(C++)< - >のLib(C++)
クラウドハスケル:クライアント(ハスケル)< - CloudHaskell - >労働者(ハスケル)< - FFI - >のLib(C++)
Gearman
アーラン:クライアント(ハスケル)< - アーラン - >ブローカー(アーラン)< - - Erlang CN ode - > Worker(C++)
各アプローチには長所と短所があります。
MPIは多くのセキュリティ上の問題を引き起こし、非常に重いソリューションです。
ZeroMQは素晴らしい解決策ですが、私はブローカー/ロードバランサなどを自分で書く必要があります(特に、信頼性の向上は些細なものではありません)。
CloudHaskellは非常に成熟していません。
GearmanはWindowsでは実行されず、Haskellバインディングもありません。私はjava-gearman-serviceについて知っていますが、Cデーモンよりも成熟しておらず、いくつかの他の問題があります(例えば、ドキュメントがない、しばらくの間、タスクの入って来る流れがない場合など)。
1と似ており、第三者の言語を使用する必要があります。
ありがとう!
同じデータを扱う関数を複数のコアに配布して安全に失敗させようとしていますか?そうでない場合は、クローズドソース関数をどのように並列化できますか? –
私はSIMDソリューションを探しています。クローズされたソースは、スレッドセーフにするためにlib自体を変更することができないことを意味します。したがって、私は別のプロセスで各関数呼び出しを実行する必要があります。私が探しているのは、ロードバランシング/プロセスの接続のための簡単なソリューションです。 Scalaでは、独立したJVMで動作するリモートノードとして、Akkaをワーカーと使用します。 – Chronos
ああ、異なる入力で関数を何度も計算したいのですか?これはあなたの質問からはっきりとは分かりませんが、最初の2つの文章を編集してそれを言いたいかもしれません:) –