13

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

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

如果机器可以做到,它会同时处理1、3、5和7?这应该是函数式编程的一大优势,但我找不到一个维护的、最新的方案来做到这一点。除非我断言该函数没有副作用,否则我会使用不会并行化它的函数。

4

4 回答 4

5

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

于 2010-07-20T14:03:50.137 回答
3

事实证明,您并不真的希望编译器尝试并行化所有内容,因为即使执行简单的操作,您最终也会浪费时间协调工作,例如,

(map add1 '(1 2 3))

只在一个线程上做会更快。然而,当“add1”实际上是“真正的长计算”时,现在的许多函数式语言让你很容易实现这种并行。每种语言都有自己的方法,但我建议使用期货来利用 Racket 中的多个核心。

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

一些基本的东西

(define (pmap f xs)
  (map touch (map (λ(x) (future (λ() (f x)))) xs)))

明智地使用可以让您走得很远,但是您应该尝试将数据分块以提供给并行线程。

于 2010-07-19T23:59:28.860 回答
3

Racket有与此非常相似的期货,并且在不久的将来还将有第二种并行性方法(称为“地点”)。

于 2010-07-18T22:46:42.890 回答
2

我刚找到 Schemik

http://schemik.sourceforge.net/

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

于 2010-07-18T22:05:43.590 回答