Common Lisp에서 입자 필터링 알고리즘을 병렬로 구현하고 싶습니다. 파티클 필터링 및 샘플링을 병렬화 할 수 있으므로 4 코어 머신에서이 작업을 수행하려고합니다. 내 질문은 CL에서 프로그래밍이 병렬로 실행 가능한지 여부입니다. 가능한 경우 CL에서 병렬 컴퓨팅을 시작하는 데 대한 유용한 지침, 자습서가 있습니다.Common Lisp 병렬 프로그래밍
답변
확실히 가능합니다!
Bordeaux Threads project은 많은 구현을위한 스레드 기본 요소를 제공합니다. 나는 SBCL의 구현 - 특유의 프리미티브 대신에 이것을 사용할 것을 제안한다. (특히 당신이 SBCL에 있지 않다면!).
스레드 기본 요소는 bt에 의해 제공되지만 매우 원시적입니다. 나는 fture를 사용하여 동시성 기능을 제공하기 위해 bt를 기반으로 빌드 된 Eager Future2을 사용하고 즐겼습니다. lazily, eagerly (즉시), 또는 추측으로 계산 된 선물을 만들 수 있습니다. 투기 선물은 크기를 사용자 정의 할 수있는 스레드 풀로 계산됩니다.
EF2를 사용하여 CL 기능의 병렬 버전을 제공하기 위해 a little project을 시작했으나 지금까지는 세 가지 기능 만 있으므로 누구에게도 많이 사용되지는 않습니다. 물론 다른 코더들도 해킹하고 풀 요청을 제출하는 것을 환영합니다. 앞으로 더 많은 작업을 할 수 있기를 바랍니다.
내가 시도하지 않은 다른 많은 라이브러리 listed on Cliki이 있습니다.
튜토리얼에서 알 수있는 것은 없지만 제공되는 동시성 기능은 다른 언어에서도 찾을 수 있습니다. 좋은 알고리즘과 사례는 일반적으로 언어별로 다릅니다.
책을 읽는 데 관심이 있으시면 동시 C 프로그래밍 언어을 사용하는 것이 좋습니다. 저자는 C에 기반한 새로운 프로그래밍 언어를 언어 기능으로 동시성으로 설명합니다. 물론 CL의 특성상 새로운 컴파일러를 만들지 않고도 이러한 기능을 구현할 수 있습니다. 제 생각에이 책은 뛰어난 동시성 개념을 제시하며 동시 프로그램 작성시 발생할 수있는 여러 가지 문제를 해결합니다.
SBCL에는 멀티 스레딩이 지원됩니다. 그것은 너무 낮은 수준이며, 필자의 지식으로는 어떤 병렬 알고리즘도 포함되어 있지 않습니다. 그것은 람다 함수를 수행하는 스레드를 생성하고 스레드가 끝나면 (테스트에 참여한) 나중에 테스트 할 수있는 가능성을 가지고 있습니다. 그 지원을 사용하여 훌륭한 속도로 내 블로그 페이지를 생성했습니다 (각 페이지 또는 다른 스레드의 페이지 집합). 당신은 여기에 코드를 볼 수 있습니다 각 페이지에 대한 스레드를 생성, eample를 들어
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의 환상적인 기능을 놓치게 될 것입니다 ...
다른 Lisps에 대한 단일 스레드 POSIX 스레드 스타일 인터페이스를 찾으려면 bordeaux 스레드를 확인하십시오.
신뢰할 수있는 무료 Lisp 구현을 찾고 있다면 CCL로 시작한 다음 SBCL을 사용해 보겠습니다. 거의 모든 테스트와 SBCL 및 LispWorks에서 CCL을 사용합니다.
Sedach의 미래 라이브러리는 더 높은 수준의 인터페이스를 제공해야합니다. SBCL의 contrib 디렉토리에있는 여러 사용자의 다른 기여도 있습니다.
bordeaux-thread도 Sedach 's futures library도 사용하지 않았고 그 둘 모두의 자신의 버전을 작성한 사람으로부터 오는 것입니다. 나는 당신에게 나의 구현을 보낼 수 있지만,이 두 패키지는 또한 좋은 것으로되어 있고 아마도 그들은 더 나은 출발점 일 것이다.
LispWorks 6에는 동시 프로그래밍을위한 훌륭한 기본 세트가 제공됩니다.
내 지식에 따라 일반 Lisp 구현의에는 동시 가비지 수집기가 있습니다.
이LispWorks 6 문서 및 멀티
- 1. 시스템 호출을 사용하는 Common Lisp GUI 프로그래밍
- 2. Scheme 또는 Common Lisp
- 3. 술어 Common Lisp
- 4. Common Lisp Binary Tree
- 5. ltk (common lisp) 문제
- 6. Common lisp error : "람다 표현식이어야합니다"
- 7. Common Lisp 대 MacLisp/InterLisp
- 8. common lisp - 파일로의 경로를 얻는다
- 9. common-lisp 프로그램의 성능 측정
- 10. common-lisp : 바인딩과 심볼의 차이
- 11. read-line in common lisp
- 12. Allegro Common Lisp 소프트웨어 문제
- 13. Clozure Common Lisp - TCP 소켓 프로그래밍 - 응답 보내기
- 14. Common Lisp 그래픽 사용자 인터페이스 개발
- 15. Common Lisp : ASDF 패키지의 버전을 얻는 것
- 16. 주목할만한 Lisp 초보자를 위해 작동하는 Common Lisp 환경 설정하기
- 17. lisp (Common Lisp, Scheme, Clojure)를위한 소스 코드 beautifier
- 18. forkbox()를 구현하는 GNU Common Lisp 패키지
- 19. 잠재 의미 론적 인덱싱의 Common Lisp 구현
- 20. Common Lisp 용 벡터 그래픽 라이브러리
- 21. Common Lisp 프로젝트를위한 ASDF 파일을 자동으로 생성합니다.
- 22. Scheme/Common Lisp/Clojure의 자동 차별화 라이브러리
- 23. Common Lisp 용 Lexer 및 Parser 생성기
- 24. 루프 내에서 Common Lisp Pause 명령어
- 25. Common Lisp : 입력 값에 대한 규칙 만들기
- 26. 특정 Common Lisp 구현을 찾고 있습니다.
- 27. Common Lisp 및 Clojure 개발을위한 SLIME 설정
- 28. Hunchentoot와 함께 Heroku에 대한 Common Lisp?
- 29. Common Lisp : 효율적으로 중첩 된 plist 추가하기
- 30. Common Lisp 스코프 (동적 대 어휘)
나는 또한 PCALL을 권하고 싶습니다 (http://marijnhaverbeke.nl/pcall/) - 매우 간단하지만 병행 (주로) 독립적 인 계산을 구성하는 유용한 라이브러리. –
EF2는 PCall 포크입니다. 나는 PCall을 사용하지 않았다. –
lparallel (http://lparallel.org/)은 채널, 미래 등을 지원하는 훌륭한 병렬 프로그래밍 라이브러리입니다. 또한 형제 라이브러리 (동일한 API 사용) - lfarm - 분산 컴퓨팅을 허용합니다. –