Вопрос

Есть ли в реализации схемы R5RS или более высокой схемы, которая делает параллелизацию?Например, если я скажу делать:

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

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

Это было полезно?

Решение

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

Другие советы

Ракетка имеет Фьючерсы Что делать что-то очень похожее на это, и также будет иметь второй подход для параллелизма в ближайшее время (который будет называться« местами »),

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

(map add1 '(1 2 3))
.

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

В то время как компилятор решает вещи автоматически для вас, это приятно, это не плохое компромисс, чтобы изменить «карту» на «PMAP», где вы думаете, что это может помочь, а не иметь дело с замедлением в других местах, потому что компилятор был слишком амбициозным,

что-то как базовое, что и

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

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

Я только что нашел схем

http://schemik.sourceforge.net/

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top