2016-09-05 42 views
3

當我並行化的fibonacci實現(效率低下,只是爲了比較庫的性能)比正常的低效實現慢得多時,即使在使用我的i7-6700HQ處理器的所有8個邏輯內核之後。與非並行實施相比,處理器風扇開始處理時間非常緩慢。使用intel TBB的低效fibonacci系列比非線程實現慢得多

的例子是直接從TBB教程英特爾 - https://www.threadingbuildingblocks.org/tutorial-intel-tbb-task-based-programming

這裏是我的代碼

#include <tbb/task_group.h> 
#include <chrono> 
#include <iostream> 

#define FIB_NUM 40 

long fib1(int n) 
{ 
    if(n < 2) return n; 

    else 
    { 
     int x, y; 
     tbb::task_group g; 
     g.run([&]{x=fib1(n - 1);}); 
     g.run([&]{y=fib1(n - 2);}); 
     g.wait(); 
     return x + y; 
    } 
} 

long fib2(int n) 
{ 
    return n < 2? n : fib2(n - 1) + fib2(n - 2); 
} 

int main() 
{ 
    auto t1 = std::chrono::high_resolution_clock::now(); 
    std::cout << fib2(FIB_NUM) << std::endl; 
    auto t2 = std::chrono::high_resolution_clock::now(); 
    std::cout << (t2 - t1).count() << std::endl; 
    t1 = std::chrono::high_resolution_clock::now(); 
    std::cout << fib1(FIB_NUM) << std::endl; 
    t2 = std::chrono::high_resolution_clock::now(); 
    std::cout << (t2 - t1).count() << std::endl; 
} 

我不知道我做錯了。如果有人能指出它會有所幫助。

謝謝

+1

從您的鏈接:「不是一個可擴展的解決方案」=>毫不奇怪,實現比平凡慢。你創建了很多線程,並對它們進行同步,只是做了一個補充......創建線程的開銷比你意識到的更大。 – Garf365

+0

哦,我明白了!我其實想要將遞歸矩陣乘法並行化爲一項任務。我想過用tbb來達到這個目的。如果是這種情況,TBB是否值得使用該應用程序?事實上,tbb適用於什麼應用?想要一些資源來指導我。謝謝 –

+0

要求外部資源是SO的Off Topic。但是,也許,關於使用線程來提高計算速度的機會的一般問題可以被接受(不確定)。 ou可以在計算大量獨立數據時使用線程(使用tbb或其他lib)(如對圖像應用過濾器或計算平均值) – Garf365

回答

7

該示例的主要問題是小任務。葉子任務(n<2)只計算return n。毫無疑問,並行性是無效的。當子問題被認爲對於並行化來說太小時,可以通過「截斷」條件來改進該示例。讓我們假設是沒有意義的計算並行第12張斐波那契數,我們將使用串行執行,而不是:

long fib1(int n) 
{ 
    // Use a serial implementation for "small" numbers. 
    if(n < 12) return fib2(n); 
    else 
    { 
     int x, y; 
     tbb::task_group g; 
     g.run([&]{x=fib1(n - 1);}); 
     g.run([&]{y=fib1(n - 2);}); 
     g.wait(); 
     return x + y; 
    } 
} 

也許,你想閱讀有關Divide and ConquerThe Task Scheduler文章。

P.S.英特爾TBB使用基於任務的方法進行並行處理。方法tbb::task_group::run創建一個任務(不是線程),當線程池中的一個線程可用時,該任務將被執行。因此,系統中有多少任務並不重要 - 線程的數量總是有限的。

+0

我不能在你的答案中打開鏈接,並得到'403 Forbidden'。順便說一句,我似乎無法打開[https://software.intel.com](https://software.intel.com)上的任何頁面),並且總是得到'403 Forbidden'我曾經在TBB上谷歌的東西,第一個答案總是來自這個網站,我無法打開它...你有什麼想法嗎? –

+0

開源網站上的相同鏈接 https://www.threadingbuildingblocks.org/docs/help/index.htm#tbb_userguide/Design_Patterns/Divide_and_Conquer.html和https://www.threadingbuildingblocks.org/docs/help/hh_goto的.htm?指數。htm#tbb_userguide/The_Task_Scheduler.html –

+0

我們的TBB支持團隊要求發佈此響應:您是否可以嘗試使用不同的瀏覽器訪問software.intel.com? 如果它沒有幫助,我建議安裝一個HTTP分析器http://www.ieinspector.com/httpanalyzer/index.html來檢查瀏覽器發送的真實HTTP請求是什麼以及服務器的答案是什麼。安裝在Web瀏覽器中的一些插件可能會影響HTTP請求的生成。 –