1

我正在尝试探索受 CPU 限制的算法在使用 Clojure 扩展到多个 CPU 时的行为。该算法以连续整数的大序列作为输入,将序列划分为给定数量的子序列,然后使用 map 将函数应用于每个子序列。一旦 map 函数完成,reduce 用于收集结果。

完整代码可在Github上找到,但这里有一个示例:

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

当我在具有十二个内核的机器上执行此代码时,我看到大部分内核都在使用,而我希望只看到一个内核在使用中。

理想情况下,我想pmap使用给定数量的线程,但我无法使代码仅使用一个线程执行。

那么 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

我确实注意到您的 GitHub 代码pmap在运行的示例中使用main-;如果你改回map并行性是否持续存在?

于 2013-03-24T21:12:09.637 回答