Продолжение задачи в Intel TBB

Есть ли что-то похожее на продолжение задач PPL в TBB?
Я знаю о низком уровне TBB метода ручного распределения tbb::tasks и ручное распределение задач продолжения и управление подсчетом ссылок для них вручную:

struct FibContinuation: public task {
long* const sum;
long x, y;
FibContinuation( long* sum_ ) : sum(sum_) {}
task* execute() {
*sum = x+y;
return NULL;
}
};

struct FibTask: public task {
const long n;
long* const sum;
FibTask( long n_, long* sum_ ) :
n(n_), sum(sum_)
{}
task* execute() {
if( n<CutOff ) {
*sum = SerialFib(n);
return NULL;
} else {
// long x, y; This line removed
FibContinuation& c =
*new( allocate_continuation() ) FibContinuation(sum);
FibTask& a = *new( c.allocate_child() ) FibTask(n-2,&c.x);
FibTask& b = *new( c.allocate_child() ) FibTask(n-1,&c.y);
// Set ref_count to "two children plus one for the wait".
c.set_ref_count(2);
spawn( b );
spawn( a );
// *sum = x+y; This line removed
return NULL;
}
}
};

Это просто ужасно.
Вы должны заранее знать, сколько дочерних задач вы создадите, и вручную установить счетчик ссылок соответствующим образом. Это очень хрупкое кодирование …

Способ определения продолжений в PPL очень прост:

create_task([]()->bool
{
// compute something then return a bool result
return true
}).then([](bool aComputedResult)
{
// do something with aComputedResult
});

Как вы достигаете этого в TBB?

3

Решение

Да, есть несколько рекомендуемых стилей продолжения TBB, о которых вы можете прочитать на http://www.threadingbuildingblocks.org/docs/help/reference/task_scheduler/catalog_of_recommended_task_patterns.htm. Тем не менее, по замыслу библиотеки TBB, ни одна из них не использует конструкции C ++ 11, подобные вашему примеру PPL.

Если ваш вопрос действительно «имеет ли TBB интерфейс C ++ 11 для продолжения задачи», тогда ответ «нет».

4

Другие решения

Там нет ничего напрямую, я опубликовал пример того, как сделать это с Task_group (который находится в TBB) давным-давно в моем блоге Вот.

Синтаксис похож, но не на 100% тот же, так как был опубликован до того, как задача существовала.

void SimpleContinuation()
{
auto task1 = run_task([](){ContinueableTask(1);});
//task 2 depends on task 1
auto task2 = run_when(task1, [](){ContinueableTask(2);});
wait_for_all(task1, task2);
}
1

По вопросам рекламы [email protected]