TBB 사용 시 더 느려지는 현상을 어떻게 설명해야 할까요...
TBB 사용 시 더 느려지는 현상을 어떻게 설명해야 할까요...
안녕하세요. TBB 를 사용하여 모듈 개발을 하다가 난관에 봉착하여 이렇게 글을 올립니다.
제가 Thread에 대한 개념이 정확히 서 있지 않은 상태에서 일단 상대적으로 적용이 용이해 보이는 TBB를 모듈에 적용하였습니다.
제가 개발중인 모듈에 TBB를 적용하여 속도를 향상 시켰습니다. (윈도우 툴에서 엔진 성능 측정 시 속도 향상을 확인히였습니다.)
헌데 이 모듈을 포함한 엔진이 모바일용으로 사용하게 되어 note4 에서 엔진을 구동하여 보았으나 TBB를 사용하였을 때가 사용하지 않았을 때보다 5배 이상 느려지는 현상이 발생하였습니다.
다른 기종의 시료를 사용하여 테스트 하였을 때는 TBB를 사용할 때 속도가 더 좋게 나타났습니다.
TBB 적용 시 발생하는 기기상의 특징은 아닌 듯 합니다. (엔진에 A,B,C 모듈이 있다고 할 때 제 모듈을 제외한 다른 모듈은 속도가 향상됩니다. 물론 note4 에서요.)
그래서 아마도 Thread에 대한 기본 지식이 부족한 상황에서 TBB를 잘못 적용하여 발생한 문제라고 생각됩니다. 헌데 어느 부분에서 잘못한 것인 지 확인이 어려워 고수분들께 도움을 요청합니다.
일단 제가 개발한 모듈의 대략적인 형태와 예상되는 문제에 대해 질문 드립니다. (제 질문에 부족한 부분이 있으면 말씀해주시기 바랍니다. 댓글로 첨언 하도록 하겠습니다.)
class MultiA { public: MultiA(B* bo, C* co, D* do, std::vector<input_struct*>* isa, std::vector<output_struct*>* osa) : b_object(bo), c_object(co), d_object(do), input_struct_array(isa), output_struct_array(osa) {} void operator() (const tbb::blocked_range<int>& r) const { for (int i = r.begin() ; i < r.end() ; i++) { b_object->Run(input_struct_array->at(i), output_struct_array); c_object->Run(input_struct_array->at(i), output_struct_array); d_object->Run(input_struct_array->at(i), output_struct_array); } } B* b_object; // class B object pointer C* c_object; // class C object pointer D* d_instance; // class D object pointer std::vector<input_struct*>* input_struct_array; std::vector<output_struct*>* output_struct_array; } class A { void Init(path) { a_object = new A(); a_object->Init(path); b_object = new B(); b_object->Init(path); c_object = new C(); c_object->Init(path); } void Run(std::vector<input_struct*>* input_struct_array, std::vector<output_struct*>* output_struct_array) { #ifdef TBB MA multi_a = MA (b_object, c_object, d_instance, input_struct_array, output_struct_array); tbb::parallel_for(tbb::blocked_range<int>(0, input_struct_array->size()), multi_a, tbb::auto_partitioner()); #else for input_struct in input_struct_array { b_object->Run(input_struct, output_struct_array); c_object->Run(input_struct, output_struct_array); d_object->Run(input_struct, output_struct_array); #endif B* b_object; // class B object pointer C* c_object; // class C object pointer D* d_instance; // class D object pointer };
TBB 를 사용하는 부분의 대략적인 코드가 위와 같습니다.
위와 깉이 class A 내에서 B,C,B object 를 동적으로 생성하고 객체 포인터를 TBB run을 담당하는 class 로 넘겨 줘서 넘겨준 객체 포인터를 이용하여 수행하도록 하였습니다.
위와 같이 구현 했을 경우 multithread 환경에서 문제가 될 소지가 있는 지 궁금합니다.
multi thread 가 동일한 객체 포인터를 통해 동일한 함수를 동시에 call 하도록 하는 부분이 문제가 될 수 있나요? 궁금합니다.
참고로 B,C,D의 Run 안에서 동일한 데이터에 대한 접근으로 충돌이 난다거나 하는 문제는 없습니다. 윈도우 툴에서 정상 동작하는 것을 확인한 모듈입니다.
위 사항에 대해 혹시 답변 주실 수 있는 분이 계시다면 답변 부탁 드립니다.
댓글 달기