2013-07-24 23 views
1

我想按照本指南: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch31s03.html爲什麼GNU Parallel擴展似乎會讓算法變慢?

下面是一些示例代碼:

#include <numeric> 
#include <vector> 
#include <iostream> 
#include <chrono> 

using namespace std; 
int main() 
{ 
    vector<int> in(1000); 
    vector<double> out(1000); 
    iota(in.begin(), in.end(), 1); 

    auto t = std::chrono::high_resolution_clock::now(); 
    for(int i = 0; i < 100000; ++i) 
     accumulate(in.begin(), in.end(), 0); 

    auto t2 = std::chrono::high_resolution_clock::now(); 

    cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t).count() << endl; 

    return 0; 
} 

我有以下結果:

~:$ g++ test.cpp -std=c++11 
~:$ ./a.out 
900 
~:$ g++ test.cpp -D_GLIBCXX_PARALLEL -std=c++11 -fopenmp -march=native 
~:$ ./a.out 
1026 

當進行多次試驗,這兩個停留在大約在同一時間。 我也嘗試過其他算法,如排序,生成,查找,轉換... 我有一個i7,啓用超線程(4個邏輯核心)。 我跑的g ++ - 4.8.1

感謝

+0

請記住,在創建線程時,和操作系統在它們之間進行切換存在的開銷。對於像你這樣的小型循環來說,開銷可能很大,你應該嘗試使用更大的數據集(即循環更多)。 –

回答

1

我認爲你需要多一點重試一下。你所做的就是一起加入int。創建線程等的開銷會更大。試着用std::string更換int和運行下面的代碼,並比較輸出:

int main() 
{ 
    vector<string> in(100000); 

    auto t = std::chrono::high_resolution_clock::now(); 
    accumulate(in.begin(), in.end(), string(), [](string s1, string s2){ return s1 += s2 + "a" + "b";}); 
    auto t2 = std::chrono::high_resolution_clock::now(); 

    cout << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t).count() << endl; 
} 
+0

我看,好多了! –

+1

作爲一個便箋,如果有人對g ++提供的勝利感興趣,我會得到這些數字: *沒有平行延伸:530毫秒(平均) *沒有平行並且有O3:500毫秒 * 95 ms *並行,O3:85 ms –