2011-08-20 21 views
28

私の新しいアプリケーション私はマルチスレッドのためにライブラリの使用を決定する柔軟性を持っています。これまではpthreadを使っていました。今はクロスプラットフォームのライブラリを探求したい。私はTBBとBoostをゼロにします。 Boostと比べてTBBの利点は何か分かりませんでした。 私はブーストよりTBBの利点を見つけようとしています: TBB wikiの抜粋 "代わりに、ライブラリは操作を"タスク "として扱うことで複数のプロセッサへのアクセスを抽象化します。 "インテルTBBとブースト

しかし、TBBプログラムは依存するタスクのグラフを作成、同期、破棄しますが、スレッドライブラリはコアへのスレッドの割り当てについても心配する必要があります。これはオペレーティングシステムの仕事ではありませんか? ブーストよりもTBBを使用する実際のBenifitは何ですか?

+0

pthreadを使用してスレッドの親和性を設定することもできます(例:pthread_setaffinity_np呼び出しを使用) –

+0

@Fooはいです。私の要点は、それを実践するのがどれだけのものかということです。プログラマーとしては、アプリケーションでスレッドスケジューリングタスクを実行させたくないかもしれません。だからTBBが他の図書館と差別化しているのはなぜですか? – David

+4

アプリケーション用にコアを適切に選択することには、目に見える利点があります。スレッド化されたロガーの簡単な例を見てみましょう。 1つのスレッドは、ネットワークインタフェースからデータを受信し、それをリング上に置く。もう一方のスレッドはリングから読み取り、ファイルに書き込みます(これは、tcpdumpを使用する場合に表示される輻輳を緩和するのに役立ちます)。この場合、デュアルプロセッサシステムでは、同一CPU上の親和性の設定がより効率的に行われます。ハイパースレッディングを有効にしている場合は、仮想コアのペアを使用する方がはるかに高速です。しかし、これには多くのマイクロ管理が必要であり、TBBには必要ありません。 –

答えて

31

しかし、スレッディングライブラリは、コアへのスレッドの割り当てについても心配する必要があります。これはオペレーティングシステムの仕事ではありませんか?ブーストよりもTBBを使う本当のBenifitは何ですか?

スレッドライブラリは通常、スレッドをコアにマッピングする必要はありません。 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

@ Alexeyありがとうございました。今、私はtbbが有望に見えます。 tbbのチュートリアルをお勧めしますか? – David

+0

http://threadingbuildingblocks.org/documentation.phpを見てください –

+0

あなたは私に[キャプチャしたもの]を教えてもらえますか? – user

8
ブーストだけで、基本的なスレッド管理機能を有している

インテルTBBは(それはそれだ、スレッドと同期プリミティブを作成します。)(parallel_for構造のようなものを含む)それ自身のスレッドプール/スケジューラと実行モデルにもたらすブーストを使用して良いスレッドプールを書きますTBBには高度に最適化されたスレッドプールが既に用意されています。したがって、あなたの必要条件に完全に依存します。必要なものが「ポータブルpthread」であれば、Boostを使用し、必要があればインテルTBBを使用します。

+0

ブースト:: threadpoolの情報をありがとうブーストでスレッドプールのことをするために。したがって、スレッドプールを持つ方法を提供します。私が知らない事は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)を意味していたと仮定します。しかしあなたは正しい - ブーストのクラスは単なるスレッドコンテナであり、TBBのような組み込みスケジューリングを提供していません。 – ildjarn

関連する問題