1. 병렬 프로그래밍 소개Intel Threading Building Block 2011. 06. 11 아꿈사스터디( http://andstudy.com ) 윤석윤( seedyoon@EyaSoft.co.kr )
2. 개요 병렬화의 이유 병렬화의 문제점 TBB 설계 목표 TBB의 주요 기능 참고 이 문서는 TBB에 대하여 좋은 자료를 만들어 주신 분들의 PT 내용을 수집하여 만든 것 입니다. 간략한 소개가 목적이며, 자세한 내용 및 더 나은 설명은 참고 세션에 있는 자료들에서 찾아 봐주시길 바랍니다.
4. 병렬화의 이유 새로운 반도체 소자가 나오기 전까지는 더 이상 클럭 속도를 높이기 힘들다- 무어의 법칙의 한계 - Multi-core에서 Many-core 시대로 바뀌고 있다. ( 3~4년 내에 데스크탑 코어는 60개 까지 늘어날 것이다 ) 빠른 처리속도, 빠른 처리속도, 빠른 처리 속도를 얻기 위해서
6. 병렬화의 문제점 공유자원과 이벤트가 뒤섞인 상태 Data Race Dead Lock 잘못된 동기화 Context Switching 비용 False Sharing ABA 문제
7. TBB 설계 목표 추상화 병렬화 가능한 곳을 공략하자 Core의 개수를 신경쓰지 말자 쓰레드를 직접 건드리지 말자 가능한 곳에 묵시적 병렬성 명시적 병렬성 Thread가 아닌 Task 안전성 보장 강화 프로그래머가 쓰레드가 아닌 “병렬적 사고”에 더 신경 써야 한다
8. TBB의 주요 기능 일반 병렬처리에서 사용할 수 있는 풍부한 기능 C++ 라이브러리 독립적 컴파일러 C++ generic Programming 병렬 테스크 Thread가 아닌 Task WorkStealing을 이용한 부하 분산 병렬 알고리듬 공통적인 병렬 패턴, 효율적 실행 Memory Allocation False Sharing / 성능 향상 병렬 처리를 위해 고안됨 Container STL 식 컨테이너, 사용자 잠금 장치가 필요 없음( ABA 문제가 해결된 컨테이너 ) 동기화 장치 Mutex / atomic operation
9. TBB의 주요 기능 http://software.intel.com/en-us/blogs/2008/12/16/compare-windows-threads-openmp-intel-threading-building-blocks-for-parallelprogramming
10. TBB의 주요 기능 조정성 있는 메모리 할당자 scalable_malloc scalable_free scalable_realloc scalable_calloc scalable_allocator cache_aligned_allocator zero_allocator 상호 배제 뮤텍스 spin_mutex queuing_mutex spin_rw_mutex queuing_rw_mutex recursive_mutex null_mutex null_rw_mutex 원자적 연산 fetch_and_add fetch_and_swap fetch_and_store fetch_and_increment fetch_and_decrement 기본 알고리즘 parallel_for parallel_for_each parallel_reduce parallel_scan 고급 알고리즘 Parallel_while Parallel_do Parallel_preorder Pipeline Parallel_pipeline Parallel_sort Parallel_invoke 컨테이너 concurrent_queue concurrent_vector concurrent_hash_map concurrent_unordered_map 태스크 스케줄러 타이밍
11. TBB의 주요 기능 Task 병렬화 될 작업 단위 (raw thread 대신 사용) C++ 함수 객체(functor, function object)로 정의 테스크에 대한 정확한 이해를 위한 두가지 선행 지식 스레드 추상화 직접 스레드를 생성하고 일감을 효율적으로 분배하고 관리하는 복잡함을 뒤에 감추는 논리적 접근 함수 객체 평소에 익숙하지 못할 경우 TBB 테스크를이해하는데에 장애가 될 수 있음
12. TBB의 주요 기능 Task Scheduler 테스크스케쥴러가Blocked Range라는 Range 객체를 통해 테스크를 각 코어에 분배(Work Stealing) 병렬 프로그래밍에서 각 스레드에게균형있게 작업량을 주는 것이 중요 Parallel_for와 같은 TBB 알고리듬은테스크스케쥴러에 기반을 두고 실행 TBB는 생성될 개별 테스크들의 개수를 런타임에 결정, Range 객체를 통해 전체 범위를 재귀적으로 분할하여 분할된 하위 범위를 생성된 테스크에 할당하고 실제 스레드에 잘 들어맞도록 스케줄링 TBB는 타 스레딩 패키지처럼 직접 조정성 처리를 해 줄 필요가 없다(Scalability)
13. TBB의 주요 기능 #include "tbbask_scheduler_init.h“ // 헤더 파일 포함 using namespace tbb; // namespace 사용 int main() { task_scheduler_initinit; // 객체 선언 return 0; } // 소멸은 기본 소멸자가 실행시 컴파일러가 자동으로 호출
14. TBB의 주요 기능 Memory Allocator 매우 빠르고 효율적인 메모리 도구 C++의 기본 allocator를 바로 바꿔 줄 수도 있는 proxy 제공 STL용 allocator를 바로 바꿔 줄 수 있음 Scalable_allocator Processor 개수에 맞춰서 allocator가 만들어짐 매우 빠르다. Single thread에서도 기본 windows allocator보다 2~3배 정도 빠르다 Cache_aligned_allocator False sharing을 방지하기 위해 존재 Allocate 하는데이터 간에 cache line size 만큼 간격이 존재 Thread간 공유하는 데이터를 이 allocator로 바꿔줘야 한다.
18. 참고 www.threadingbuildingblocks.org 병렬화의 문제점들과 TBB 를 이용한 해결 Seed9 Games R&D 연구소 이경만(PDF) 프로그래밍의 정도 : 확장성과 신뢰성을 갖춘 응용 프로그램 제임스랜더스 인텔 국장 (PDF) TBB inAction TBB 역자 이창재 (PDF) Intel TBB를 써서 메모리 할당하기 Rein’s world(http://rein.kr/blog/archives/1817)