얼그레이 – 인텔 스레드 빌딩 블록

멀티코어 프로세서에서 병렬처리를 편리하게 해주는 TBB

TBB는 태스크 기반 병렬처리를 지원하는 C++ 라이브러리 이다. TBB는 크게 알고리즘, 컨테이너, 메모리 할당자, 공유 자원을 보호하는 잠금 유틸리티, 태스크 스케줄러 등으로 구성돼 있다.

TBB는 시간 분할에 따른 비용을 줄이기 위해 논리 스레드를 물리 스레드1 만큼 만들고 각 물리 스레드에 논리 스레드를 할당한다. 그리고 스레드에 비해 컨텍스트 전환 비용이 적은 태스크를 이용해 부하를 분산시킨다. 이처럼 TBB가 스레드 관리를 추상화 하므로 사용자는 코드 작성과 유지보수 하기가 쉽다.

TBB 의 한계

TBB는 어떤 데이터 집합을 병렬처리할 수 있는 도메인으로 분리할 수 있다면 매우 효과적이고 편리한 라이브러리가 될 수 있다. 반대로 데이터 집합을 분리할 수 없다면 TBB의 알고리즘을 사용할 수 없다.

TBB는 잠금 유틸리티를 지원하지만 내부 구현에서 명시적인 잠금을 사용하지 않는다. 왜냐하면 명시적 잠금을 사용하면 암달의 법칙에 의해 확장성이 떨어지기 때문이다. (물리 스레드의 수에 성능이 비례해서 증가할 때 확장성이 있다고 말한다.) TBB를 사용하면서 확장성을 유지하고 싶다면 잠금 사용을 지양해야 한다. 하지만, TBB는 어떤 문제를 병렬로 해결하는 것에 목적이 있기 때문에, 공유 데이터를 동기화 하는 것에 대한 뚜렷한 해결 방법을 지원하지 않는다.

Proactor 게임 서버에서 TBB를 사용하기 어려운 이유

TBB에서 사용자가 제어할 수 있는 최소 단위는 태스크이다. 스레드 관리는 완전히 추상화 했기 때문에 사용자가 직접 제어할 수 없다. 결국, TBB가 사용하는 스레드를 다른 목적으로 공유하기는 불가능하다.

Proactor 서버는 자신의 스레드 풀을 만들어 사용한다. Proactor 서버가 사용하는 스레드의 수는 I/O의 양과 시간 분할에 따른 비용에 고려해 결정한다. I/O가 거의 없다면 TBB가 스레드를 관리하는 것 처럼 물리스레드의 수만큼 스레드를 만드는 것이 좋다. 이런 환경에서 TBB를 사용하면 일시적으로 활성화되는 스레드의 수가 늘어나 시간 분할이 많이 발생하게 된다. 이렇게 되면 그에 따른 비용이 TBB가 병렬로 처리하는 이득 보다 더 클 수도 있다.


  1. TBB 문서에 나온 용어이긴 한데 좀 더 좋은 용어가 있으면 고쳐도 좋을것 같네요. 
Advertisements

최 재훈

블로그, 페이스북, 트위터 고성능 서버 엔진, 데이터베이스, 지속적인 통합 등 다양한 주제에 관심이 많다.
Close Menu