Существует ли реализация схемы, которая распараллеливается?

Существует ли реализация схемы R5RS или выше, которая выполняет параллелизацию? Например, если я скажу:

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

он будет обрабатывать 1, 3, 5 и 7 одновременно, если машина может это сделать? Это должно быть одним из больших преимуществ функционального программирования, но я не могу найти обновленную, современную схему, которая это делает. Я был бы в порядке с тем, который не распараллеливал бы его, если я не буду утверждать, что функция не имеет побочных эффектов.

Ответы

Ответ 1

Я разработчик Schemik, и я думаю, что это схема, которую вы ищете. Проект по-прежнему развивается и поддерживается. В начале этого года я выпустил версию, которая улучшает совместимость с R5RS. К сожалению, Schemik - это исследовательский проект, ориентированный на процесс оценки выражений, поэтому его стандартная библиотека по-прежнему относительно небольшая. Есть ли какая-то особенность, которую вы пропустили в Schemik?

Ответ 2

Racket имеет futures которые делают что-то очень похожее на это, а также будут иметь второй подход для parallelism в ближайшем будущем (который будет называться "местами" ).

Ответ 3

Оказывается, вы действительно не хотите, чтобы компилятор пытался распараллелить все, потому что тогда вы в конечном итоге тратите время на координацию усилий, даже когда делаете что-то простое,

(map add1 '(1 2 3))

что было бы быстрее сделать только один поток. Тем не менее, многие функциональные языки в эти дни облегчают вам эту параллель, когда "add1" на самом деле "действительно длинный". У каждого языка есть свой подход, но я бы рекомендовал использовать несколько ядер в Racket, используя фьючерсы.

В то время как компилятор, решающий вещи автоматически для вас, хорош, это не плохой компромисс, чтобы изменить "карту" на "pmap", где вы думаете, что это может помочь, а не справляться с замедлением в других местах, потому что компилятор слишком амбициозен.

Что-то основное, как

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

может быть довольно удачным, если использовать его разумно, но вы должны поэкспериментировать с разбиением ваших данных на параллельные потоки.

Ответ 4

Я только что нашел Schemik

http://schemik.sourceforge.net/

который, как представляется, поддерживается по меньшей мере до 2009 года, хотя я не знаю, был ли он R5RS.