2012-02-22 6 views
24

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

ответ

26

Определенно выполнимо!

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

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

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

Существует много других библиотек listed on Cliki, которые я сам не пробовал.

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

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

+2

Я также рекомендую PCALL (http://marijnhaverbeke.nl/pcall/) - очень простой, но полезная библиотека для организации параллельных (в основном) независимых вычислений. –

+0

EF2 - это вилка PCall. Я сам не использовал PCall. –

+5

lparallel (http://lparallel.org/) - отличная библиотека параллельного программирования, поддерживающая каналы, фьючерсы и многое другое. Он также имеет библиотеку сиблинга (используя тот же api) - lfarm, который позволяет распределенные вычисления. –

8

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

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

Для eample, создавая поток для каждой страницы было что-то вроде:

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

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

4

Просмотрите резьбу bordeaux, если вы ищете один интерфейс в стиле POSIX для многопоточных примитивов для разных Lisps.

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

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

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

3

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

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

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

Смежные вопросы