タスクが並列サイトでどのように位置するかによって、次に示すようないくつかの表現表現があります。
このシリアルの例のように、アノテーション・サイト内にタスクが配置される場合、並列実行するのは容易です。
ANNOTATE_SITE_BEGIN(sitename);
ANNOTATE_TASK_BEGIN(task1);
statement_1
ANNOTATE_TASK_END();
ANNOTATE_TASK_BEGIN(task2);
statement_2
ANNOTATE_TASK_END();
ANNOTATE_SITE_END();
いくつかの連続した文を独立したタスクとして実行する最も簡単な方法は、次のように parallel_invoke を使用してプログラムを変更することです。
次の 2 つの例は、C++11 のラムダ式の機能を使用しています。これらは、インテル® oneAPI DPC++/C++ コンパイラーを使用し、C++11 を有効にしてコンパイルする必要があります。
#include <tbb/tbb.h>
...
tbb::parallel_invoke(
[&]{statement_1;},
[&]{statement_2;}
}
変数をラムダ式の外部で宣言して、内部で使用することをキャプチャーと呼びます。上記の例の [&] は参照でのキャプチャーを指定します。また、値 [=] でキャプチャーしたり、異なる方法で異なる変数をキャプチャーすることもできます。詳細は、コンパイラー・ドキュメントのラムダ式に関連するトピックを参照してください。
ラムダ式を使用して記述されるコードは、ラムダ式なしでも記述できますが、コーディング作業が多くなります。ラムダ式は次のことを行います。
ラムダ式の本体の実行が定義された operator() でクラスを定義します。
クラスのフィールドに変数をキャプチャーするクラス・コンストラクターを定義します。
クラスのインスタンスを構築します。
コンストラクターは、必要な周辺のローカルをキャプチャーして、データメンバーとして保存できます。
{
struct S1 { void operator()() { statement_1 }};
struct S2 { void operator()() { statement_2 }};
tbb::parallel_invoke(S1(),S2());
}