我想在Common Lisp中并行实现我的粒子滤波算法。粒子过滤和采样可以并行化,我想为我的4核机器做这个。我的问题是并行编程是否在CL中是可行的,如果可行,是否有任何良好的读数,关于在CL中开始并行计算的教程。
答案 0 :(得分:26)
绝对可行!
Bordeaux Threads project为许多实现提供了线程原语;我建议使用它而不是SBCL的特定于实现的原语(特别是如果你不在SBCL上!)。
bt提供的线程原语是非常原始的。我已经使用并享受了基于bt构建的Eager Future2来提供使用期货的并发功能。您可以创建懒惰,急切(立即)或推测性计算的期货。投机期货由线程池计算,其大小可以自定义。
我开始a little project使用EF2提供CL功能的并行版本,但到目前为止它只有三个功能,因此它对任何人都没有多大用处。我当然欢迎其他程序员破解它并提交拉取请求,我希望将来能够做更多工作。
我还没有尝试过许多其他图书馆listed on Cliki。
就教程而言,我不知道,但所提供的并发功能也可以在其他语言中找到,优秀的算法和实践通常不是特定于语言的。
如果您对阅读书籍感兴趣,我建议使用并发C编程语言。作者描述了一种基于C的新编程语言,并发作为语言特性。当然,由于CL的性质,很可能无需创建新的编译器就可以实现这些功能。在我看来,本书提供了出色的并发概念,并解决了在编写并发程序时可能遇到或未能考虑的许多问题。
答案 1 :(得分: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的并发性的奇妙功能......
答案 2 :(得分:4)
如果您正在寻找针对不同Lisps的多线程基元的单个POSIX线程样式接口,请查看波尔多线程。
如果我正在寻找可靠的免费Lisp实现,我将从CCL开始,然后尝试SBCL。我在几乎所有测试中都使用CCL,剩下的就是SBCL和LispWorks。
Sedach的期货库应提供更高级别的界面。在SBCL的contrib目录中还有来自不同用户的一些其他贡献。
这来自既没有使用过波尔多线程也没有使用Sedach的期货库的人,并且已经编写了他自己的版本。我可以把你的实现发给你,但这两个包也应该是好的,它们可能是一个更好的起点。
答案 3 :(得分:3)
LispWorks 6附带了一组很好的并发编程原语。
请注意,据我所知,通常的Common Lisp实现的 none 有一个并发的垃圾收集器。
LispWorks 6和多处理的文档