6

1 つの関数 f :: ByteString -> ByteString を提供するクローズド ソースの非スレッド セーフ C++ 共有ライブラリがあります。この関数の実行時間は、1 秒から数時間です。

計算を複数のコア/サーバー (SIMD) に分散する方法を探しています。

一言で言えば、機能を提供するフレームワークを探しています

    g :: Strategy b -> (a -> b) -> a -> b

シーケンシャルにしか呼び出せない関数を、Haskell の他の純粋な関数と同じように動作する関数に持ち上げます。

たとえば、次のように書けるようになりたいです。

    parMap rwhnf f args -- will not work

f は FFI を介して非スレッド セーフ ライブラリで C 関数を呼び出すため、これは機能しません。したがって、関数 f を、ジョブ キューを保持し、タスクを N 個の個別のプロセスにディスパッチする関数 g に置き換えることができます。プロセスは、ローカルまたは分散で実行できます。

    parMap rwhnf g args -- should works

私がすでに調べた潜在的なフレームワークは

  1. MPI : クライアント (Haskell) <-- MPI --> ブローカー (C++) <-- MPI --> ワーカー (C++) <--> ライブラリ (C++)

  2. ZeroMQ : クライアント (Haskell) <-- ZeroMQ --> ブローカー (C++) <-- ZeroMQ --> ワーカー (C++) <--> ライブラリ (C++)

  3. Cloud Haskell : クライアント (Haskell) <-- CloudHaskell --> ワーカー (Haskell) <-- FFI --> Lib (C++)

  4. ギアマン

  5. Erlang : クライアント (Haskell) <-- Erlang --> ブローカー (Erlang) <-- Erlang C ノード --> ワーカー (C++)

それぞれのアプローチには長所と短所があります。

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

  2. ZeroMQ は優れたソリューションですが、ブローカー/ロード バランサーなどをすべて自分で作成する必要があります (特に、信頼性を正しくすることは簡単ではありません)。

  3. CloudHaskell はあまり成熟していないように見えます。

  4. Gearman は Windows では動作せず、Haskell バインディングもありません。java-gearman-service については知っていますが、C デーモンよりも成熟度が低く、他にもいくつかの問題があります (たとえば、doc がない、しばらくタスクの受信フローがない場合にシャットダウンするなど)。

  5. 1 に似ており、第 3 言語を使用する必要があります。

ありがとう!

4

1 に答える 1

1

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

恐れるな!

Haskellにはこのように機能するパラダイムがほんのわずかしかなく、あなたはそれらの1つであるCloudHaskellについて投稿しました。Cloud Haskellは「成熟」していませんが、問題を解決することはできますが、必要に応じて少し重いかもしれません。プロセスレベルの並列抽象化を使用して多くのローカルコアを実際に利用する必要がある場合は、Edenライブラリを確認してください。

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

エデンを使えば、自分が何を求めているのかを絶対に表現できます。これは、ParMonadベースのバージョンに沿った非常に単純な例です。

f $# args

または、多くの議論の場合、あなたはただあなたがたの古い地図を引き出すかもしれません:

map f $# args

$#構文の詳細と、Edenのチュートリアルについては、以下を参照してください。

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

Yaskellのより成熟した並列パラダイムのほとんどとしてのYMMVは、スレッドセーフのレベルがあるか、またはその使用が純粋な方法で並列作業を実行できることを前提としています。

幸運とハッピーハッキング!

于 2012-07-12T19:15:54.353 に答える