我想在Common Lisp中并行实现我的粒子滤波算法。粒子滤波和采样可以并行,我想为我的4核机器做到这一点。我的问题是,并行编程在CL中是否可行,如果可行,是否有任何良好的读数,关于在CL中开始并行计算的教程。Common Lisp并行编程
回答
绝对可行!
Bordeaux Threads project为许多实现提供了线程原语;我建议使用它而不是SBCL的特定于实现的原语(尤其是如果您不在SBCL上!)。
线程原语是由bt提供的,但是很原始。我已经使用并享受了基于bt的Eager Future2以提供使用期货的并发功能。您可以创建延迟,急切(立即)或推测性计算的期货。投机期货是由一个线程池计算的,其大小可以定制。
我开始用a little project来提供使用EF2的CL函数的并行版本,但它目前只有三个函数,所以对任何人都没有多大用处。当然,我也欢迎其他编码人员对其进行破解并提交请求,希望将来能对此做更多的工作。
还有很多其他库listed on Cliki,我还没有尝试过自己。
就教程而言,我不知道任何,但提供的并发功能也可以在其他语言中找到,而良好的算法和实践通常不是特定于语言的。
如果你有兴趣看书,我推荐并行C编程语言。作者描述了一种基于C语言的新编程语言,并发语言功能。当然,由于CL的本质,可能无需创建新的编译器就可以实现这些功能。在我看来,这本书提出了极好的并发概念,并解决了在编写并发程序时可能遇到或未考虑的许多问题。
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的奇妙功能并发...
如果您正在为不同的Lisp寻找针对多线程原语的单个POSIX线程式接口,请查看bordeaux线程。
如果我正在寻找一个可靠的免费Lisp实现,我会从CCL开始,然后尝试SBCL。我几乎所有的测试都使用CCL,其余的则使用SBCL和LispWorks。
Sedach期货库应该提供更高级别的接口。在SBCL的contrib目录中还有来自不同用户的其他一些贡献。
这从别人谁使用了既不波尔多线程或Sedach期货库和已用自己的这两个的版本到来。我可以给你我的实现,但是这两个包也应该是不错的,而且他们可能是一个更好的起点。
LispWorks 6有一个很好的原语为并发编程的。
请注意,虽然在我的知识没有通常的Common Lisp实现有一个并发的垃圾收集器。
的文档LispWorks 6和多
- 1. common lisp编程EQ错误
- 2. Common Lisp中丰富的类型编程?
- 3. 在Common Lisp中编写++宏
- 4. Common Lisp a Lisp-n?
- 5. 在ideone.com上运行Common Lisp?
- 6. 麻烦运行Common Lisp
- 7. Step Eval Common Lisp
- 8. Common Lisp Loop Trouble
- 9. 与Common Lisp中
- 10. Common Lisp流?
- 11. Common Lisp中
- 12. Common Lisp Binary Tree
- 13. Scheme或Common Lisp
- 14. “unfold”for common lisp?
- 15. common lisp和emacs
- 16. Common Lisp Timer
- 17. Common Lisp SublimeREPL
- 18. Scheme或Common Lisp?
- 19. Predicates Common Lisp
- 20. Scheme vs Common Lisp
- 21. 与Clozure Common Lisp的编译二进制
- 22. 规则Common Lisp中
- 23. 如果Common Lisp中
- 24. 的#ifndef Common Lisp中
- 25. 关于Common Lisp中
- 26. Common Lisp弱引用?
- 27. Common Lisp:在后台运行函数
- 28. Common Lisp的串联和换行符
- 29. Common Lisp的:写外部程序输入
- 30. Clozure Common Lisp - TCP Socket编程 - 发送回复
我也建议PCALL(http://marijnhaverbeke.nl/pcall/) - 一个很简单的,但用于组织并行(大部分)独立计算的有用库。 – 2012-02-22 21:54:46
EF2是PCall的一个分支。我自己并没有使用PCall。 – 2012-02-22 21:59:05
lparallel(http://lparallel.org/)是一个伟大的并行编程库,支持信道,期货等。它也有兄弟库(使用相同的API) - lfarm,它允许分布式计算。 – 2015-05-01 13:10:01