Common Lisp并行编程

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函数,但到目前为止它只有三个函数,因此它对任何人都没有多大用处.我当然欢迎其他程序员破解并提交拉取请求,我希望将来能够做更多的工作.

Cliki列出了许多其他库,我没有尝试过.

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

如果您对阅读书籍感兴趣,我建议使用并发C编程语言.作者描述了一种基于C的新编程语言,并发作为语言特性.当然,由于CL的性质,很可能无需创建新的编译器就可以实现这些功能.在我看来,本书提供了出色的并发概念,并解决了在编写并发程序时可能遇到或未能考虑的许多问题.

  • lparallel(http://lparallel.org/)是一个很棒的并行编程库,支持频道,期货等.它还有兄弟库(使用相同的api) - lfarm,它允许分布式计算. (5认同)
  • 我还推荐PCALL(http://marijnhaverbeke.nl/pcall/) - 一个非常简单但有用的库,用于组织并行(大多数)独立计算. (2认同)

Die*_*lla 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*))
Run Code Online (Sandbox Code Playgroud)

您也可以join-thread使用互斥锁等.您可以在此处阅读文档:SBCL线程.但它太低级了.您将最终错过Clojure的并发性的奇妙功能......