Common Lispでパーティクルフィルタリングアルゴリズムを並列に実装したいと思います。 Particleフィルタリングとサンプリングを並列化することができます。私は4コアマシンでこれを実行したいと思います。私の質問は、CLでの並列プログラミングが実現可能かどうかです。可能であれば、CLで並列計算を開始するためのチュートリアルがあります。Common Lisp並列プログラミング
答えて
間違いなく実行可能です!
Bordeaux Threads projectは、多くの実装でスレッドプリミティブを提供します。私はSBCLの実装特有のプリミティブの代わりにそれを使用することを提案します(特にSBCL上にいない場合は!)。
スレッドプリミティブは、btによって提供されますが、非常にプリミティブです。私は、先物を使って並行処理機能を提供するためにbtに基づいて構築されたEager Future2を使用して楽しんだ。遅れて、熱心に(即座に)、または推測的に計算される先物を作成することができます。投機的先物は、サイズをカスタマイズできるスレッドプールによって計算されます。
EF2を使用してCL機能の並列バージョンを提供するためにa little projectを開始しましたが、これまでのところ3つの機能しかないため、誰にもあまり役に立ちません。私はもちろん、他のコーダーがハックしてプルリクエストを提出することを歓迎しています。
多くの他の図書館listed on Clikiが私自身を試していません。
チュートリアルまではわかりませんが、提供される並行処理機能は他の言語でも見つかっています。アルゴリズムや方法は一般的に言語固有ではありません。
書籍を読むことに興味がある場合は、Concurrent C Programming Languageをお勧めします。著者らは、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スレッドスタイルのインターフェイスを探している場合は、ボルドースレッドをチェックしてください。
信頼できる無料のLisp実装を探していたら、CCLから始めてSBCLを試してみましょう。ほとんどのテストではCCLを使用し、それ以外ではSBCLとLispWorksを使用します。
Sedachの先物ライブラリは、より高いレベルのインターフェイスを提供する必要があります。 SBCLのcontribディレクトリには、さまざまなユーザーからの貢献もあります。
ボルドーのスレッドやセダクの先物ライブラリのどちらも使用しておらず、それらの両方の独自のバージョンを書いた人からのものです。私はあなたに私の実装を送ることができますが、これら2つのパッケージも良いとされており、おそらく良い出発点です。
LispWorks 6には、並行プログラミングのための素敵なプリミティブが付属しています。それは私の知識誰にも負けない通常のCommon Lispの実装のが同時ガベージコレクタを持っているものの
注意。非常に単純な、しかし - 私もPCALL(http://marijnhaverbeke.nl/pcall/)をお勧めしますLispWorks 6およびマルチプロセッシング
- 1. Common Lispの豊富なプログラミング?
- 2. Common Lispのクラスイントロスペクション
- 3. Common Lisp用ベクターグラフィックスライブラリ
- 4. Common Lispでの行列乗算
- 5. Common Lispでの文字列の比較
- 6. Common Lispグラフィカルユーザインタフェース開発
- 7. Common Lisp vs. MacLisp/InterLisp
- 8. Common Lisp Unbound変数
- 9. ソースコードlisp(Common Lisp、Scheme、Clojure)の美人
- 10. 並列プログラミングTPL
- 11. Common Lispのパッケージ定義
- 12. Common LispのWeb開発
- 13. Common Lispの統計パッケージ
- 14. Common LispのRepresentational State Transfer(REST)
- 15. Common Lispでの循環リスト
- 16. Common Lisp CFFI:ポインタへのポインタ
- 17. Common Lisp用のレクサーとパーサージェネレータ
- 18. Common Lisp:ディレクトリの作成
- 19. 予期しないリストの複製をCommon Lispで並べ替える
- 20. 並列プログラミングで始める
- 21. Mathematicaでの並列プログラミング
- 22. Tomcat Webアプリケーションの並列プログラミング
- 23. Common Lispの文字列に文字を追加する
- 24. Common Lispのテキストファイルから配列を読み取る
- 25. Common Lispで文字列オブジェクトをハッシュキーとして使用する
- 26. Clozure Common Lisp - TCPソケットプログラミング - 応答の送信
- 27. Common Lispダブルバッククォート、クォート解除、クォート、アンクォートシーケンス?
- 28. Common Lispでlambdaの名前を変更
- 29. Common Lispで型を削除する
- 30. Common Lispで&restパラメータを展開する
ため
ドキュメント並列(主に)独立した計算を構成するための有用なライブラリです。 –
EF2はPCallのフォークです。私は自分でPCallを使っていません。 –
lparallel(http://lparallel.org/)は、チャネル、先物などをサポートする素晴らしい並列プログラミングライブラリです。また、兄弟ライブラリ(同じapiを使用) - lfarm、分散コンピューティングを可能にします。 –