在 Lisp 领域是否有任何处理并行性的项目?我现在正在阅读 OpenMP 的白皮书,我确信这(或类似的东西)一定是任何多用途编程语言的未来。
我在网上搜索了有关 OpenMP 的 Common Lisp 的提及,但没有找到太多。那么,您知道任何将 Common Lisp 用于数据和任务并行性的项目吗?
只是为了给出某种功能的说明,我想这样的库会提供:
(defprocess some-process
(<list of processes to inherit transactions from>)
(<list of transaction defs>)
(<process creation arguments>)
"<docstring>"
(accept
(some-transaction (<transaction arglist>) ...)
(some-other-transaction (...) ...))
...
(select ...))
即它将是一个建立在多线程之上的用于管理进程的框架。
我研究了 Lars Brinkhoff 提到的两个库,这里有一个非常快速的概述:
lparallel
是一个基于另一个 Lisp 线程库的库,bordeaux-threads
. 它还实现了一些基于线程(parallel reduce、map 等)以及几个宏(parallel let)的常用功能。它也有一些新的构造,例如并行树(一种管理并行执行的构造+承诺层次结构的障碍-并行语义的基本构建块)。在我看来,好处是:- 更容易使用,
- 更便携,
- 对于想要利用典型的 Lisp 长数学以及特定于 Lisp 的编码原语(例如错误处理)的程序员,不会受到任何惩罚。
mpi
绑定。mpi
本身就是一个非常低级的库。它建立在 C 和 Fortran 语言的语义和限制之上,因此很难适应 Lisp。但是,它可能性能更好(我还没有运行任何测试),它更底层,并且它带有用于在计算机集群/网络上执行代码的框架。使用这个库传递 Lisp 对象会非常困难。即使是整数也会带来重大挑战,因为该库非常简单,并且处理机器字而不是数字。运行和调试程序也存在问题,因为mpi
会启动多个 Lisp 实例,相互竞争输入和输出......
我将尝试在我的两台机器上建立一个本地网络,看看我是否能为这种并行计算提出一个合理的设置。在那之前,看起来 usinglparallel
是迄今为止在 Lisp 中进行并行编程的最简单方法。