Я хочу реализовать свой алгоритм фильтрации частиц параллельно в Common Lisp. Фильтрация частиц и выборка могут быть распараллелены, и я хочу сделать это для своей 4-ядерной машины. Мой вопрос заключается в том, возможно ли параллельное программирование в CL или нет, и если это возможно, есть ли хорошие чтения, учебные пособия о начале параллельных вычислений в CL.Common Lisp Параллельное программирование
ответ
Определенно выполнимо!
Bordeaux Threads project обеспечивает примитивы потоков для ряда реализаций; Я бы предложил использовать его вместо SBCL-специфичных для реализации примитивов (особенно если вы не на SBCL!).
Привилегии потока предоставлены bt, однако, довольно примитивны. Я использовал и пользовался Eager Future2, который основывается на bt для обеспечения возможностей параллелизма с использованием фьючерсов. Вы можете создавать фьючерсы, которые вычисляются лениво, с нетерпением (сразу) или спекулятивно. Спекулятивные фьючерсы вычисляются пулом потоков, размер которого можно настроить.
Я начал a little project, чтобы предоставить параллельные версии функций CL с использованием EF2, но до сих пор это всего лишь три функции, поэтому он никому не пригодится. Я, конечно же, приветствую других кодировщиков, чтобы взломать его и отправить запросы на тягу, и я надеюсь, что в будущем буду работать над этим.
Существует много других библиотек listed on Cliki, которые я сам не пробовал.
Что касается учебников, я не знаю ни одного, но предоставленные возможности параллелизма встречаются и на других языках, а хорошие алгоритмы и методы обычно не зависят от языка.
Если вы заинтересованы в чтении книги, я рекомендую Язык программирования Concurrent C. Авторы описывают новый язык программирования, основанный на C, с параллелизмом как языковой функцией. Конечно, из-за характера CL, вероятно, будет возможно реализовать эти функции, не прибегая к созданию нового компилятора. По моему мнению, в книге представлены отличные концепции параллелизма и рассматриваются многие проблемы, с которыми вы можете столкнуться или не можете рассмотреть при написании параллельных программ.
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 для параллелизма ...
Просмотрите резьбу bordeaux, если вы ищете один интерфейс в стиле POSIX для многопоточных примитивов для разных Lisps.
Если бы я искал надежную реализацию Lisp, я бы начал с CCL, а затем попробовал SBCL. Я использую CCL почти для всех своих тестов и для SBCL и LispWorks для остальных.
Библиотека фьючерсов Sedach должна обеспечивать интерфейс более высокого уровня. Также есть несколько других вкладов от разных пользователей в каталоге вклада SBCL.
Это происходит от кого-то, кто не использовал ни бордо-нити, ни библиотеку фьючерсов Седаха, а написал свою версию обоих из них. Я мог бы отправить вам мою реализацию, но эти два пакета также должны быть хорошими, и они, вероятно, являются лучшей отправной точкой.
LispWorks 6 поставляется с хорошим набором примитивов для параллельного программирования.
Обратите внимание, что, насколько мне известно нет обычных обычных реализаций Лиспа имеет одновременный сборщик мусора.
Документация для LispWorks 6 и многопроцессорные
- 1. Типовое программирование в Common Lisp?
- 2. Eager-Future2 Library: Параллельное программирование в Lisp
- 3. Common Lisp GUI Программирование с системными вызовами
- 4. Параллельное и параллельное программирование
- 5. common lisp и emacs
- 6. Параллельное программирование
- 7. Webdevelopment in Common Lisp
- 8. Common Lisp Weak References?
- 9. Scheme vs Common Lisp
- 10. + Vector Common Lisp
- 11. Common Lisp Упражнения/Проблемы
- 12. Ассоциация в Common Lisp
- 13. Common Lisp SublimeREPL
- 14. Common Lisp Timer
- 15. Matrix Transpose Common Lisp
- 16. Common Lisp Эквивалент `man`
- 17. Потоки в Common Lisp?
- 18. Common Lisp: создание каталога
- 19. Цитата из Common Lisp
- 20. Реализация Common Lisp `format`
- 21. Weird синтаксис Common Lisp
- 22. Сортировка полиномов Common Lisp
- 23. Common lisp gray streams
- 24. Циркуляр в Common Lisp
- 25. Common Lisp рекурсивных макроподстановок
- 26. Common Lisp Unbound Variable
- 27. Замены в Common Lisp
- 28. Является ли параллельное программирование таким же, как параллельное программирование?
- 29. Параллельное программирование в Julia
- 30. Параллельное программирование в R
Я также рекомендую PCALL (http://marijnhaverbeke.nl/pcall/) - очень простой, но полезная библиотека для организации параллельных (в основном) независимых вычислений. –
EF2 - это вилка PCall. Я сам не использовал PCall. –
lparallel (http://lparallel.org/) - отличная библиотека параллельного программирования, поддерживающая каналы, фьючерсы и многое другое. Он также имеет библиотеку сиблинга (используя тот же api) - lfarm, который позволяет распределенные вычисления. –