1

Clojureを使用して複数のCPUにスケーリングするときの、CPUバウンドアルゴリズムの動作を調査しようとしています。このアルゴリズムは、連続する整数の大きなシーケンスを入力として受け取り、シーケンスを指定された数のサブシーケンスに分割し、mapを使用して各サブシーケンスに関数を適用します。マップ機能が完了すると、reduceを使用して結果が収集されます。

完全なコードはGithubで入手できますが、サンプルは次のとおりです。

(map computation-function (partitioning-function number-of-partitions input))

このコードを12コアのマシンで実行すると、使用中のコアが1つだけであると予想されるときに、ほとんどのコアが使用されていることがわかります。

理想的にはpmap、指定された数のスレッドを使用するために使用したいのですが、1つのスレッドのみを使用してコードを実行させることはできません。

では、Clojureは計算を複数のCPUに分散していますか?もしそうなら、この動作を制御するために私ができることはありますか?

4

1 に答える 1

4

私の理解では、pmap複数のコアをmap使用し、現在のスレッドのみを使用します。(両方が使用可能なすべてのコアを使用している場合、ライブラリに両方の関数を含める意味はありません。)

次の簡単な実験は、pmapが別々のスレッドを使用し、使用mapしないことを示しています。

(defn something-slow [x]
  (Thread/sleep 1000))

(map something-slow (range 5))
;; Takes 5 seconds
(pmap something-slow (range 5))
;; Takes 1 second

pmapで実行される例では、GitHubコードが使用していることに注意してくださいmain-。に戻るとmap、並列処理は持続しますか?

于 2013-03-24T21:12:09.637 に答える