Каково состояние возможностей параллелизма OCaml?
Я заинтересован в использовании OCaml для проекта, однако я не уверен, где его возможности параллелизации больше. Есть ли способность передавать сообщения в OCaml? Может ли OCaml эффективно использовать более одного процессора?
Большинство из того, что я прочитал на эту тему, было написано в 2002-2006 годах, и я не видел ничего более недавнего.
Спасибо!
Ответы
Ответ 1
Этот выпуск 2009 года еженедельные новости Caml ( "CWN", дайджест интересных сообщений из список caml) показывает, что:
-
официальная партийная строка в потоках и Ocaml не изменилась. Заметная цитата:
(...) вообще, вся стандартная библиотека не является потокобезопасной. Вероятно, это должно быть указано в документацию для библиотеки потоков, но в документации по стандартным библиотечным модулям не так много смысла. - X. Лерой
(так как потоки Ocaml могут быть полезны, см. замечание самого виновника в другом вопросе о SO)
-
наиболее часто применяемая парадигма для parallelism - это передача сообщений, а также примечание X. Leroy OcamlMPI, предоставляя привязки для программирования в SPMD в стиле стандарт MPI. Тот же вопрос CWN, на который я указал выше, содержит ссылки на примеры и множество других связанных проектов.
-
другое решение для передачи сообщений JoCaml, новаторский новый стиль параллельных сообщений, известный как присоединиться к исчислению. Обратите внимание, что он совместим с бинарниками с компиляторами OCaml.
-
что не мешало конфискации среды выполнения, GC которой в порядке с parallelism, хотя: см. обсуждение OCAML4MC в этот другой выпуск CWN.
Существует также:
-
Netmulticore - многоканальная передача значений ocaml через сопоставленную общую память.
-
CamlP3l - компилятор для параллельных программ Caml.
-
OCaml-Java - компилятор OCaml, который испускает байт-код Java
Я не следил за недавними обсуждениями Ocaml и параллельного программирования. Я оставляю этот CW, чтобы другие могли обновить то, что я упоминаю. Было бы здорово, если бы этот вопрос мог достичь такого же уровня полноты как аналогичный для Haskell.
Ответ 2
В настоящее время среда исполнения OCaml не поддерживает параллельное выполнение нескольких ядер, поэтому один процесс OCaml не может использовать преимущества нескольких ядер. Это вряд ли изменится напрямую; направление разработчиков OCaml больше всего заинтересовано в увеличении parallelism, по-видимому, позволяет запускать несколько циклов OCaml параллельно в одном процессе; это позволит очень быстро передавать сообщения, но не позволит параллельным параллельным потокам параллельно работать в конфигурации с общей памятью. Основное зависание - сборщик мусора; несколько лет назад команда экспериментировала с параллельным GC, но вносила неприемлемые замедления в однопоточном случае.
Существует несколько проектов, а именно Functory и OCamlnet, которые предоставляют многоядерные -happy parallelism с помощью нескольких процессов.
В общем, сообщество OCaml склоняется к подходам передачи сообщений, которые могут выполняться через границы процессов (например, OCamlnet), в многопоточном режиме с однопроцессорной памятью. Если ваша программа может быть разделена на несколько процессов (многие могут!), То да, вы можете эффективно использовать несколько процессоров.
Ответ 3
BSMLlib обеспечивает упрощенный интерфейс программирования для параллельного программирования данных в OCaml.
Его выполнение сводится к передаче сообщения в стиле BSP, но оно является детерминированным и даже декларативным для подмножества OCaml.
Ключевой концепцией является "тип par, который соответствует вектору значений, по одному на процесс.
http://traclifo.univ-orleans.fr/BSML/
http://fr.wikipedia.org/wiki/Bulk_Synchronous_Parallel_ML
Гаэтан Хейнс
Университет Париж-Эст