2013-04-14 3 views
3

Есть ли что-либо подобное продолжению задач 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

Только некоторые случайные мысли. У фьючерсов на будущее есть «то», я думаю, что с 1.53, вероятно, не все методы реализованы, в то время как другие могут иметь некоторые ошибки. Проверьте документы. У TBB нет чего-то подобного, одно из близких - поток-график TBB. Вы можете создать схему потока для своих сообщений, TBB будет распараллеливаться там, где это возможно. Хотя это не так просто, как 'then', это также более мощно. Наконец, я хочу упомянуть, что TBB не ориентирован на параллелизм, основанный на задачах, а на алгоритмах, которые устраняют проблемы, связанные с данными. – inf

+0

@bamboon hmm, я дам эту мысль, спасибо за ответ –

+0

Вопрос заключается в сравнении реализаций на двух разных языковых диалектах и ​​жалуется на хрупкость конкретных деталей, присутствующих в одном, а не на другом ... Пример TBB может зацикливаться на new-increment-spawn дважды, и теперь хрупкость ушла. Вероятно, есть более эффективный spawn_all() или что-то еще! – mabraham

ответ

1

Нет ничего прямого, я отправил пример того, как это сделать с task_group (который находится в tbb) в прошлом месяце в моем блоге here.

Синтаксис аналогичен, но не равен 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); 
} 
+0

Он не отвечает на вопрос о том, как это происходит в TBB. TBB не имеет методов «run_task» и «run_when» – Anton

+0

Извините, я не понял, что эти функции реализованы в вашем блоге поверх task_group – Anton

4

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

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

Смежные вопросы