並列化する方式の実装はありますか?
質問
並列化を行うR5RS以下の方式の実装はありますか?たとえば、私がすると言うならば:
(map (lambda (x)
(pure-functional-stuff x))
'(1 3 5 7 11 13))
.
機械がそれをすることができるならば、それは同時に1,3,5、および7を処理しますか?それは機能的プログラミングの大きな利点の1つであることになっていますが、それを行う維持された最新のスキームを見つけることはできません。関数に副作用がないことをアサートしない限り、それを並列化しないでください。
解決
私はスキーマの開発者であり、あなたが探しているスキームであると思います。プロジェクトはまだ開発され維持されています。今年早く、私はR5RSとの互換性を向上させる版をリリースしました。残念ながら、スキーマは発現評価のプロセスに焦点を当てた研究プロジェクトです。したがって、その標準ライブラリはまだ比較的小さいです。Schemikであなたが逃す特定の機能はありますか?
他のヒント
あなたは実際にコンパイラがすべてを並列化しようとしたくないことが判明したので、
のようなものをするときでも時間調整の努力を無駄にするために終わった。(map add1 '(1 2 3))
.
それは1つのスレッドですぐにするのが速くなります。ただし、「ADD1」が実際に「本当に長い計算」の場合、最近の多くの機能言語はあなたがこれを並列にすることを容易にします。各言語には独自のアプローチがありますが、先物を使用してラケットに複数のコアを利用することをお勧めします。
コンパイラがあなたのために自動的に物事を決定している間は、コンパイラが野心すぎるので、他の場所での減速に対処するのではなく、「PMAP」に「マップ」を変更するのは悪いトレードオフではありません。。
(define (pmap f xs)
(map touch (map (λ(x) (future (λ() (f x)))) xs)))
.
は慎重に使用されたときにあなたをかなり遠くに得ることができますが、あなたは並列スレッドにフィードするためにあなたのデータを隠すことを試してみるべきです。
所属していません StackOverflow