Common Lisp Параллельное программирование - PullRequest
25 голосов
/ 22 февраля 2012

Я хочу реализовать свой алгоритм фильтрации частиц параллельно в Common Lisp.Фильтрация частиц и выборка могут быть распараллелены, и я хочу сделать это для моей 4-ядерной машины.Мой вопрос заключается в том, возможно ли параллельное программирование в CL или нет, и если это возможно, есть ли хорошие чтения, учебники о том, как начать параллельные вычисления в CL.

Ответы [ 4 ]

26 голосов
/ 22 февраля 2012

Определенно возможно!

Проект Bordeaux Threads предоставляет потоковые примитивы для ряда реализаций; Я бы предложил использовать его вместо специфичных для реализации примитивов SBCL (особенно если вы не используете SBCL!).

Тем не менее примитивы потока, предоставляемые bt, довольно примитивны. Я использовал и наслаждался Eager Future2 , который основывается на bt для обеспечения функций параллелизма с использованием фьючерсов. Вы можете создавать фьючерсы, которые рассчитываются лениво, с нетерпением (немедленно) или умозрительно. Спекулятивные фьючерсы рассчитываются пулом потоков, размер которого можно настроить.

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

Есть много других библиотек , перечисленных в Cliki , которые я сам не пробовал.

Что касается учебных пособий, я не знаю ни одного, но предоставляемые функции параллелизма встречаются и на других языках, и хорошие алгоритмы и практики обычно не зависят от языка.

Если вы заинтересованы в чтении книги, я рекомендую Язык программирования Concurrent C . Авторы описывают новый язык программирования, основанный на C, с параллелизмом как особенностью языка. Конечно, из-за природы CL, было бы возможно реализовать эти функции, не прибегая к созданию нового компилятора. По моему мнению, в книге представлены отличные концепции параллелизма и рассматриваются многие проблемы, с которыми вы можете столкнуться или не учесть их при написании параллельных программ.

8 голосов
/ 22 февраля 2012

SBCL имеет некоторую поддержку многопоточности.Это слишком низкий уровень и, насколько мне известно, не включает в себя никаких параллельных алгоритмов.Он имеет возможность создавать потоки, которые выполняют некоторую лямбда-функцию и впоследствии проверяют, завершил ли поток (присоединился к нему).Я использовал эту поддержку для создания страниц моего блога с большим ускорением (каждая страница или набор страниц в другой теме).Вы можете увидеть код здесь:

https://github.com/dsevilla/functional-mind-blog/blob/master/blog/process.lisp

Например, создание потока для каждой страницы было примерно таким:

#+sbcl
(defun generate-post-pages ()
  (map nil
       #'(lambda (post)
           (make-thread (lambda () (page-generation-function post))))
       *posts*))

Вы также можете join-threadи иметь мьютексы и т. д. Вы можете прочитать документацию здесь: SBCL Threading .Это слишком низкий уровень, хотя.Вам не хватит фантастических возможностей Clojure для параллелизма ...

4 голосов
/ 23 февраля 2012

Проверьте нити Бордо, если вы ищете единственный интерфейс в стиле POSIX-потоков с многопоточными примитивами для разных Lisp.

Если бы я искал надежную бесплатную реализацию Lisp, я быначните с CCL, а затем попробуйте SBCL.Я использую CCL для почти всех моих испытаний, а SBCL и LispWorks для остальных.

Библиотека фьючерсов Sedach должна обеспечивать интерфейс более высокого уровня.В справочном каталоге SBCL есть и другие материалы от различных пользователей.

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

3 голосов
/ 23 февраля 2012

LispWorks 6 поставляется с хорошим набором примитивов для параллельного программирования.

Обратите внимание, что, насколько мне известно, нет обычных реализаций Common Lisp имеет одновременный сборщик мусора.

Документация для LispWorks 6 и многопроцессорной обработки

...