2012-02-22 5 views
24

Common Lisp에서 입자 필터링 알고리즘을 병렬로 구현하고 싶습니다. 파티클 필터링 및 샘플링을 병렬화 할 수 있으므로 4 코어 머신에서이 작업을 수행하려고합니다. 내 질문은 CL에서 프로그래밍이 병렬로 실행 가능한지 여부입니다. 가능한 경우 CL에서 병렬 컴퓨팅을 시작하는 데 대한 유용한 지침, 자습서가 있습니다.Common Lisp 병렬 프로그래밍

답변

26

확실히 가능합니다!

Bordeaux Threads project은 많은 구현을위한 스레드 기본 요소를 제공합니다. 나는 SBCL의 구현 - 특유의 프리미티브 대신에 이것을 사용할 것을 제안한다. (특히 당신이 SBCL에 있지 않다면!).

스레드 기본 요소는 bt에 의해 제공되지만 매우 원시적입니다. 나는 fture를 사용하여 동시성 기능을 제공하기 위해 bt를 기반으로 빌드 된 Eager Future2을 사용하고 즐겼습니다. lazily, eagerly (즉시), 또는 추측으로 계산 된 선물을 만들 수 있습니다. 투기 선물은 크기를 사용자 정의 할 수있는 스레드 풀로 계산됩니다.

EF2를 사용하여 CL 기능의 병렬 버전을 제공하기 위해 a little project을 시작했으나 지금까지는 세 가지 기능 만 있으므로 누구에게도 많이 사용되지는 않습니다. 물론 다른 코더들도 해킹하고 풀 요청을 제출하는 것을 환영합니다. 앞으로 더 많은 작업을 할 수 있기를 바랍니다.

내가 시도하지 않은 다른 많은 라이브러리 listed on Cliki이 있습니다.

튜토리얼에서 알 수있는 것은 없지만 제공되는 동시성 기능은 다른 언어에서도 찾을 수 있습니다. 좋은 알고리즘과 사례는 일반적으로 언어별로 다릅니다.

책을 읽는 데 관심이 있으시면 동시 C 프로그래밍 언어을 사용하는 것이 좋습니다. 저자는 C에 기반한 새로운 프로그래밍 언어를 언어 기능으로 동시성으로 설명합니다. 물론 CL의 특성상 새로운 컴파일러를 만들지 않고도 이러한 기능을 구현할 수 있습니다. 제 생각에이 책은 뛰어난 동시성 개념을 제시하며 동시 프로그램 작성시 발생할 수있는 여러 가지 문제를 해결합니다.

+2

나는 또한 PCALL을 권하고 싶습니다 (http://marijnhaverbeke.nl/pcall/) - 매우 간단하지만 병행 (주로) 독립적 인 계산을 구성하는 유용한 라이브러리. –

+0

EF2는 PCall 포크입니다. 나는 PCall을 사용하지 않았다. –

+5

lparallel (http://lparallel.org/)은 채널, 미래 등을 지원하는 훌륭한 병렬 프로그래밍 라이브러리입니다. 또한 형제 라이브러리 (동일한 API 사용) - lfarm - 분산 컴퓨팅을 허용합니다. –

8

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의 환상적인 기능을 놓치게 될 것입니다 ...

4

다른 Lisps에 대한 단일 스레드 POSIX 스레드 스타일 인터페이스를 찾으려면 bordeaux 스레드를 확인하십시오.

신뢰할 수있는 무료 Lisp 구현을 찾고 있다면 CCL로 시작한 다음 SBCL을 사용해 보겠습니다. 거의 모든 테스트와 SBCL 및 LispWorks에서 CCL을 사용합니다.

Sedach의 미래 라이브러리는 더 높은 수준의 인터페이스를 제공해야합니다. SBCL의 contrib 디렉토리에있는 여러 사용자의 다른 기여도 있습니다.

bordeaux-thread도 Sedach 's futures library도 사용하지 않았고 그 둘 모두의 자신의 버전을 작성한 사람으로부터 오는 것입니다. 나는 당신에게 나의 구현을 보낼 수 있지만,이 두 패키지는 또한 좋은 것으로되어 있고 아마도 그들은 더 나은 출발점 일 것이다.

3

LispWorks 6에는 동시 프로그래밍을위한 훌륭한 기본 세트가 제공됩니다.

내 지식에 따라 일반 Lisp 구현의에는 동시 가비지 수집기가 있습니다.

LispWorks 6 문서 및 멀티

관련 문제