是否有并行化的Scheme实现?

时间:2010-07-18 21:35:02

标签: functional-programming lisp scheme parallel-processing language-implementation

是否有R5RS或更高版本的Scheme实现并行化?例如,如果我说要做:

(map (lambda (x) 
        (pure-functional-stuff x))
     '(1 3 5 7 11 13))

如果机器可以同时处理1,3,5和7?这应该是函数式编程的一大优势,但我无法找到一个维护的,最新的方案来实现它。除非我声称该函数没有副作用,否则我会对那些不会并行化它的人很好。

4 个答案:

答案 0 :(得分:5)

我是Schemik的开发人员,我认为这是您正在寻找的方案。该项目仍在开发和维护。今年早些时候,我发布了一个改进与R5RS兼容性的版本。不幸的是,Schemik是一个专注于表达评估过程的研究项目,因此,其标准库仍然相对较小。您在Schemik中是否有任何特定的功能?

答案 1 :(得分:3)

Racketfutures做了与此非常相似的事情,并且在不久的将来还会有第二种并行方法(将被称为“地方”)。

答案 2 :(得分:3)

事实证明,你真的不希望编译器试图并行化所有因为那样你就会浪费时间协调工作,即使在做一些简单的事情时也是如此,

(map add1 '(1 2 3))

在一个线程上执行会更快。但是,如今,当“add1”实际上是“真正的长计算”时,许多函数式语言使您可以轻松地实现此并行。每种语言都有自己的方法,但我建议使用期货来利用Racket中的多个核心。

虽然编译器会自动为您决定事情,但将“地图”更改为“pmap”并不是一个糟糕的权衡,您认为它可能有助于而不是处理其他地方的减速因为编译器过于雄心勃勃

基本的东西

(define (pmap f xs)
  (map touch (map (λ(x) (future (λ() (f x)))) xs)))
明智地使用

可以让你走得很远,但你应该尝试将数据分块以提供给并行线程。

答案 3 :(得分:2)

我刚刚找到了Schemik

http://schemik.sourceforge.net/

似乎维持到至少2009年,但我不知道它是否是R5RS。