インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド
インテル® スレッディング・ビルディング・ブロック (インテル® TBB) は、一般的な並列アルゴリズム・パターンを関数テンプレートの形式で提供します。これらのテンプレートには、関数オブジェクトとしてコード片を渡さなければなりません。C++11 ラムダ式は、そのような関数オブジェクトの記述を単純化します。そのため、インテル® TBB と C++11 ラムダ式はコードの並列化において強力な組み合わせといえます。
インテル® TBB に関する詳細は、インテル® TBB のドキュメントを参照してください。
次のシリアルコードについて考えてみます。
void SerialApplyFoo( float b[], const float a[], size_t n ){
for( size_t i=0; i<n; ++i )
b[i] = Foo(a[i]);
}
反復を安全に並列実行できる場合、インテル® TBB とラムダ式を使用して、次のようにループを書き換えられます。
void ParallelApplyFoo (float b[], const float a[], size_t n){
tbb::parallel_for (size_t(0), n, [=](size_t i) {
b[i] = Foo(a[i]);
});
}
また、ラムダ式とインテル® TBB の範囲ベースのアルゴリズムを使用することもできます。ここでは、前の例が範囲形式で表されています。
void ParallelApplyFoo (float b[], const float a[], size_t n){
tbb::parallel_for(
tbb::blocked_range<size_t>(0,n),
[=](tbb::blocked_range<size_t> r) {
for (size_t i=r.begin(); i!=r.end(); ++i)
b[i] = Foo(a[i]);
});
}
どちらの例も、(C++98 として知られる) 標準 ISO/IEC 14882:1998 に準拠する C++ を使用して記述できますが、 ループ本体に対する関数オブジェクトを手動で作成する必要があります。上記の例のほうが、ラムダ式を使用して記述するので、より簡単です。手間のかかることはコンパイラーが処理してくれます。