Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/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
公共Lisp并行采样_Lisp_Common Lisp_Parallel Processing_Probability - Fatal编程技术网

公共Lisp并行采样

公共Lisp并行采样,lisp,common-lisp,parallel-processing,probability,Lisp,Common Lisp,Parallel Processing,Probability,假设我想从概率分布中抽取样本。在下面的例子中,我在0和1之间画了一些均匀分布的rv,画了10000次。我不关心向量中随机样本的顺序,毕竟它们是随机的 (setf my-vec (make-sequence 'vector 10000 :initial-element 0)) (loop :for i :from 0 :to 9999 :do (setf (svref my-vec i) (random 1.0))) 我有一台多核机器,我想并行实现上面的代码。(即,假设我有4个核,在一个核

假设我想从概率分布中抽取样本。在下面的例子中,我在0和1之间画了一些均匀分布的rv,画了10000次。我不关心向量中随机样本的顺序,毕竟它们是随机的

(setf my-vec (make-sequence 'vector 10000 :initial-element 0))
(loop :for i :from 0 :to 9999 :do
   (setf (svref my-vec i) (random 1.0)))
我有一台多核机器,我想并行实现上面的代码。(即,假设我有4个核,在一个核中采样2500个,最后将所有样本附加到一个向量中。我以前问过
这里。假设我在CL和编程方面完全是新手,那么我解决这个问题的方法应该是什么?我不需要并行化的高级特性,我只想将采样的计算负载平均分配到机器内核。如果你能指出并行化的一些步骤或一些在线教程我可以从中受益的所有东西都非常好。提前感谢您。

您需要一个通用的Lisp实现,它具有多核功能。例如CCL、LispWorks和在某些平台上(IIRC)SBCL

下面是一个使用LispWorks 6.1及其多处理功能的简单示例。 它使用一个称为屏障的构造。进程在屏障上等待,直到足够多的进程到达。这里它意味着足够多的线程已经完成了向量初始化

启动线程的典型函数是
PROCESS-RUN-function

(defun make-random-vector (&key (size 10000) (n-threads 4))
  (let ((vector  (make-sequence 'vector size :initial-element 0))
        (barrier (mp:make-barrier (1+ n-threads)))
        (delta   (truncate size n-threads)))
    (loop for i below n-threads
          do (mp:process-run-function
              "init"
              nil
              (lambda (barrier vector start end)
                (loop for i from start below end do
                      (setf (svref vector i) (random 1.0)))
                (mp:barrier-wait barrier :pass-through t))
              barrier
              vector
              (* i delta)
              (+ delta (* i delta))))
    (mp:barrier-wait barrier)
    vector))

这是一个很好的例子。问题:每个线程向同一个数组写入的b/c是否有任何减速?如果为每个线程创建单独的数组,然后在最后加入,会不会更快?@claytontstanley:当然,尝试一下是有意义的。我考虑过这一点,但我不想让代码对示例来说太复杂。Th示例中已经给出了划分工作、启动工作线程和使用屏障进行同步的基本思想。@RainerJoswig,我正在使用CCL。与LispWorks相比,它是否有任何具体的缺点?用CCL编写的代码是否与上述代码一样紧凑?非常感谢。@YBE:CCL与Lis相比的主要缺点是什么pWorks可能是因为它为多处理IIRC提供了不太详细的内置库支持。