2012-02-22 89 views
24

我想在Common Lisp中並行實現我的粒子濾波算法。粒子濾波和採樣可以並行,我想爲我的4核機器做到這一點。我的問題是,並行編程在CL中是否可行,如果可行,是否有任何良好的讀數,關於在CL中開始並行計算的教程。Common Lisp並行編程

回答

26

絕對可行!

Bordeaux Threads project爲許多實現提供了線程原語;我建議使用它而不是SBCL的特定於實現的原語(尤其是如果您不在SBCL上!)。

線程原語是由bt提供的,但是很原始。我已經使用並享受了基於bt的Eager Future2以提供使用期貨的併發功能。您可以創建延遲,急切(立即)或推測性計算的期貨。投機期貨是由一個線程池計算的,其大小可以定製。

我開始用a little project來提供使用EF2的CL函數的並行版本,但它目前只有三個函數,所以對任何人都沒有多大用處。當然,我也歡迎其他編碼人員對其進行破解並提交請求,希望將來能對此做更多的工作。

還有很多其他庫listed on Cliki,我還沒有嘗試過自己。

就教程而言,我不知道任何,但提供的併發功能也可以在其他語言中找到,而良好的算法和實踐通常不是特定於語言的。

如果你有興趣看書,我推薦並行C編程語言。作者描述了一種基於C語言的新編程語言,併發語言功能。當然,由於CL的本質,可能無需創建新的編譯器就可以實現這些功能。在我看來,這本書提出了極好的併發概念,並解決了在編寫併發程序時可能遇到或未考慮的許多問題。

+2

我也建議PCALL(http://marijnhaverbeke.nl/pcall/) - 一個很簡單的,但用於組織並行(大部分)獨立計算的有用庫。 – 2012-02-22 21:54:46

+0

EF2是PCall的一個分支。我自己並沒有使用PCall。 – 2012-02-22 21:59:05

+5

lparallel(http://lparallel.org/)是一個偉大的並行編程庫,支持信道,期貨等。它也有兄弟庫(使用相同的API) - lfarm,它允許分佈式計算。 – 2015-05-01 13:10:01

8

SBCL有一些多線程支持。它水平太低,據我所知,不包含任何並行算法。它只是創建線程的可能性來執行一些lambda函數,然後在線程完成後加以測試(加入它)。我使用這種支持以很快的速度生成我的博客頁面(每個頁面或一組頁面在不同的線程中)。你可以在這裏看到的代碼:

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

如果您正在爲不同的Lisp尋找針對多線程原語的單個POSIX線程式接口,請查看bordeaux線程。

如果我正在尋找一個可靠的免費Lisp實現,我會從CCL開始,然後嘗試SBCL。我幾乎所有的測試都使用CCL,其餘的則使用SBCL和LispWorks。

Sedach期貨庫應該提供更高級別的接口。在SBCL的contrib目錄中還有來自不同用戶的其他一些貢獻。

這從別人誰使用了既不波爾多線程或Sedach期貨庫和已用自己的這兩個的版本到來。我可以給你我的實現,但是這兩個包也應該是不錯的,而且他們可能是一個更好的起點。

3

LispWorks 6有一個很好的原語爲併發編程的。

請注意,雖然在我的知識沒有通常的Common Lisp實現有一個併發的垃圾收集器。

的文檔LispWorks 6和多