Multithreading 用于白炽灯矩阵环路的轻型并行Clojure?
我有一个函数,它使用Multithreading 用于白炽灯矩阵环路的轻型并行Clojure?,multithreading,matrix,clojure,parallel-processing,Multithreading,Matrix,Clojure,Parallel Processing,我有一个函数,它使用for循环来修改矩阵的元素。元素方面的函数不是很大,所以我不确定处理这个问题的最佳方法。我希望机器的每个核心都有一个线程(自动检测)来执行所有这些。理想情况下,它还可以根据核心工作负载平衡执行。我已经研究过为接收工作人员创建自定义线程池,但不确定这是否可行pmap似乎很有用,但我在另一个线程中看到,如果每个操作都是未来的,那么协调开销将非常重要。你对如何处理这个问题有什么想法?下面是代码,后面有一些链接 (defn alter-matrix! [matrix] (let
for
循环来修改矩阵的元素。元素方面的函数不是很大,所以我不确定处理这个问题的最佳方法。我希望机器的每个核心都有一个线程(自动检测)来执行所有这些。理想情况下,它还可以根据核心工作负载平衡执行。我已经研究过为接收工作人员创建自定义线程池,但不确定这是否可行pmap
似乎很有用,但我在另一个线程中看到,如果每个操作都是未来的,那么协调开销将非常重要。你对如何处理这个问题有什么想法?下面是代码,后面有一些链接
(defn alter-matrix! [matrix]
(let [row-count (nrow matrix)
col-count (ncol matrix)]
; Iterate through each element by coordinates.
(for [x (range row-count)
y (range col-count)]
; Calculate whether the element will be altered.
(let [event (rand)]
; 50% chance of alteration.
(if (< event 0.50)
; Unsafely set the new element to a altered version.
(.setQuick matrix x y
; Return an altered form of the element.
(alter-element (.getQuick matrix x y))))))))
(defn alter-element [element] (let [selector (rand-int 1 4)]
(cond (= 1 selector) 1.0 (= 2 selector) (* 2.0 element) (= 3 selector) (* 0.5 element))))
(defn alter matrix![matrix]
(let[行计数(nrow矩阵)
col计数(ncol矩阵)]
;通过坐标遍历每个元素。
(对于[x(范围行计数)
y(范围列计数)]
;计算元素是否将被更改。
(让[事件(兰特)]
;50%的变更机会。
(如果(<事件0.50)
;不安全地将新元素设置为修改过的版本。
(.setQuick矩阵xy)
;返回元素的更改形式。
(改变元素(.getQuick矩阵x y()()()())))
(defn alter element[元素](让[选择器(rand int 1 4)]
(第二个(=1个选择器)1.0(=2个选择器)(*2.0元素)(=3个选择器)(*0.5元素)))
我认为可以在白炽灯矩阵上使用core.matrix操作。不确定这是否总是正确的。但是,如果是这样,您可能可以使用方便的core.matrix函数,例如
emap
。(我不会把这篇文章作为回答的一部分,因为我对这个问题的并行化、线程化等方面没有什么可说的。好吧,再说一次:我的直觉是,这里没有足够的工作值得将它发送到单独的核心,特别是因为所有线程都将修改一个公共对象,即.黑客帝国。我的直觉基于一点经验。)谢谢你的想法。矩阵的大小证明了并行执行的合理性。它足够大,甚至可以穿过CUDA。我想研究一下emap
。您在哪里找到的?emap
是Clojure矩阵库的一部分,它支持使用同一接口的多个不同的底层矩阵实现。您可以使用统一的Clojure-ey接口,并根据您的性能需求切换实现。core.matrix与白炽灯部分集成;我不确定集成项目的状态。数字Clojure谷歌集团也将是一个提出类似问题的好地方;那里的人可能有一些有用的见解。此外:SE上的Clojure程序员经常警告依赖惰性seq中的副作用的危险,例如为
产生的副作用,我有时发现这有点令人讨厌。(当然我会打电话给doall
)在看到A.Webb对我问题的回答后,我也在发出警告。你可能知道危险。(我没有放弃在惰性序列中产生副作用,但现在我更小心了。)@Mars你可能打算链接以获得该警告?