2012-05-12 8 views
6

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 

潜在的なフレームワークは、私がすでにある

に見えた
  1. MPI:クライアント(ハスケル)< - MPI - >ブローカー(C++)< - - MPI - >労働者(C++)< - >のLib(C++)

  2. ZeroMQ:クライアント(ハスケル)< - ZeroMQ - >ブローカー(C++)< - ZeroMQ - >ワーカー(C++)< - >のLib(C++)

  3. クラウドハスケル:クライアント(ハスケル)< - CloudHaskell - >労働者(ハスケル)< - FFI - >のLib(C++)

  4. Gearman

  5. アーラン:クライアント(ハスケル)< - アーラン - >ブローカー(アーラン)< - - Erlang CN ode - > Worker(C++)

各アプローチには長所と短所があります。

  1. MPIは多くのセキュリティ上の問題を引き起こし、非常に重いソリューションです。

  2. ZeroMQは素晴らしい解決策ですが、私はブローカー/ロードバランサなどを自分で書く必要があります(特に、信頼性の向上は些細なものではありません)。

  3. CloudHaskellは非常に成熟していません。

  4. GearmanはWindowsでは実行されず、Haskellバインディングもありません。私はjava-gearman-serviceについて知っていますが、Cデーモンよりも成熟しておらず、いくつかの他の問題があります(例えば、ドキュメントがない、しばらくの間、タスクの入って来る流れがない場合など)。

  5. 1と似ており、第三者の言語を使用する必要があります。

ありがとう!

+0

同じデータを扱う関数を複数のコアに配布して安全に失敗させようとしていますか?そうでない場合は、クローズドソース関数をどのように並列化できますか? –

+0

私はSIMDソリューションを探しています。クローズされたソースは、スレッドセーフにするためにlib自体を変更することができないことを意味します。したがって、私は別のプロセスで各関数呼び出しを実行する必要があります。私が探しているのは、ロードバランシング/プロセスの接続のための簡単なソリューションです。 Scalaでは、独立したJVMで動作するリモートノードとして、Akkaをワーカーと使用します。 – Chronos

+1

ああ、異なる入力で関数を何度も計算したいのですか?これはあなたの質問からはっきりとは分かりませんが、最初の2つの文章を編集してそれを言いたいかもしれません:) –

答えて

1

使用しているライブラリがスレッドセーフではないため、並列処理の抽象化としてプロセスを使用することに基づいたソリューションが必要になります。 Parモナドを使用して見たい例は、多くのスパークが同じスレッドに存在するスパークまたはタスクベースの並列処理モデルを使用します。明らかに、これはあなたが探しているものではありません。

恐怖ではありません!

このように動作するHaskellにはほんの少しのパラダイムがあり、投稿の中の1つ、Cloud Haskellに言及しました。 Cloud Haskellはまだ成熟していませんが、あなたの問題を解決することはできますが、必要に応じて少し重いかもしれません。あなたは本当にただプロセス・レベルの並列抽象化を使用して、多くの地元のコアを活用するために必要がある場合は、エデンのライブラリを見て:

http://www.mathematik.uni-marburg.de/~eden/

エデンを使用すると、絶対にあなたが後にあるものを表現することができます。

f $# args 

または多数の引数の場合には、あなただけのイェオールドマップを引き出すかもしれません:詳細については

map f $# args 

をここにあなたのパーモナドベースのバージョンの線に沿って非常に簡単な例であります$#構文とエデンについてのチュートリアルのためには、以下を参照してください。

http://www.mathematik.uni-marburg.de/~eden/paper/edenCEFP.pdf

YMMVが、Haskellでは、より成熟した並列パラダイムのほとんどはあなたヘクタールを想定してスレッドの安全性のレベル、またはその使用は、純粋に並列作業を行うことができます。

Good Luck and Happy Hacking!

+0

素晴らしい - ありがとう!あとで見てみます。 – Chronos

関連する問題