2013-01-24 58 views
6

我在寫一個需要快速Minkowski和計算的C++軟件。基於雙重足夠的實現。線程安全三角測量庫

我評估了一些幾何庫如

但我最終使用了另一個第三方庫,與前一個相比非常快s並使用FIST庫進行三角測量。

我的代碼工作或多或少以下列方式:

  • 我讀我的多邊形
  • 我計算閔可夫斯基總結,我需要
  • N次
    • 我決定哪些多邊形用於下面的計算
    • 我做一些基於閔可夫斯基和的東西
    • 我給一個val UE到結果
  • 我採取與作爲最終結果

由於內環路的計算最佳值的結果是獨立的一輪輪,我並行循環,一切運行良好。

於是我決定將明可夫斯基和計算每個並行輪:

  • 我讀我的多邊形
  • 對於number_of_threads(= N)次
    • 我決定在要使用的多邊形以下計算
    • 我計算我需要在這一輪閔可夫斯基總和
    • 我做一些基於閔可夫斯基總和
    • 我給的值的結果
  • 我採取與作爲最終結果

    但第三方庫的工作沒有更多的最佳值的結果。

我得到number_of_threads - 1錯誤信息,說

斷言失敗。

導致從運行斷言失敗改變運行,並從線程到線程的文件,但它們都是C-文件具有相同的名稱FIST頭(雖然我有第三方庫的源代碼,我只有一個.lib和FIST庫的頭文件)

如前所述,我試着計算我在並行化代碼之外所需的所有Minkowski和,並使用其中的結果。這沒關係。所以我幾乎可以肯定問題來自FIST。

我有兩個問題:

  • 你知道,如果FIST庫是線程安全的?

  • 如果不是,請問您可以給我一個線程安全(C或更好的)C++三角測量庫來替換FIST(可能具有相當的性能)嗎?

編輯:

其實,我不知道是不是「線程安全的」這正是我想要的:我只需要能夠計算許多獨立的三角在同一時間tringulation庫。

我認爲,如果庫有沒有全局變量,如果它有一個類沒有static變量

class triangulation 
{ 
    // no static variables 

    void execute_triangulation(); 
} 

它可能是不夠的。 所以我可以使用這個類的不同實例並且同時運行它們的方法。

+0

通常,如果未明確指定爲線程安全,則可能需要將所有內容視爲_not_線程安全。 –

+0

目前還不清楚這是由於您的庫的線程安全性還是代碼中的錯誤。目前還不清楚您是否應該擔心線程安全問題。 – Mikhail

+0

@Mikhail你說得對,我會編輯我的問題 – 888

回答

3

您可以使用2D triangulation package of CGAL替換FIST,然後將其用作Minskowski總和的第三方庫的輸入。 CGAL三角測量非常快速,可靠。您可以使用約束Delaunay三角剖分對多邊形和複雜形狀進行三角剖分。

順便說一句,您使用哪個Minkowsky圖書館?

+0

我知道CGAL的二維三角包可以使用所有類型的內核(這對我很有用,因爲我不需要一個「確切」的內核),但是我可能會排除它,因爲商業廣告許可證對我們來說相當昂貴。我很抱歉,但我的老闆更喜歡保密我們正在使用的圖書館。 – 888

1

這很很大程度上取決於你的意思是這是什麼:

因爲我的代碼是並行的,我介紹的多線程

你需要爲了得到幫助更加具體。這意味着什麼「你引入了多線程」?例如,您提到的所有庫都沒有並行計算內置的Minkowski彙總(或其他任何內容) - 您需要自行對其進行並行化。

關於Minkowski和,可以使用map-reduce方法:將輸入數據集分成更小的部分,並行計算Minkowski和(map),並將中間結果併入獨立工人(減少)。對此的要求是一個基本的線程安全保證(例如CGAL給你)只讀訪問計算參數。

+0

我剛編輯。我希望現在更清楚。 – 888

2

一個可能的且可立即測試的解決方案是在調用Minkowski計算的代碼周圍放置一個互斥鎖。如果這聽起來很有趣,而且您不知道該怎麼做,請添加一條評論,詳細說明您使用的平臺,我或其他人會概述如何執行此操作。

至少,這將告訴你是否你已經正確地確定了問題。如果這些計算只佔總帶寬的一小部分,那麼它可能是一個很好的解決方案 - 否則只是一個步驟。