Есть ли реализация Scheme, которая распараллеливает?

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

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

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


person JasonFruit    schedule 18.07.2010    source источник
comment
Автоматическое распараллеливание все еще встречается редко. Если какой-то энтузиаст FP говорит, что программы на языке FP «лучше распараллеливать», то он/она, вероятно, имеет в виду «вас», программиста.   -  person Rainer Joswig    schedule 19.07.2010


Ответы (4)


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

person pkrajca    schedule 20.07.2010
comment
Я копаюсь в этом сейчас. Я пока точно не знаю, но выглядит многообещающе. - person JasonFruit; 20.07.2010
comment
Это делает то, что мне нужно прямо сейчас --- спасибо! Я хотел попробовать что-то, что работает таким образом. - person JasonFruit; 22.07.2010

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

person Eli Barzilay    schedule 18.07.2010

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

(map add1 '(1 2 3))

это было бы быстрее просто сделать в одном потоке. Однако многие функциональные языки в наши дни упрощают выполнение этой параллели, когда «add1» на самом деле является «действительно долгим вычислением». Каждый язык имеет свой собственный подход, но я бы рекомендовал использовать несколько ядер в Racket, используя фьючерсы.

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

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

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

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

person Anthony    schedule 19.07.2010

Я только что нашел Шемика

http://schemik.sourceforge.net/

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

person Peter G.    schedule 18.07.2010
comment
Меня смущает, что он претендует на звание диалекта Scheme и Common Lisp. Они имеют в виду диалект Лиспа? - person JasonFruit; 19.07.2010
comment
Он действительно приближается к R5RS, хотя мне пришлось копаться в комментариях коммита, чтобы выяснить это. Серьезно недостаточно документирован, в целом, и имеет коэффициент шины 1, но у него есть потенциал. - person JasonFruit; 20.07.2010