Concurrency 公共Lisp并行编程

Concurrency 公共Lisp并行编程,concurrency,parallel-processing,lisp,common-lisp,Concurrency,Parallel Processing,Lisp,Common Lisp,我想在CommonLisp中并行实现我的粒子滤波算法。粒子过滤和采样可以并行化,我想在我的4核机器上实现这一点。我的问题是并行编程在CL中是否可行,如果可行,是否有好的阅读资料,关于在CL中开始并行计算的教程。SBCL有一些多线程支持。它的级别太低,据我所知,不包括任何并行算法。它只是可以创建执行一些lambda函数的线程,然后测试线程是否已经完成(加入它)。我使用这种支持以极大的速度生成我的博客页面(不同线程中的每个页面或页面集)。您可以在此处看到代码: 对于eample,为每个页面生成一个

我想在CommonLisp中并行实现我的粒子滤波算法。粒子过滤和采样可以并行化,我想在我的4核机器上实现这一点。我的问题是并行编程在CL中是否可行,如果可行,是否有好的阅读资料,关于在CL中开始并行计算的教程。

SBCL有一些多线程支持。它的级别太低,据我所知,不包括任何并行算法。它只是可以创建执行一些lambda函数的线程,然后测试线程是否已经完成(加入它)。我使用这种支持以极大的速度生成我的博客页面(不同线程中的每个页面或页面集)。您可以在此处看到代码:

对于eample,为每个页面生成一个线程类似于:

#+sbcl
(defun generate-post-pages ()
  (map nil
       #'(lambda (post)
           (make-thread (lambda () (page-generation-function post))))
       *posts*))
您还可以
加入线程
,并拥有互斥锁等。您可以在此处阅读文档:。不过,这太低级了。您最终将错过Clojure在并发性方面的出色功能…

绝对可行

为许多实现提供线程原语;我建议使用它而不是SBCL的特定于实现的原语(特别是如果您不在SBCL上的话!)

然而,bt提供的线程原语是相当原语的。我已经使用并享受了它,它基于bt,使用futures提供并发特性。您可以创建延迟、急切(立即)或投机计算的期货。投机期货由线程池计算,线程池的大小可以自定义

我开始使用EF2提供CL函数的并行版本,但到目前为止只有三个函数,所以对任何人都没有多大用处。当然,我欢迎其他程序员对其进行破解并提交pull请求,我希望将来在这方面做更多的工作

还有很多其他的图书馆我自己都没有试过

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


如果你有兴趣阅读一本书,我推荐并发C编程语言。作者描述了一种新的编程语言,它基于C语言,以并发性为语言特征。当然,由于CL的性质,可能不需要创建新的编译器就可以实现这些特性。在我看来,这本书提供了优秀的并发概念,并解决了在编写并发程序时可能遇到或无法考虑的许多问题。如果你在寻找一个不同的LISP的多线程原语的单POSIX线程风格接口,请检查波尔多线程。 如果我正在寻找一个可靠的免费Lisp实现,我会从CCL开始,然后尝试SBCL。我几乎所有的测试都使用CCL,其余的测试使用SBCL和LispWorks

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


这来自于一个既没有使用波尔多线程也没有使用塞达克的未来库的人,他已经编写了这两个线程的自己版本。我可以向您发送我的实现,但这两个包也应该很好,而且它们可能是一个更好的起点。

LispWorks 6提供了一组很好的并发编程原语

请注意,据我所知,没有一个常见的Lisp实现具有并发垃圾收集器

LispWorks 6和多处理的文档


我还推荐PCALL()——一个非常简单但有用的库,用于组织并行(大部分)独立计算。EF2是PCALL的分支。lparallel()是一个很棒的并行编程库,支持通道、期货等。它还有兄弟库(使用相同的api)-lfarm,它允许分布式计算。@DanielKochmański,看起来功能非常好。我得试一试。