私の新しいアプリケーションには、マルチスレッド用のライブラリの使用を柔軟に決定できます。これまで私はpthreadを使用していました。次に、クロスプラットフォームライブラリを調べたいと思います。 TBBとBoostに焦点を合わせます。 Boostに対するTBBの利点が何であるか理解できませんでした。ブーストに対するTBBの利点を見つけようとしています:wikiのTBB抜粋「代わりに、ライブラリは、操作を「タスク」として処理できるようにすることで、複数のプロセッサへのアクセスを抽象化します。タスクは、ライブラリの実行によって個々のコアに動的に割り当てられます。タイムエンジン、およびキャッシュの効率的な使用を自動化することによって。TBBプログラムは、アルゴリズムに従って依存タスクのグラフを作成、同期、および破棄します。」
しかし、スレッドライブラリはコアへのスレッドの割り当てについて心配する必要さえありますか。これはオペレーティングシステムの仕事ではありませんか?では、BoostよりもTBBを使用することの本当のメリットは何ですか?
しかし、スレッドライブラリはコアへのスレッドの割り当てについて心配する必要さえありますか。これはオペレーティングシステムの仕事ではありませんか?では、BoostよりもTBBを使用することの本当のメリットは何ですか?
確かに、スレッドライブラリは通常、スレッドをコアにマッピングする必要はありません。そして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を最大化するのに役立ちます利用。生のスレッドで実装してみてください。違いを実感できます:)
Intel TBBは、独自のスレッドプール/スケジューラと実行モデル(parallel_for
コンストラクトなどを含む)を導入しますが、Boostには基本的なスレッド管理機能(スレッドと同期プリミティブの作成、それだけです)しかありません。Boostを使用して適切なスレッドプールを作成します。可能ですが、困難です。TBBには、高度に最適化されたスレッドプールがすでに付属しています。したがって、要件によって異なります。必要なのが「ポータブルpthread」だけの場合は、Boostを使用し、さらに必要な場合は、IntelTBBを使用します。