通用Lisp并行编程

25
我希望你能够帮我将我的粒子滤波算法用Common Lisp实现并实现并行化。粒子滤波和抽样可以进行并行化,我想在我的4核机器上进行这个操作。我的问题是,在CL中进行并行编程是否可行,如果可行的话,有没有关于在CL中开始并行计算的好读物或教程。请确保不改变原意。
4个回答

26

绝对可行!

Bordeaux Threads 项目为许多实现提供了线程原语;我建议使用它来代替 SBCL 的特定于实现的原语(特别是如果您不在 SBCL 上!)。

bt 提供的线程原语相当基础。 我曾经使用并喜欢过Eager Future2,它在 bt 基础上提供了使用 futures 的并发功能。 您可以创建懒惰计算、急切计算或投机计算的 futures。 投机计算的 futures 是由可以自定义大小的线程池计算的。

我开始了一个小项目,使用 EF2 提供 CL 函数的并行版本,但目前只有大约三个函数,对任何人都没有太多用处。 当然,我欢迎其他程序员对其进行修改并提交拉取请求,并希望将来能在此方面做更多的工作。

还有许多其他的库在 Cliki 上列出,我自己没有尝试过。

至于教程,我不知道有哪些,但所提供的并发功能在其他语言中也可以找到,并且良好的算法和实践通常不是特定于语言的。

如果您有兴趣阅读一本书,我推荐《并发 C 编程语言》。 作者描述了一种基于 C 的新编程语言,具有并发性作为语言特性。 当然,由于 CL 的性质,可能可以在不创建新编译器的情况下实现这些功能。 在我看来,该书呈现了出色的并发概念,并解决了您在编写并发程序时可能会遇到或忽略的许多问题。


2
我还推荐使用 PCALL(http://marijnhaverbeke.nl/pcall/)这个非常简单但实用的库来组织并行(大多数情况下是独立的)计算。 - Vsevolod Dyomkin
EF2是PCall的一个分支。我自己没有使用过PCall。 - Samuel Edwin Ward
5
lparallel(http://lparallel.org/)是一个出色的并行编程库,支持通道、未来等功能。它还有一个同级库(使用相同的API)- lfarm,可以实现分布式计算。 - Daniel Kochmański
@DanielKochmański,看起来功能很强大。我得试一试。 - Samuel Edwin Ward

8

SBCL有一些多线程支持。它的级别太低,并且据我所知,不包括任何并行算法。它只有创建执行某个lambda函数的线程的可能性,然后在测试线程是否已完成(加入它)后。我使用这种支持以极快的速度生成我的博客页面(每个页面或一组页面在不同的线程中)。您可以在此处查看代码:

https://github.com/dsevilla/functional-mind-blog/blob/master/blog/process.lisp

例如,为每个页面生成一个线程的代码大致如下:
#+sbcl
(defun generate-post-pages ()
  (map nil
       #'(lambda (post)
           (make-thread (lambda () (page-generation-function post))))
       *posts*))

你也可以join-thread,并使用互斥锁等。你可以在这里阅读文档: SBCL Threading。但是这些内容都比较底层,你可能会错过Clojure在并发方面的出色功能...

4

如果你正在寻找适用于不同Lisp的多线程原语的单一POSIX-threads风格接口,那么可以考虑使用bordeaux threads库。

如果我要寻找可靠的免费Lisp实现,我会从CCL开始,然后再试试SBCL。我几乎在所有的测试中都使用CCL,并在剩下的部分中使用SBCL和LispWorks。

Sedach的futures库提供了更高级别的接口。此外,在SBCL的contrib目录中还有其他各种用户的贡献。

这是来自一个既没有使用过bordeaux-threads也没有使用过Sedach's futures library的人的建议,他们都开发了自己的版本。我可以把我的实现发给你,但是这两个包也被认为是很好的,并且它们可能是更好的起点。


3
LispWorks 6提供了一组很好的原语,用于并发编程。
需要注意的是,据我所知,通常的Common Lisp实现都没有并发垃圾回收器。
LispWorks 6和多处理文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接