インテル® C++ コンパイラー 11.0 以降では、ラムダ式が実装され、インテル® スレッディング・ビルディング・ブロック (インテル® TBB) の parallel_for をより簡単に使用できるようになりました。 ラムダ式を使用すると、コンパイラーが関数オブジェクトを作成します。
次のコードは、前のセクションのサンプルをラムダ式を使用して記述したものです。 ラムダ式 (青で表示) は、前のセクションのサンプルの関数オブジェクト ApplyFoo の関数と構築を置換します。
#include "tbb/tbb.h"
using namespace tbb;
void ParallelApplyFoo( float* a, size_t n ) {
parallel_for( blocked_range<size_t>(0,n),
[=](const blocked_range<size_t>& r) {
for(size_t i=r.begin(); i!=r.end(); ++i)
Foo(a[i]);
}
);
}
ここで、[=] はラムダ式を表します。式は、ApplyFoo に非常によく似た関数オブジェクトを作成します。 a や n のようなローカル変数がラムダ式の外で宣言され、ラムダ式の内部で使用される場合、これらの変数は関数オブジェクトの内部のフィールドとしてキャプチャーされます。 [=] の場合、変数は値渡しでキャプチャーされます。 代わりに [&] を記述すると、変数は参照渡しでキャプチャーされます。 [=] の後は、生成する関数オブジェクトの operator() のパラメーター・リストと定義です。 ラムダ式およびその他に実装されている C++11 機能についての詳細は、コンパイラーのドキュメントを参照してください。 ラムダ式はテンプレート・ライブラリーを使用する強力な機能であるため、ラムダ式のより詳細な説明を参照することを推奨します。
コンパイラーの C++11 サポートは、デフォルトではオフです。次の表は、サポートをオンにするオプションを示しています。
|
環境 |
インテル® C++ コンパイラー 11.0
|
|---|---|
|
Windows* |
icl /Qstd=c++0x foo.cpp (13.0 以降では /Qstd=C++11 を利用) |
|
Linux* OS X* |
icc -std=c++0x foo.cpp (13.0 以降では /Qstd=C++11 を利用) |
よりコンパクトに記述できるよう、インテル® TBB には、連続する整数の範囲のループを並列化する parallel_for 形式も用意されています。 式 parallel_for(first,last,step,f) は for(auto i=first; i<last; i+=step)f(i) と記述するのと同じです (リソースさえ許せば f(i) が並列に評価されることを除く)。 step パラメーターはオプションです。 次のコードは、前のサンプルをコンパクトに記述したものです。
#include "tbb/tbb.h"
using namespace tbb;
#pragma warning(disable: 588)
void ParallelApplyFoo(float a[], size_t n) {
parallel_for(size_t(0), n, [=](size_t i) {Foo(a[i]);});
}
この形式は、整数の 1 次元の反復空間および次のセクションで説明されている自動チャンク機能のみサポートしています。