Есть ли реализация схемы, которая распараллеливает? - PullRequest
13 голосов
/ 19 июля 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 20 июля 2010

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

3 голосов
/ 19 июля 2010

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

3 голосов
/ 20 июля 2010

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

(map add1 '(1 2 3))

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

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

Что-то простое, как

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

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

2 голосов
/ 19 июля 2010

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

http://schemik.sourceforge.net/

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

...