2009-11-09 8 views
12

私は、適度に高価な関数を大きな遅延セグメントに並列にマップすることを検討しています。 pmapは素晴らしいですが、私はコンテキスト切り替えに多くを失っています。私は、各スレッドに渡される作業のチャンクのサイズを増やす必要があると思います。中規模の関数を効率的に並列に適用する方法

私はseqをチャンクに分割し、各チャンクにその関数をpmapして再結合する関数を書いています。これは「うまくいく」が結果は壮観ではありませんでした。元のコードは基本的に次のようになります。

これを怠け者にしている間に、どうやってこれを作ることができますか?

答えて

0

私は、JDK 7に統合するように設定されたFork/Joinライブラリを見ていきます。これは、スレッドプール、ワークスティールスケジューラを使用したデータセット上のノンブロッキング、分割・征服の計算に最適化された軽量なスレッドモデルです。緑色の糸。

Some workは、parブランチでフォーク/結合APIをラップするために行われましたが、メイン(yet)にマージされていません。

+1

:それはちょうどマップのような複数の コレクションを、受け取ることができます。 – Runevault

+1

@ルーンヴォルトどのように心が吹いているのですか?フォークのラッパーのように見えます。 – Surya

1

もし何かややエキゾチックなものに気付かないのであれば(実際にはかなりのスピードアップと引き換えに)、Penumbraライブラリの作者が行った作業を調べることもできます。これはeasy access to the GPUです。

3

私はppmap関数をhttp://www.braveclojure.com/zombie-metaphysics/から見ています。チャンクサイズを指定しながらpmapすることができます。

この問題を解決するには、粒度を大きくするか、並列化されたタスクごとに処理量を増やす必要があります。この場合、タスク は、コレクション関数の1つの要素にマッピング関数を適用することです。 穀物の大きさは標準単位では測定されませんが、デフォルトでは 粒度はpmapの1つです。グレインサイズを2つに増やすと は、2つの要素 の代わりにマッピング関数を適用していることを意味するので、タスクが実行されているスレッドはより多くの作業をしています。 [...]このテクニックを楽しいものとして、パーティション化されたpmapのための関数 ppmapと一般化することができます。あなたは、私が希望パーブランチを待つことができるかどううん、私はそれを見てきました少しのビットが心吹いている

(defn ppmap 
    "Partitioned pmap, for grouping map ops together to make parallel 
    overhead worthwhile" 
    [grain-size f & colls] 
    (apply concat 
    (apply pmap 
      (fn [& pgroups] (doall (apply map f pgroups))) 
      (map (partial partition-all grain-size) colls)))) 
(time (dorun (ppmap 1000 clojure.string/lower-case orc-name-abbrevs))) 
; => "Elapsed time: 44.902 msecs" 
+1

リンクは行きました、stackoverflowは永遠です... braveclojureからの関連する引用を含めて、この答えが長期的に文脈にとどまることを確認してください。 (この質問もほぼ7歳です) –

関連する問題