2012-04-15 2 views
1

TBB의 열거 형 스레드 특정을 이해하는 데 어려움을 겪고 있습니다. 나는 TLSTBB 스레드 로컬 기억 장치 정보

#include <iostream> 
#include <vector> 

#include "tbb/task_scheduler_init.h" 
#include "tbb/enumerable_thread_specific.h" 
#include "tbb/task.h" 

typedef tbb::enumerable_thread_specific< std::vector<int> > TLS; 

class Child: public tbb::task { 
private: 
    int start; 
    int limit; 
    TLS* local_tls; 
public: 
    Child(int s_, int l_, TLS* t_):start(s_),limit(l_),local_tls(t_){} 
    virtual ~Child(){ 
    local_tls=0; 
    } 
    tbb::task* execute(){ 
    TLS::reference local_vector = local_tls->local(); 
    for(int i=start; i<limit;++i){ 
    local_vector.push_back(i); 
    } 
    } 
    return 0; 
} 
}; 

class Cont: public tbb::task { 
private: 
    TLS global_tls; 
public: 
    Cont(){} 
    virtual ~Cont(){} 
    TLS* GetTls(void) { return &global_tls; } 
    tbb::task* execute(){ 
    TLS::const_iterator it(global_tls.begin()); 
    const TLS::const_iterator end(global_tls.end()); 
    std::cout << "ETS.SIZE: " << global_tls.size() << std::endl; 
    while(it != end) { 
     std::cout << "*ITSIZE: " << (*it).size() << "\n"; 
     for(unsigned int j(0); j < (*it).size(); ++j) { 
     std::cout << (*it)[j] << " " << std::endl; 
     } 
     ++it; 
    } 
    return 0; 
    } 
}; 

class Root: public tbb::task { 
private: 
public: 
    Root(){} 
    virtual ~Root(){} 
    tbb::task* execute(){ 
    tbb::task_list l; 
    Cont& c = *new (allocate_continuation()) Cont(); 
    l.push_back((*new (c.allocate_child()) Child(0,10,c.GetTls()))); 
    l.push_back((*new (c.allocate_child()) Child(11,21,c.GetTls()))); 
    c.set_ref_count(2); 
    c.spawn(l); 
    return 0; 
    } 
}; 

int main(void) { 
    Root& r = *new(tbb::task::allocate_root()) Root(); 
    tbb::task::spawn_root_and_wait(r); 
    return 0; 
} 

을 테스트하기 위해이 작은 코드를 작성했지만 출력이 어색하다.

ETS.SIZE: 2 
*ITSIZE: 10 
0 1 2 3 4 5 6 7 8 9 
*ITSIZE: 10 
11 12 13 14 15 16 17 18 19 20 

때로는입니다 : 때때로

ETS.SIZE: 1 
*ITSIZE: 20 
0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 

변화가 일어나는 않는 이유는 무엇입니까? 또한 TBB 포럼에서 TLS에 예상 값이 모두 포함되지 않는 경우가 있지만 그 이유는 부모 및 자식 작업에 대한 관계 때문일 수 있습니다. 너무 많이 이해하지 못했습니다.

어떤 도움이 필요합니까?

감사합니다.

답변

2

표시되는 '어색한'출력 차이는 enumerable_thread_specific과 아무 관련이 없습니다. Child 작업이 두 개의 서로 다른 스레드 (사례 1의 경우) 또는 동일한 스레드 (사례 2의 경우)에 의해 실행되고 있기 때문입니다.

+0

답장을 보내 주셔서 감사합니다, Alexey. 내가 말했던 TBB 포럼의 게시물은 다음과 같습니다 : software.intel.com/en-us/forums/... 저자의 말 : > 그러나 여기에는 문제가 있습니다 : 입자 충돌 ets에서, > b 옵션을 가져올 때 스케쥴 된 모든 충돌이 포함되어 있지 않으며 자식 중 하나의 로컬 데이터 만 포함됩니다. 그 문제가 여기에서도 발생할 수 있습니까? 아니면 저자가 저지른 나쁜 코드 때문에 그런 일이 일어 났습니까? –

+1

그 TBB 포럼 게시물의 저자는 뭔가 잘못 이해했다고 생각합니다. 나는 그에게 거기에서 대답했다, 그가 정말로 원했던 것을 명백하게하고, 탐구 할 약간의 생각을 제안하려고 노력했다. –

+0

도와 줘서 고마워 Alexey! –