2011-08-20 118 views
28

我的新應用程序我可以靈活地決定使用多線程庫。到目前爲止,我正在使用pthread。現在想探索跨平臺庫。我毫不猶豫地選擇了TBB和Boost。我不明白TBB優於Boost的好處。 我試圖找出TBB優於Boost的優勢: TBB對Wiki的摘錄「相反,該庫通過允許將操作視爲」任務「來抽象訪問多個處理器,該任務由庫的動態分配給各個內核運行時引擎以及高效使用高速緩存的自動化TBB程序根據算法創建,同步和破壞依賴任務的圖形「Intel TBB vs Boost

但是線程庫甚至需要擔心線程分配給內核。這不是操作系統的工作嗎? 那麼通過Boost使用TBB的真正好處是什麼?

+0

您也可以使用pthread設置線程親和力(例如,使用pthread_setaffinity_np調用) –

+0

@Foo yes是正確的。我的觀點是有多少實際用途是這樣做的。作爲程序員,您可能不希望在應用程序中完成線程調度任務。那麼爲什麼TBB將其視爲與其他圖書館的區別? – David

+4

正確選擇應用程序的內核有一個明顯的優勢。以線程記錄器的簡單示例爲例。一個線程從網絡接口接收數據並將其放置在一個環上;另一個線程從環中讀取數據並寫入文件(這有助於緩解您在使用tcpdump時看到的擁塞)。在這種情況下,在雙處理器系統上,在同一CPU上設置親和性顯然更有效。如果啓用了超線程,則使用虛擬內核對要快得多。但是,這需要很多微觀管理,而TBB並不需要這些。 –

回答

31

但是線程庫甚至需要擔心線程分配給內核。這不是操作系統的工作嗎?那麼使用TBB優於Boost的真正好處是什麼?

你說得對,線程庫通常不應該關心將線程映射到內核。而TBB沒有。 TBB以任務運行,而不是線程。 TBB的調度程序通過分配一個線程池並使其動態選擇要運行的任務來利用所有內核。這是Boost的主要優勢,您需要手動將可用工作映射到線程。然後TBB提供高級構造,例如parallel_for,parallel_pipeline等,可用於表示最常見的並行模式,並隱藏所有使用任務的操作。

例如,讓我們一塊來計算曼德爾布羅分形點代碼(從http://warp.povusers.org/Mandelbrot/採取變量初始化省略):

for(unsigned y=0; y<ImageHeight; ++y) 
{ 
    double c_im = MaxIm - y*Im_factor; 
    for(unsigned x=0; x<ImageWidth; ++x) 
    { 
     double c_re = MinRe + x*Re_factor; 

     double Z_re = c_re, Z_im = c_im; 
     bool isInside = true; 
     for(unsigned n=0; n<MaxIterations; ++n) 
     { 
      double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im; 
      if(Z_re2 + Z_im2 > 4) 
      { 
       isInside = false; 
       break; 
      } 
      Z_im = 2*Z_re*Z_im + c_im; 
      Z_re = Z_re2 - Z_im2 + c_re; 
     } 
     if(isInside) { putpixel(x, y); } 
    } 
} 

現在,使其與TBB平行的,你需要的是轉換最外層循環爲TBB :: parallel_for時(我用了一個簡潔的C++ 11拉姆達):

tbb::parallel_for(0, ImageHeight, [=](unsigned y) 
{ 
    // the rest of code is exactly the same 
    double c_im = MaxIm - y*Im_factor; 
    for(unsigned x=0; x<ImageWidth; ++x) 
    { 
     ... 
     // if putpixel() is not thread safe, a lock might be needed 
     if(isInside) { putpixel(x, y); } 
    } 
}); 

TBB將自動分配可用的核心在所有循環迭代(你不要打擾多少)和動態平衡負荷如果某個線程有更多的工作要做,其他線程不會等待它,而是幫助,最大限度地提高CPU利用率。嘗試使用原始線程實現它,並且您會感覺到區別:)

+0

@阿列克謝謝謝一個很好的解釋。現在我看到tbb看起來很有前景。你能爲tbb建議一些教程嗎? – David

+0

看看http://threadingbuildingblocks.org/documentation.php –

+0

你能告訴我'[=]'它捕獲了什麼嗎? – user

8

英特爾TBB帶來了它自己的線程池/調度,並同時加速只有基本的線程管理功能(創建線程和同步原語,就是這樣。)編寫使用Boost良好的線程池的執行模式(包括像parallel_for結構的東西)是可能的,但很困難 - TBB已經配備了高度優化的線程池。所以完全取決於您的要求:如果您只需要「便攜式pthreads」,請使用Boost,如果您需要更多,請使用Intel TBB。

+0

感謝您的信息boost :: threadpool是指在Boost中做線程池的東西。所以它確實提供了一種擁有線程池的方法。我不知道的是,與TBB相比,效率/缺陷是多少? – David

+1

boost :: threadpool在一段時間內處於非活動狀態,並且遠不如Intel TBB強大。 – Anteru

+2

@Anteru:我假設他的意思是['boost :: thread_group'](http://www.boost.org/doc/libs/release/doc/html/thread/thread_management.html#thread.thread_management.threadgroup),但你是正確的 - Boost的類只是一個線程容器,並不像TBB那樣提供內置的調度。 – ildjarn