2013-04-14 105 views
3

有沒有類似於PPL在TBB中的任務延續? 我知道手冊冊分配tbb::task S的水平低TBB方法和手動分配也延續任務和手動管理裁判計數他們:英特爾TBB中的任務繼續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; 
     } 
    } 
}; 

這簡直太可怕了。 您必須事先知道您將產卵多少個孩子,並手動設置參考計數。這是很脆弱的編碼...

PPL的規定延續的方式就是這麼簡單:

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嗯,我會給一個想法,謝謝你回答 –

+0

問題是比較兩種不同語言方言的實現,並抱怨一個而不是其他問題的具體問題的脆弱性。 TBB例子可以循環兩次新的增量產卵,現在脆弱性消失了。可能還有更高效的spawn_all()或者其他東西! – mabraham

回答

1

沒有什麼直接的東西,我發佈了一個例子,說明如何在我的博客here上使用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); 
} 
+0

它不回答關於它在TBB中的問題。 TBB沒有'run_task'和'run_when'方法 – Anton

+0

對不起,我沒有得到這些函數是在你的博客上task_group的頂部實現的 – Anton