Я хочу реализовать алгоритм фильтрации частиц параллельно в Common Lisp. Фильтрация частиц и выборка могут быть распараллелены, и я хочу сделать это для своей 4-ядерной машины. Мой вопрос заключается в том, возможно ли параллельное программирование в CL или нет, и если это возможно, есть ли хорошие чтения, учебные пособия о начале параллельных вычислений в CL.
Общее Lisp Параллельное программирование
Ответ 1
Определенно выполнимо!
Проект Bordeaux Threads предоставляет примитивы потоков для ряда реализаций; Я бы предложил использовать его вместо SBCL-специфичных для реализации примитивов (особенно если вы не на SBCL!).
Примитивы потока предоставлены bt, однако, довольно примитивны. Я использовал и наслаждался Eager Future2, который основывается на bt для предоставления функций concurrency с использованием фьючерсов. Вы можете создавать фьючерсы, которые вычисляются лениво, с нетерпением (сразу) или спекулятивно. Спекулятивные фьючерсы вычисляются пулом потоков, размер которого можно настроить.
Я начал небольшой проект для обеспечения параллельных версий функций CL с использованием EF2, но до сих пор это всего около трех функций, поэтому он не будет очень полезен к любому. Я, конечно же, приветствую других кодировщиков, чтобы взломать его и отправить запросы на тягу, и я надеюсь, что в будущем это будет больше.
Есть много других библиотек перечисленных в Cliki, которые я сам не пробовал.
Что касается учебников, я не знаю ни одного, но предоставленные функции concurrency находятся на других языках, а хорошие алгоритмы и методы обычно не зависят от языка.
Если вы заинтересованы в чтении книги, я рекомендую язык программирования Concurrent C. Авторы описывают новый язык программирования, основанный на C, с concurrency как язык. Конечно, из-за характера CL, вероятно, будет возможно реализовать эти функции, не прибегая к созданию нового компилятора. По моему мнению, в книге представлены отличные концепции concurrency и рассматриваются многие проблемы, с которыми вы можете столкнуться или не смогли рассмотреть при написании параллельных программ.
Ответ 2
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 для concurrency...
Ответ 3
Проверьте потоки bordeaux, если вы ищете один интерфейс стиля POSIX-потоков для многопоточных примитивов для разных Lisp.
Если бы я искал надежную бесплатную реализацию Lisp, я бы начал с CCL, а затем попробовал SBCL. Я использую CCL почти для всех своих тестов и для SBCL и LispWorks для остальных.
Библиотека фьючерсов Sedach должна обеспечивать интерфейс более высокого уровня. Также есть несколько других вкладов от разных пользователей в каталоге вкладок SBCL.
Это происходит от кого-то, кто не использовал ни бордо-нитей, ни библиотеку фьючерсов Sedach, и написал свою версию обоих из них. Я мог бы отправить вам мою реализацию, но эти два пакета также должны быть хорошими, и они, вероятно, являются лучшей отправной точкой.
Ответ 4
LispWorks 6 поставляется с хорошим набором примитивов для параллельного программирования.
Обратите внимание, что, насколько мне известно, none обычных Common Lisp реализаций имеет одновременный сборщик мусора.
Документация для LispWorks 6 и многопроцессорности