gpt4 book ai didi

lisp - Common Lisp 并行采样

转载 作者:太空宇宙 更新时间:2023-11-03 18:47:02 24 4
gpt4 key购买 nike

假设我想从某个概率分布中抽取样本。在下面的例子中,我在 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 个,最后将所有样本附加到一个向量中。我之前问过 Common Lisp Parallel Programming这里。假设我是 CL 和一般编程的新手,我应该如何解决这个问题?我不需要并行化的高级特性,我只是想将采样的计算负载平均分配给机器内核。如果您能指出一些并行化的步骤或一些我可以从中受益的在线教程内容,那将是非常好的。非常感谢。

最佳答案

您需要一个具有多核能力的 Common 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))

关于lisp - Common Lisp 并行采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9572457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com