Какие реализации функциональных языков позволяют потокам работать параллельно?

Сборщик мусора OCaml накладывает глобальную блокировку, которая предотвращает параллельный запуск мутаторов (потоков), хотя они могут выполняться одновременно (с чередованием). Я считаю, что то же самое верно для SML/NJ и MLton, но не для PolyML, GHC, F#, Clojure и Scala.

Какие другие реализации функциональных языков позволяют потокам работать параллельно?


person J D    schedule 12.07.2009    source источник


Ответы (8)


Я рад сообщить вам, что вы правы и что F#, основанный на CLR, вообще не страдает от этого ограничения, а вместо этого выигрывает от специфических функций многопоточности, включая асинхронные рабочие процессы, процессор почтовых ящиков и предстоящая замечательная задача (.NET 4.0) Параллельная библиотека.

person em70    schedule 12.07.2009

Есть несколько хороших реализаций. На данный момент разработчики Haskell, похоже, добиваются лучших результатов (см. ICFP 2009). документ Саймона Марлоу и других, а также документ Haskell Symposium 2009 Донни Джонса и другие). Erlang довольно близко отстает, особенно если вы хотите стать распределенным.

Через шесть-двенадцать месяцев ответы могли измениться :-)

person Norman Ramsey    schedule 13.07.2009
comment
Эти результаты Haskell ничего не стоят: их параллельные реализации часто на порядки медленнее, чем большинство последовательных реализаций. - person J D; 30.12.2009
comment
@Джон: где твои доказательства? - person Norman Ramsey; 30.12.2009
comment
Сравните показатели производительности, приведенные в цитируемых вами документах, с аналогичными программами, написанными на других языках. Например, во второй статье приведены результаты производительности для параллельной быстрой сортировки (~14 с для сортировки всего 100 тыс. целых чисел), которые в 100 раз медленнее, чем приличное решение на большинстве других языков. Вы также можете сами протестировать их параллельные программы. Я провел исчерпывающее исследование наивного распараллеливания Сэйнта, примененного к четырем реализациям моего трассировщика лучей на Haskell Леннарта, и обнаружил, что одна перестала масштабироваться на 6 ядрах, а все остальные перестали масштабироваться только на 5 ядрах. - person J D; 15.02.2010
comment
Для сравнения, я написал параллельные коды линейной алгебры на F#, которые превосходят настроенный поставщиком Fortran в Intel MKL при работе на оборудовании Intel. - person J D; 16.02.2010

Haskell поддерживает параллельные потоки через Параллельный анализ данных в Haskell

person Brian Agnew    schedule 12.07.2009
comment
Data Parallel Haskell все еще довольно экспериментальный, но поддержка параллельных потоков в вашей первой ссылке намного более зрелая. DPH реализован с параллельными потоками, а не наоборот. - person GS - Apologise to Monica; 13.07.2009

И Scala, и Clojure работают на JVM, что обеспечивает реальный параллелизм без каких-либо узких мест в одной точке конфликта.

person Kevin Peterson    schedule 12.07.2009
comment
Можете ли вы порекомендовать ссылку на что-нибудь о параллельном программировании в Scala? - person J D; 31.07.2009
comment
Scala поддерживает Актеры scala-lang.org/node/242, если вам нравится эта модель, и вы можете использовать java.util.concurrency так же, как в Java. Я полагаю, что, учитывая вопрос о функциональном программировании, больше подходят Актеры. - person Kevin Peterson; 02.08.2009

Erlang реализует свои собственные процессы и расписание процессов и позволяет запускать тысячи, десятки тысяч и даже миллионы процессов Erlang (внутри одного процесса операционной системы).

В SMP и многоядерных машинах виртуальная машина Erlang будет выделять столько потоков ОС и процессов ОС для своего планировщика процессов и очереди процессов, чтобы максимально использовать базовые параллельные операции в аппаратной архитектуре.

Конечно, парадигма параллелизма, доступная для приложений, остается прежней.

person Gordon Guthrie    schedule 12.07.2009

Помимо Haskell, вы можете одновременно запускать процессы в Erlang (программирование, ориентированное на параллелизм), а также в F#, используя Параллельные расширения .NET и Асинхронные рабочие процессы.

person Ben Griswold    schedule 12.07.2009

Просто некоторые дополнения, чтобы подтвердить дальнейшие части спекулятивного списка:

  • Poly/ML поддерживает собственные потоки (потоки POSIX или потоки Windows), начиная с версии 5.2 (начиная с 2006 г.). Текущая версия Poly/ML 5.5 (лето 2012 г.) имеет улучшенную поддержку параллельного управления памятью: некоторые этапы сборки мусора используют несколько потоков, имеется специальная поддержка онлайн-обмена неизменяемыми значениями для уменьшения объема памяти, занимаемой огромными приложениями.

  • Isabelle/ML предоставляет дополнительную библиотеку будущего для потоков Poly/ML. Isabelle — это интерактивное средство доказательства теорем, но оно интегрировано с расширенной версией SML, основанной на Poly/ML.

person Makarius    schedule 04.03.2013

python не особенно функциональный язык, и с GIL он тоже не очень параллелен, но в сочетании с многопроцессорный модуль (стандартный с версии 2.6), вы получаете оба, но он не так элегантен, как чистые функциональные языки.

Краткий пример:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes
    result = pool.apply_async(f, [10])     # evaluate "f(10)" asynchronously
    print result.get(timeout=1)           # prints "100" unless your computer is *very* slow
    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"
person SingleNegationElimination    schedule 13.07.2009
comment
Я не ожидал, что этот ответ будет ужасно популярен, но, пожалуйста, объясните немного, что вы находите таким неприятным в этой технике? - person SingleNegationElimination; 14.07.2009
comment
Мой вопрос был конкретно о потоках, а не о процессах. - person J D; 31.07.2009
comment
У CPython есть проблема, связанная с параллельными потоками ядра, что препятствует его полному использованию. модуль многопроцессорности позволяет использовать почти идентичный интерфейс с процессами вместо потоков для достижения почти идентичных результатов. Этой проблемы нет в других разновидностях Python, потому что в них отсутствует GIL. - person SingleNegationElimination; 31.07.2009
comment
Я знаю. OCaml имеет ту же проблему. Это именно то, от чего я пытаюсь уйти! :-) - person J D; 17.03.2010