2015-10-16 291 views
2

我一直在尋找一種方法來實現帶多線程的C++ (Implementation found on Github)的Timsort,並且我嘗試過在這個過程中使用。 我敢肯定,我使用的是正確的編譯器標誌,但每當我嘗試使用Timsort爲我做如下:在C++中使用OpenMP與Timsort算法

#pragma omp parallel shared(DataVector) 
{ 
    gfx::timsort(DataVector.begin(), DataVector.end(), comp_1); 
} 

注:數據進行排序,是包含單個單詞串的載體,以及我使用我自己的比較器。

它似乎在不使用OpenMP的情況下以相同的時間量進行排序。使用chrono等適當的包含,我計時的值平均在0.01秒內,在我的排序上徘徊在1.24秒左右。

是否有線程似乎不能與我的排序方法一起工作的原因,還是與我實施OpenMP的方式有關的問題?

注意事項:我一直在使用__gnu_parallel :: sort以及更好的結果,但我期待在實踐中自己比較這些方法。

回答

1

omp parallel需要看到它將要並行化的循環。您已經聲明它的方式,omp會並行化一段代碼,但不會帶來任何好處。

檢查您的文檔omp parallel的用法。

做一個for循環,你需要使用omp parallel for和for語句如下。你現在擁有它的方式會在你擁有的每個核心上運行你的timsort。

+0

所以我會基本上需要進入的timsort自身實際的代碼,並在添加OMP'平行for'適當的位置?我的假設是,對DataVector.begin()和DataVector.end()使用parallel for循環將無法完全按照我的計劃進行。 – GreekQuestionMark

+0

@Tekrin類似的東西。爲了使它與OMP協同工作,for語句有一些限制。 – 1201ProgramAlarm

+0

我還沒有找到用Timsort實現OpenMP的確切方法,所以我會留下「未答覆」的問題。但是,您的答案似乎指向了正確的方向,實際上讓我在代碼中的其他地方修復了另一個問題。 – GreekQuestionMark

0

想你想的...... 如果你想要做一個平行的gfx::timsort你不能從外面做... 你應該在函數中添加此代碼OpenMP是不夠聰明gfx::timsort

#pragma omp parallel for 
for(int i=0;i<num;i++) 
... 

旁邊,shared是一個關鍵的詞來指示變量,你不希望它是編輯並聯