Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 用于白炽灯矩阵环路的轻型并行Clojure?_Multithreading_Matrix_Clojure_Parallel Processing - Fatal编程技术网

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你可能打算链接以获得该警告?