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

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

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

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

4 ответа

Решение

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

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

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

(map add1 '(1 2 3))

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

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

Нечто основное, как

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

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

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

http://schemik.sourceforge.net/

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

Другие вопросы по тегам