2012-02-22 86 views
24

我想在Common Lisp中并行实现我的粒子滤波算法。粒子滤波和采样可以并行,我想为我的4核机器做到这一点。我的问题是,并行编程在CL中是否可行,如果可行,是否有任何良好的读数,关于在CL中开始并行计算的教程。Common Lisp并行编程

回答

26

绝对可行!

Bordeaux Threads project为许多实现提供了线程原语;我建议使用它而不是SBCL的特定于实现的原语(尤其是如果您不在SBCL上!)。

线程原语是由bt提供的,但是很原始。我已经使用并享受了基于bt的Eager Future2以提供使用期货的并发功能。您可以创建延迟,急切(立即)或推测性计算的期货。投机期货是由一个线程池计算的,其大小可以定制。

我开始用a little project来提供使用EF2的CL函数的并行版本,但它目前只有三个函数,所以对任何人都没有多大用处。当然,我也欢迎其他编码人员对其进行破解并提交请求,希望将来能对此做更多的工作。

还有很多其他库listed on Cliki,我还没有尝试过自己。

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

如果你有兴趣看书,我推荐并行C编程语言。作者描述了一种基于C语言的新编程语言,并发语言功能。当然,由于CL的本质,可能无需创建新的编译器就可以实现这些功能。在我看来,这本书提出了极好的并发概念,并解决了在编写并发程序时可能遇到或未考虑的许多问题。

+2

我也建议PCALL(http://marijnhaverbeke.nl/pcall/) - 一个很简单的,但用于组织并行(大部分)独立计算的有用库。 – 2012-02-22 21:54:46

+0

EF2是PCall的一个分支。我自己并没有使用PCall。 – 2012-02-22 21:59:05

+5

lparallel(http://lparallel.org/)是一个伟大的并行编程库,支持信道,期货等。它也有兄弟库(使用相同的API) - lfarm,它允许分布式计算。 – 2015-05-01 13:10:01

8

SBCL有一些多线程支持。它水平太低,据我所知,不包含任何并行算法。它只是创建线程的可能性来执行一些lambda函数,然后在线程完成后加以测试(加入它)。我使用这种支持以很快的速度生成我的博客页面(每个页面或一组页面在不同的线程中)。你可以在这里看到的代码:

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

对于eample,产生每个页面线程是这样的:

#+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线程式接口,请查看bordeaux线程。

如果我正在寻找一个可靠的免费Lisp实现,我会从CCL开始,然后尝试SBCL。我几乎所有的测试都使用CCL,其余的则使用SBCL和LispWorks。

Sedach期货库应该提供更高级别的接口。在SBCL的contrib目录中还有来自不同用户的其他一些贡献。

这从别人谁使用了既不波尔多线程或Sedach期货库和已用自己的这两个的版本到来。我可以给你我的实现,但是这两个包也应该是不错的,而且他们可能是一个更好的起点。

3

LispWorks 6有一个很好的原语为并发编程的。

请注意,虽然在我的知识没有通常的Common Lisp实现有一个并发的垃圾收集器。

的文档LispWorks 6和多