YBE*_*YBE 25 lisp parallel-processing concurrency common-lisp
我想在Common Lisp中并行实现我的粒子滤波算法.粒子过滤和采样可以并行化,我想为我的4核机器做这个.我的问题是并行编程是否在CL中是可行的,如果可行,是否有任何良好的读数,关于在CL中开始并行计算的教程.
Sam*_*ard 26
绝对可行!
在波尔多线程项目提供了许多实现的线程原语; 我建议使用它而不是SBCL的特定于实现的原语(特别是如果你不在SBCL上!).
然而,bt提供的线程基元非常原始.我已经使用并享受了基于bt构建的Eager Future2,以使用期货提供并发功能.您可以创建懒惰,急切(立即)或推测性计算的期货.投机期货由线程池计算,其大小可以自定义.
我开始了一个小项目,使用EF2提供并行版本的CL函数,但到目前为止它只有三个函数,因此它对任何人都没有多大用处.我当然欢迎其他程序员破解并提交拉取请求,我希望将来能够做更多的工作.
至于教程,我不知道,但提供的并发功能也可以在其他语言中找到,而良好的算法和实践通常不是特定于语言的.
如果您对阅读书籍感兴趣,我建议使用并发C编程语言.作者描述了一种基于C的新编程语言,并发作为语言特性.当然,由于CL的性质,很可能无需创建新的编译器就可以实现这些功能.在我看来,本书提供了出色的并发概念,并解决了在编写并发程序时可能遇到或未能考虑的许多问题.
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*))
Run Code Online (Sandbox Code Playgroud)
您也可以join-thread使用互斥锁等.您可以在此处阅读文档:SBCL线程.但它太低级了.您将最终错过Clojure的并发性的奇妙功能......