web-dev-qa-db-ja.com

CommonLISP並列プログラミング

CommonLISPで粒子フィルタリングアルゴリズムを並行して実装したい。粒子フィルタリングとサンプリングは並列化できます。これを4コアマシンで実行したいと思います。私の質問は、並列プログラミングがCLで実行可能かどうかです。実行可能である場合、CLで並列コンピューティングを開始するための良い読み物、チュートリアルはありますか。

25
YBE

間違いなく実現可能です!

Bordeaux Threadsプロジェクト は、いくつかの実装のスレッドプリミティブを提供します。 SBCLの実装固有のプリミティブの代わりにそれを使用することをお勧めします(特にSBCLを使用していない場合)。

Btによって提供されるスレッドプリミティブは、ただし、非常にプリミティブです。私は使用して楽しんできました Eager Future2 これはbtに基づいて構築され、futuresを使用して並行性機能を提供します。怠惰に、熱心に(すぐに)、または投機的に計算される先物を作成できます。投機的先物は、サイズをカスタマイズできるスレッドプールによって計算されます。

EF2を使用してCL関数の並列バージョンを提供するために 小さなプロジェクト を開始しましたが、これまでのところ3つの関数しかないため、誰にとってもあまり役に立ちません。もちろん、他のコーダーがハッキングしてプルリクエストを送信することを歓迎します。将来的にはさらに作業を進めたいと思っています。

他にもたくさんのライブラリがあります Clikiにリストされています 私が試したことのないライブラリです。

チュートリアルに関する限り、私は何も知りませんが、提供される並行性機能は他の言語でも見られ、優れたアルゴリズムと実践は一般的に言語固有ではありません。

本を読むことに興味があるなら、私はコンカレントCプログラミング言語をお勧めします。著者は、言語機能として並行性を備えた、Cに基づく新しいプログラミング言語について説明しています。もちろん、CLの性質上、新しいコンパイラを作成せずにこれらの機能を実装できる可能性があります。私の意見では、この本は優れた並行性の概念を示しており、並行プログラムを作成する際に遭遇する、または考慮し損なう可能性のある問題の多くに対処しています。

26

SBCLはいくつかのマルチスレッドをサポートしています。レベルが低すぎて、私の知る限り、並列アルゴリズムは含まれていません。ラムダ関数を実行し、スレッドが終了した(結合した)かどうかを後でテストするスレッドを作成する可能性があります。私はそのサポートを使用して、ブログページを大幅に高速化して生成しました(各ページまたは異なるスレッドのページのセット)。あなたはここでコードを見ることができます:

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スレッド 。ただし、レベルが低すぎます。並行性のためのClojureの素晴らしい機能を見逃すことはありません...

8
Diego Sevilla

さまざまなLispのマルチスレッドプリミティブへの単一のPOSIXスレッドスタイルのインターフェイスを探している場合は、ボルドースレッドを確認してください。

信頼できる無料のLISP実装を探していた場合は、CCLから始めて、SBCLを試してみます。ほとんどすべてのテストにCCLを使用し、残りのテストにはSBCLとLispWorksを使用しています。

Sedachの先物ライブラリは、より高いレベルのインターフェースを提供する必要があります。 SBCLのcontribディレクトリには、さまざまなユーザーからのその他の投稿もあります。

これは、bordeaux-threadsもSedachのfuturesライブラリも使用しておらず、両方の独自のバージョンを作成した人からのものです。私の実装を送ることもできますが、これら2つのパッケージも優れているはずであり、おそらくより良い出発点です。

4
David

LispWorks 6には、並行プログラミング用の優れたプリミティブのセットが付属しています。

私の知る限り、通常のCommon LISP実装のどれもnoneには、同時ガベージコレクターがあることに注意してください。

LispWorks6およびマルチプロセッシングのドキュメント

3
Rainer Joswig