Есть ли что-либо подобное продолжению задач PPL в TBB? Я знаю низкого уровня ТВВ метода manuall выделяя tbb::task
с и вручную распределения задач продолжения слишком и управления рассчитывает реф вручную для них:Продолжение задач в Intel TBB
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;
}
}
};
Это просто ужасно. Вы должны заранее знать, сколько дочерних задач вы выберете, и вручную установите счетчик ссылок соответствующим образом. Это очень хрупкая кодирование ...
способ ППЛ задания продолжений просто так просто:
create_task([]()->bool
{
// compute something then return a bool result
return true
}).then([](bool aComputedResult)
{
// do something with aComputedResult
});
Как вы добиться того, что в TBB?
Только некоторые случайные мысли. У фьючерсов на будущее есть «то», я думаю, что с 1.53, вероятно, не все методы реализованы, в то время как другие могут иметь некоторые ошибки. Проверьте документы. У TBB нет чего-то подобного, одно из близких - поток-график TBB. Вы можете создать схему потока для своих сообщений, TBB будет распараллеливаться там, где это возможно. Хотя это не так просто, как 'then', это также более мощно. Наконец, я хочу упомянуть, что TBB не ориентирован на параллелизм, основанный на задачах, а на алгоритмах, которые устраняют проблемы, связанные с данными. – inf
@bamboon hmm, я дам эту мысль, спасибо за ответ –
Вопрос заключается в сравнении реализаций на двух разных языковых диалектах и жалуется на хрупкость конкретных деталей, присутствующих в одном, а не на другом ... Пример TBB может зацикливаться на new-increment-spawn дважды, и теперь хрупкость ушла. Вероятно, есть более эффективный spawn_all() или что-то еще! – mabraham