2013-04-14 4 views
3

TBB의 PPL 작업 계속과 유사한 것이 있습니까? 나는 tbb::task의 할당 manuall의 낮은 수준 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; 
     } 
    } 
}; 

단순히 끔찍 그. 스폰 할 자식 작업 수를 미리 알고 수동으로 참조 횟수를 적절하게 설정해야합니다.

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

가 어떻게 TBB에서 그 달성 않습니다이 연속 요청을 지정

PPL의 방법은 너무 간단하다 ... 매우 깨지기 코딩입니까?

+1

그냥 임의의 생각. Boost future에는 'then'이 있는데, 1.53 년 이후로는 모든 메소드가 구현되는 것은 아니지만 다른 것들은 버그가있을 수 있다고 생각합니다. 문서를 확인하십시오. TBB는 비슷한 것을 가지고 있지 않습니다. TBB 플로우 그래프가 있습니다. 메시지 흐름 구성표를 만들면 TBB가 가능할 때마다 병렬 처리됩니다. 이것은 'then'만큼 간단하지는 않지만, 더 강력합니다. 마지막으로, TBB는 작업 기반 병렬 처리가 아니라 데이터 병렬 문제를 추상화하는 알고리즘 패턴에 중점을 둡니다. – inf

+0

@bamboon 흠, 내가 대답 해 주셔서 감사합니다. –

+0

질문은 두 가지 언어로 구현 된 내용을 비교하고 문제가있는 세부 정보의 취약성에 대해 불평합니다. TBB 예제는 new-increment-spawn을 두 번 반복 할 수 있으며 이제는 취약성이 사라졌습니다. 아마도 더 효율적인 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