13

並列化を行うR5RS以上のSchemeの実装はありますか?たとえば、私がそうすると言うなら:

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

マシンがそれを行うことができれば、それは1、3、5、および7を同時に処理しますか?これは関数型プログラミングの大きな利点の1つであると思われますが、それを実行する、維持された最新のスキームを見つけることができません。関数に副作用がないと断言しない限り、並列化しないもので問題ありません。

4

4 に答える 4

5

私はSchemikの開発者であり、あなたが探しているのはスキームだと思います。プロジェクトはまだ開発され、維持されています。今年の初めに、R5RSとの互換性を向上させるバージョンをリリースしました。残念ながら、Schemikは発現評価のプロセスに焦点を当てた研究プロジェクトであるため、その標準ライブラリはまだ比較的小さいです。Schemikで見逃している特定の機能はありますか?

于 2010-07-20T14:03:50.137 に答える
3

コンパイラにすべてを並列化させたくないことがわかりました。そうすると、次のような単純なことを行ったとしても、調整作業に時間を浪費することになります。

(map add1 '(1 2 3))

これは、1つのスレッドで実行する方が高速です。ただし、最近の多くの関数型言語では、「add1」が実際には「非常に長い計算」である場合に、これを簡単に並行させることができます。言語ごとに独自のアプローチがありますが、先物を使用してRacketの複数のコアを利用することをお勧めします。

コンパイラが自動的に物事を決定するのは良いことですが、コンパイラが野心的すぎたため、他の場所での速度低下に対処するのではなく、役立つと思われる「マップ」を「pmap」に変更することは悪いトレードオフではありません。

基本的なもの

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

慎重に使用するとかなり遠くまで到達できますが、データをチャンクアップして並列スレッドにフィードすることを試してみてください。

于 2010-07-19T23:59:28.860 に答える
3

ラケットには、これと非常によく似た何かを行う先物があり、近い将来、並列処理のための2番目のアプローチ(「場所」と呼ばれる)もあります。

于 2010-07-18T22:46:42.890 に答える
2

Schemikを見つけました

http://schemik.sourceforge.net/

R5RSかどうかはわかりませんが、少なくとも2009年までは維持されているようです。

于 2010-07-18T22:05:43.590 に答える