我正在尝试探索CPU绑定算法的行为,因为它使用Clojure扩展到多个CPU。该算法将大量连续整数作为输入,将序列划分为给定数量的子序列,然后使用map将函数应用于每个子序列。地图功能完成后,使用reduce来收集结果。
Github上提供了完整的代码,但这里有一个示例:
(map computation-function (partitioning-function number-of-partitions input))
当我在具有12个内核的机器上执行此代码时,我看到大多数内核正在使用,当我希望只看到一个内核正在使用时。
理想情况下,我想使用pmap
来使用给定数量的线程,但我无法仅使用一个线程执行代码。
Clojure是如何将计算分散到多个CPU的?如果是这样,我能做些什么来控制这种行为吗?
答案 0 :(得分: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
并行性仍然存在吗?