33

私の新しいアプリケーションでは、マルチスレッド用のライブラリの使用を柔軟に決定できます。これまでは pthread を使用していました。次に、クロス プラットフォーム ライブラリを探索します。私はTBBとBoostに焦点を当てています。Boost に対する TBB の利点が何であるかがわかりませんでした。ブーストに対する TBB の利点を見つけようとしています: TBB Excerpts for wiki "代わりに、ライブラリは、操作を「タスク」として処理できるようにすることで、複数のプロセッサへのアクセスを抽象化します。これは、ライブラリの実行によって個々のコアに動的に割り当てられます。タイム エンジン、およびキャッシュの効率的な使用を自動化することによって。TBB プログラムは、アルゴリズムに従って依存タスクのグラフを作成、同期、および破棄します。"

ただし、スレッド化ライブラリは、コアへのスレッドの割り当てについて心配する必要さえあります。これはオペレーティング システムの仕事ではないでしょうか。それでは、Boost よりも TBB を使用することの本当の利点は何でしょうか?

4

2 に答える 2

35

ただし、スレッド化ライブラリは、コアへのスレッドの割り当てについて心配する必要さえあります。これはオペレーティング システムの仕事ではないでしょうか。それでは、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 を最大化するのに役立ちます。利用。生のスレッドで実装してみてください。違いを感じるでしょう :)

于 2011-08-20T20:22:06.470 に答える
10

Intel TBBは、独自のスレッドプール/スケジューラーと実行モデル(parallel_for構成要素などを含む)を導入しますが、Boostには基本的なスレッド管理機能(スレッドと同期プリミティブの作成、それだけです)しかありません。Boostを使用して適切なスレッドプールを作成することは可能ですが、困難です。 --TBBには、高度に最適化されたスレッドプールがすでに付属しています。したがって、要件によって異なります。必要なのが「ポータブルpthread」だけの場合は、Boostを使用し、さらに必要な場合は、IntelTBBを使用します。

于 2011-08-20T07:59:31.100 に答える