データの並列処理 - インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) のカウント付きループ

タスクがループ反復であり、反復の値の範囲がループを開始する前に判明してしている場合、ループはイン® oneAPI スレッディング・ビルディング・ブロック (インテル® oneTBB) で容易に表現できます。

次のシリアルコードのループに並列処理を実装することを考えてみます。

    ANNOTATE_SITE_BEGIN(sitename); 
     for (int i = lo; i < hi; ++i) { 
          ANNOTATE__ITERATION_TASK(taskname); 
               ステートメント;
ANNOTATE_SITE_END();

インテル® Advisor のアノテーションを削除して、oneTBB を使用するように変更したシリアルコードの例を示します。

#include <tbb/tbb.h>
    ...
    tbb::parallel_for( lo, hi, 
        [&](int i) {statement;}
    );

最初の 2 つのパラメーターがループ境界です。通常の C++ プログラミング (特に STL) において、下限は包括的で上限は排他的です。3 番目のパラメーターはループ本体であり、ラムダ式で囲まれています。ループ本体は、oneTBB で生成されるスレッドから並列に呼び出されます。「ラムダ式の代わりに C++ 構文を使用してタスクを生成する」の説明で示したように、ラムダ式は明示的に定義されたクラス・オブジェクトのインスタンスと置き換えることができます。

関連情報