2017-10-25 7 views
2

私は、QuantLibのスレッドセーフプロパティ(またはそれらの不在)を明示的に記述しているドキュメントを見つけることができませんでした。 QuantLib configuration documentationにはスレッドセーフに関する多くのコンパイル時のオプションがリストされています。このオプションから、デフォルトでは、QuantLibは完全にスレッドセーフではないと推測されます。特に複数のスレッドからQuantLibを使用する正しい方法は何ですか?

、があります。

  • QL_ENABLE_SESSIONSは - 「定義された場合は、シングルトンが異なるセッションのための別のインスタンスを返しますあなたはライブラリと名前空間QuantLibでセッションID()関数を提供してリンクする必要があります。セッションごとに異なるセッションIDを返します。デフォルトでは未定義です。

  • QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - "もし定義されていれば、オブザーバパターンのスレッドセーフですがパフォーマンスの低いバージョンが使用されます.JVMまたは.NET eco内のSWIGレイヤーを使用してQuantLibを使用する場合は、システムまたは非同期ガベージコレクタを使用する任意の環境です。デフォルトでは定義されていません。

  • QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - "これは、スレッドセーフなシングルトン初期化を行うために定義します。デフォルトでは未定義です。複数のセッションと互換性がありません。

    オプションは、私が使用してはならない、と私はQuantLib使用したい場合、私は、他にどのような措置を講じなければならない

:保持だけで同じ時間(例えばで決して複数のスレッドから

  1. を、しかし、グローバルロック)?

  2. 同時に複数のスレッドから、それらの間にオブジェクトを共有していませんか?

  3. 同時に複数のスレッドから、それらの間でオブジェクトを共有しますか?

自分のアプリケーションのための自然な構造は、様々なオブジェクトを計算し、更新するために使用されている一方の端部に入る市場データの一定のストリームを有する有向非巡回グラフ、であり、で出る見積価格のストリームを生成します違った終わり方。いくつかの計算に時間がかかるので、複数のコアを並行して稼働させたいと思っています。

アプリケーションはほとんどがJavaで書かれており、C++の中で最小限の部分でQuantLibとのインターフェイスをとっています。 SWIGラッパーを使用する予定はありません。私はJavaのガベージコレクタの助けを借りずにQuantLibオブジェクトのメモリ管理をしています。


EDIT!これらのオプションのいずれかを設定することを決定した場合には、UNIX上で、./configureをするために、対応するフラグでそれを行う:

--enable-sessions 
--enable-thread-safe-observer-pattern 
--enable-thread-safe-singleton-init 

答えて

2

SmallChessからの回答は真実にはほど遠いものではありません。 QuantLibにはロックやセーフティネットがほとんどありません。そのため、プロセッサを使用して計算を分散する必要がある場合、ほとんどの人がマルチプロセッシングを使用します。もう少し洞察をしたい人のために

、およびQuantLibで使用してマルチスレッドの裏書として ない:可能な場合は、あなたを与える構成スイッチを有効にする任意の他

  • シングルトンのスレッドセーフな初期化のためのもの(警告が付いている、以下を参照)などの安全性。

  • 彼らは、このような評価日としてグローバルを変更しようとしていない場合、彼らは任意のオブジェクト、を共有していない場合は、一度に実行されている複数のスレッドを持っているかもしれません(のリストについては、シングルトンから継承するクラスを探しますグローバル)。

  • 異なるスレッドの評価日付が必要な場合は、別のコンパイルスイッチを使用して、シングルトンが実際にシングルトンではなくスレッドごとにインスタンスが存在するようにQuantLibを構築できます。警告:このスイッチは、シングルトンのスレッドセーフ初期化には対応していません。それでもスレッド間でオブジェクトを共有すべきではありません。

  • オブジェクトを共有したい場合は、それ以上の問題があります。問題は次のとおりです。(1)カーブなどの根本的なデータへの変更があれば、再計算が行われます。 (2)再計算(カーブのブートストラップなど)は、すぐに実行されるのではなく、必要なとき、すなわち、ある曲線メソッドが呼び出されたときにのみ実行される。これは、さまざまなステップを別々に保つ必要があることを意味します。まず、引用符の値を設定し、それ以上の変更がないことを確認します。その後、曲線の周りを回って、再計算をトリガします。たとえば、ある日に割引率を求めます。最後に、カーブを楽器に渡して価格を付けます。計算中に値を変更すると、途中でブートストラップが実行されます。計算を開始する前に完全な構成を起動しないと、2つの計測器が同時に2つのブートストラップをトリガする可能性があります。

私が言ったように、おそらくそれは価値があるよりも面倒です。理想的には、スレッド間でオブジェクトを共有したり、グローバルに触れたりしないでください。それ以外の場合は、マルチプロセッシングを優先します。

2

残念ながら、QuantLibはないスレッドセーフです。あなたが持っている選択肢のどれもあなたを助けません。 QuantLibは無料のプロジェクトであり、実際の数学的モデリングに重点を置き、スレッドセーフなどの計算上の最適化には焦点を当てません。

でQuantLibを確実にラップする必要があります。マルチスレッドはではありませんあなたが何をしているのかを絶対に知り、関連するソースコードをチェックしていない限り、QuantLibを奨励してください。

+0

「あなたが持っているオプションはどれもあなたを助けません」と言ったとき、彼らは自分が思っていることをしない、あるいはうまくいかない、あるいは何らかの理由で十分でない、または何? –

+0

@TomAnderson彼らはあなたがしたいことをしません。 QuantLibメーリングリストを検索してください。スレッドセーフに関する記事があります。あなたがやりたいことに依存して、いくつかのコード関数はグローバル変数を使わないのでスレッドセーフです。 – SmallChess

+0

@TomAndersonたとえば、Black Scholesを計算したいだけの場合。 BlackScholesCalculatorにはグローバル依存性がないため、確実にスレッドセーフです。 – SmallChess

関連する問題