高速なミンコフスキー合計計算を必要とする C++ ソフトウェアを作成しています。double suffices に基づく実装。
次のようないくつかの幾何学的ライブラリを評価しました
- CGAL
- LEDA
- boost::geometry (ミンコフスキー和の実装はありませんが、実装方法を説明するチュートリアルがあります)
しかし、以前のものと比較して非常に高速で、三角測量にFISTライブラリを使用する別のサードパーティ ライブラリを使用することになりました。
私のコードは、多かれ少なかれ次のように機能します。
- ポリゴンを読みました
- 必要なミンコフスキー和を計算します
- n回
- 次の計算で使用するポリゴンを決定します
- ミンコフスキー和に基づいていくつかのことを行います
- 結果に価値を与える
- 最終結果として最高の値を持つ結果を取ります
ループ内の計算はラウンドごとに独立しているため、ループを並列化し、すべて正常に機能しました。
次に、各並列ラウンドでミンコフスキー和の計算を移動することにしました。
- ポリゴンを読みました
- number_of_threads(=n) 回
- 次の計算で使用するポリゴンを決定します
- このラウンドで必要なミンコフスキー和を計算します
- ミンコフスキー和に基づいていくつかのことを行います
- 結果に価値を与える
- 最終結果として最高の値を持つ結果を取ります
しかし、サードパーティのライブラリは機能しなくなりました。
number_of_threads - 1
エラーメッセージが表示されます
アサーションに失敗しました。
アサーションの失敗の原因となっているファイルは実行ごと、スレッドごとに変わりますが、それらはすべて FIST ヘッダーと同じ名前の c ファイルです (サードパーティ ライブラリのソース コードは持っていますが、. lib および FIST ライブラリのヘッダー)
前に述べたように、並列化されたコードの外で必要なすべてのミンコフスキー和を計算し、その結果を使用しようとしました。これは大丈夫でした。したがって、問題が FIST に起因することはほぼ確実です。
2 つの質問があります。
FISTライブラリがスレッドセーフかどうか知っていますか?
そうでない場合は、FIST を置き換える (おそらく同等のパフォーマンスを持つ) スレッドセーフな (C または、より良い) C++ 三角測量ライブラリを提案していただけますか?
編集:
実際、「スレッドセーフ」がまさに私が望んでいるものかどうかはわかりません。必要なのは、多くの独立した三角測量を同時に計算できる三角測量ライブラリだけです。
ライブラリにグローバル変数がなく、static
変数のないクラスがあったとします
class triangulation
{
// no static variables
void execute_triangulation();
}
それは十分かもしれません。したがって、そのクラスのさまざまなインスタンスを使用して、それらのメソッドを並行して実行できます。