Подтвердить что ты не робот

Общее Lisp Параллельное программирование

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

4b9b3361

Ответ 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 и многопроцессорности