task_group は、同時に実行するタスクのグループを表します。タスクは実行とともに動的にグループに追加されます。
#include "tbb/task_group.h"
using namespace tbb;
int Fib(int n) {
if( n<2 ) {
return n;
} else {
int x, y;
task_group g;
g.run([&]{x=Fib(n-1);}); // タスクを作成
g.run([&]{y=Fib(n-2);}); // 別のタスクを作成
g.wait(); // 両方のタスクが完了するのを待つ
return x+y;
}
}
タスク作成はシリアルのボトルネックとなるため、1 つの task_group で大量のタスクを作成することはスケーラブルではありません。大量の並列タスクを作成する場合は、parallel_for や parallel_invoke を代わりに使用するか、タスクを再帰ツリーとして作成する構成を検討してください。
namespace tbb {
class task_group {
public:
task_group();
~task_group();
template<typename Func>
void run( const Func& f );
template<typename Func>
void run( task_handle<Func>& handle );
template<typename Func>
void run_and_wait( const Func& f );
template<typename Func>
void run_and_wait( task_handle<Func>& handle );
task_group_status wait();
bool is_canceling();
void cancel();
}
}