일시 : 2012-05-10( 목 ) 17:00~17:50 장소 : 삼성동섬유센터 3 층이벤트홀 발표 : 이창재부장 C++ 개발자를위한하이퍼포먼스개발전략 글로벌활용사례와함께하는 TBB 도입전략
목차 병렬프로그래밍이해및 TBB 기초 TBB 글로벌사례및국내동향 TBB 실무적용 TIPS
1 15 병렬프로그래밍기초 분 병렬화를위한상식적접근, 전문연구, 인텔의병렬기술 그리고 TBB
Ice Break 직렬 병렬 Serial Parallel Core 1 Core 2 Core 3 Core 4 Core 1 Core 2 Core 3 Core 4 Make all cores busy! 그렇다면, 병렬화란? 글로벌활용사례와함께하는 TBB 도입전략 4
상식적으로생각해본다면 어떻게하면빠른시간에작업을완수할까? 작업을여러일꾼에게나누고 동시에모두바쁘게철저히일을시킨다! 나누고? 여러일꾼? 동시에? How? 모두바쁘게? 철저히? 글로벌활용사례와함께하는 TBB 도입전략 5
생각의정리! 나누고 작업범위분할! 여러일꾼 멀티스레딩! 동시에 멀티프로세싱! 모두바쁘게 관리기능필요! 철저히 관리기능필요! 글로벌활용사례와함께하는 TBB 도입전략 6
상식의한계를넘어서! 1 작업범위를여러개로나누어동시에실행시킨다! 2 비슷하게실행되도록적절히작업범위를나눈다! 3 각정적범위를처리하는스레드들을생성후동시에실행! 4 좀더일반화, 원하는만큼스레드를생성하도록! 5 각스레드를코어에분배!............. 6 범위를잘게나누어스레드풀 (Pool) 을구성하고스케줄링! 7 스레드생성, 관리및동기화를추상화! 그이상은? 글로벌활용사례와함께하는 TBB 도입전략 7
전문연구결과 : Flynn 의병렬처리분류 SISD Single Instruction stream, Single Data stream 단일명령으로단일데이터처리 파이프라인처리 SIMD Single Instruction stream, Multiple Data stream 단일명령으로다중데이터처리 벡터처리 MISD Multiple Instruction stream, Single Data stream 다중명령으로단일데이터처리 이론적으로만연구됨 MIMD Multiple Instruction stream, Multiple Data stream 다중명령으로다중데이터처리 멀티프로세싱 글로벌활용사례와함께하는 TBB 도입전략 8
병렬화프로그래밍기술의발전사 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 Chare Kernel Threaded-C JSR-166 STAPL ECMA CLI McRT OpenMP 1.0 OpenMP 2.0 C/C++ version OpenMP 2.5 OpenMP 3.0 OpenMP 3.1 Intel Parallell Building Blocks Intel TBB 1.0 Intel TBB 2.0 Intel TBB 3.0 Intel TBB 4.0 Update 3 Cilk (MIT) Intel Ct CUDA 1.0 + RapidMind Cilk++ OpenCL 1.0 Intel ArBB beta Intel Cilk Plus Microsoft PPL beta end Update 6 OpenCL 1.2? CUDA 4.1 글로벌활용사례와함께하는 TBB 도입전략 9
인텔병렬삼총사 Parallel Building Blocks TBB Threading Building Blocks ArBB Array Building Blocks Cilk Plus 멀티프로세싱 템플릿라이브러리 벡터처리전용 템플릿라이브러리 멀티프로세싱 + 벡터처리 언어확장 병렬알고리즘및컨테이너 조정가능한메모리할당 자동태스크스케줄링 동기화 차세대인텔플랫폼자동적응 결정적병렬화 3개의간단한키워드사용 배열표기법제공 작업 / 데이터병렬화동시지원 직렬코드와유사한로직유지 오픈소스 추상화와고급제어동시지원 C++ only JIT + VM 기술동시지원 C++ only 간단함 + 강력함 C 와 C++ 지원 글로벌활용사례와함께하는 TBB 도입전략 10
TBB 기초사항
병렬화를위한 TBB 의아이디어 실행시간 잘게쪼갠다 코어 0 일꾼들에게 분배한다! 코어 1 코어 2 코어 3 + 스케줄링!!! 글로벌활용사례와함께하는 TBB 도입전략 12
TBB 란? 스레드추상화기술 인텔제작 스레드가아닌 태스크 개념도입 기존병렬처리기술과호환 특징 일반 최초출시 2006 년 8 월 ver 1.0 Up 4 최신버전 2012년 4월 ver 4.0 중첩병렬화지원 TBB 오픈소스 C++ 라이브러리 실시간처리는지원하지않는다! 목표 성능 Performance 조정성 Scalability 글로벌활용사례와함께하는 TBB 도입전략 13
TBB 기술구조 알고리즘 기본알고리즘 조정성있는메모리할당자 parallel_for parallel_for_each parallel_reduce parallel_deterministic_reduce parallel_scan 고급알고리즘 parallel_while parallel_do parallel_preorder pipeline parallel_pipeline parallel_sort parallel_invoke scalable_malloc scalable_free scalable_realloc scalable_calloc scalable_allocator cache_aligned_allocator zero_allocator 동기화 ( 상호배제 ) 동시컨테이너 concurrent_queue concurrent_bounded_queue concurrent_vector concurrent_hash_map concurrent_unordered_map 뮤텍스 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 타이밍태스크스케줄러 글로벌활용사례와함께하는 TBB 도입전략 14
설치환경 In case of Windows http://threadingbuildingblocks.org/product.php OS IDE Windows XP Professional Windows Server 2003 Windows Vista Windows 7 Windows 8 Visual Studio 2003 Visual Studio 2005 Visual Studio 2008 Visual Studio 2010 Visual Studio 2011 Not Recommended Windows 2000 Visual Studio 6.0 Visual Studio 2002 C++ Builder 글로벌활용사례와함께하는 TBB 도입전략 15
TBB 다운로드사이트 www.threadingbuildingblocks.org 최신버전 : ver 4.0 update 4 Click Downloads 글로벌활용사례와함께하는 TBB 도입전략 16
TBB 설치 다운로드파일을원하는폴더에압축을풀고다음과같이 설치경로 를기억해둔다. Installation Path Keep in mind! 글로벌활용사례와함께하는 TBB 도입전략 17
TBB 설치 환경변수등록 1 제어판 시스템 고급시스템설정 고급 환경변수 2 앞에서기억해둔 설치경로 를 TBBROOT 라는사용자변수로등록한다. Parallel Studio 를설치한경우는다음경로로자동생성된다!!! C:\Program Files (x86)\intel\parallel Studio 2011\Composer SP1\tbb 글로벌활용사례와함께하는 TBB 도입전략 18
TBB 개발환경설정 1. Visual Studio 에서프로젝트설정을한다. 먼저다음과같이 모든구성 에서포함디렉터리설정을한다. $(TBBROOT)\include 글로벌활용사례와함께하는 TBB 도입전략 19
TBB 개발환경설정 2. 다음으로라이브러리디렉터리설정을한다. 자신의 OS 와 VS 버전에맞게하위경로를선택하는것이중요하다. $(TBBROOT)\lib\ia32\vc9 글로벌활용사례와함께하는 TBB 도입전략 20
TBB 개발환경설정 3. 다음과같이구성별로종속성설정을한다. 구성별로각각 tbb_debug.lib, tbb.lib 입력 글로벌활용사례와함께하는 TBB 도입전략 21
TBB 개발환경설정 4. \bin\ia32\vcxxx 에있는 DLL 파일 tbb.dll 과 tbb_debug.dll 을윈도우시스템디렉터리에복사한다. 글로벌활용사례와함께하는 TBB 도입전략 22
TBB 글로벌활용사례 15 분 게임, 그래픽, 시뮬레이션, 대용량복잡데이터처리등의분야에서활약하고있는 TBB!
TBB 글로벌활용사례 AutoDesk 사의 3D 그래픽 SW Maya 도입시기 2006 년 ~ 활용사례 영화, 게임, TV, 시각디자인분야 TBB 기반 MayaAPI 제작 Parallel code must be extracted into separate classes, which is mo re invasive than OpenMP. 병렬코드를개별클래스로관리할수있다는점이 OpenMP에비한장점입니다 Maya 의활용사례 DreamWorks 사의영화 Insomniac Games Resistance 2 의 CG 제작 Shilo TV 제작 ( 에미상수상 ) 글로벌활용사례와함께하는 TBB 도입전략 24
TBB 글로벌활용사례 Exocortex Technologies 의 시뮬레이션 SW 도입시기 2009 년 ~ 활용사례 홍수시뮬레이션부문에도입 SW 성능 2.5 배향상 회사의수익률크게증가 글로벌활용사례와함께하는 TBB 도입전략 25
TBB 글로벌활용사례 Progress Apama 사의 CEP 엔진 도입시기 2009 년 ~ 활용사례 CEP 엔진 4.0 버전부터도입 주로 Scalable allocator 적용 최대 30 배까지성능향상 CEP 란? Complex Event Processing : 복잡이벤트처리 90년대부터학계에서시작 기업내이벤트를실시간으로수집분석하여의사결정을지원하는전사적이벤트처리인프라 실시간분석이강조되는금융, 증권의알고리즘트레이딩에효과적인솔루션 Progress Apama의 CEP 엔진은코스콤의 파워알고 에사용되었으며, Forrester Research 에서 2009년 1위로선정 글로벌활용사례와함께하는 TBB 도입전략 26
TBB 글로벌활용사례 Deep Shadows 사의 게임성능및포팅 도입시기 2008 년 ~ 활용사례 자사게임을별도의코드수정없이 XBox360 에성공적으로포팅 Road to Hell 엔진성능 40% 향상 2001 년우크라이나에설립된게임회사 기사전문 : http://www.develop-online.net/news/30160/deep-shadows-talks-multiprocessor-optimisation 글로벌활용사례와함께하는 TBB 도입전략 27
TBB 글로벌활용사례 DreamWorks Animation 사의 3D 그래픽 도입시기 2009 년 ~ 활용사례 고정밀 3D 렌더링부분에도입 글로벌활용사례와함께하는 TBB 도입전략 28
TBB 글로벌활용사례 Epic Games 사의 게임엔진에통합 도입시기 2009 년 ~ 활용사례 64 비트버전인 Unreal Engine 3 에통합 Scalable allocator 도입 기사전문 : http://www.develop-online.net/news/32575/threading-building-blocks-integrated-into-ue3 글로벌활용사례와함께하는 TBB 도입전략 29
TBB 글로벌활용사례 Adobe 사의 Creative Suite 5.0 도입시기 2010 년 ~ 활용사례 고객에게고정밀디지털컨텐츠 개발및최적화제공 글로벌활용사례와함께하는 TBB 도입전략 30
TBB 글로벌활용사례 Open Cascade 에서 TBB 도입 도입시기 2011년 ~ 활용사례 기존기술기반을병렬화 CAD/CAM/CAE 분야 수치적시뮬레이션분야 PLM 분야 Adopting Intel TBB saves significant time by reducing our need to invest in the development of similar multi-threading technology from scratch - Andrey Betenev, Open CASCADE Technology Manager. 멀티스레딩기술을처음부터적용하는것에비해 TBB를사용하여투자비용을상당히줄였습니다 Open Cascade : CAD SW 개발을위한오픈플랫폼 기사전문 : http://www.opencascade.org/about/news/issue167 글로벌활용사례와함께하는 TBB 도입전략 31
TBB 글로벌활용사례 중국 The9 사의개발센터에서 TBB 도입 도입시기 2009 년 ~ 활용사례 게임서버에적용하여 4 코어에서 3.5 배성능향상 The9 : 중국 3 대게임개발및퍼블리셔중하나. 2009 년까지 WOW(World of Warcraft) 운영 글로벌활용사례와함께하는 TBB 도입전략 32
Count TBB 국내동향 Blog Activity in Korea 70 60 R² = 0.8979 50 40 30 20 10 0 2006-F 2006-L 2007-F 2007-L 2008-F 2008-L 2009-F 2009-L 2010-F 2010-L 2011-F 2011-L Intel s Effort for the TBB Upgrade Version Up Update 1.0 1 2 1.1 2.0 1 2 3 2.1 1 2 3 4 1 2 3 2.2 3.0 1 2 3 4 5 6 7 8 4.0 1 2 3 2006 2007 2008 2009 2010 2011 2012-F 글로벌활용사례와함께하는 TBB 도입전략 33
TBB 실무적용 TIPS 20 분 기존개발환경에서쉽게사용할수있는 C++ 라이브러리, 높은수준의제어가능
TIP 1 Big Picture TBB 를사용한병렬화절차
Big Picture Step 1. 디버깅 Serial Program Step 2. 핫스팟찾기 Serial Program Step 3. 코드정리 Serial Program for (int i = 0; i < N; i++) { ----------------------- ----------------------- ----------------------- 3000 lines ----------------------- ----------------------- } for (int i = 0; i < N; i++) { Process(i); } 1 직렬프로그램에있는버그는병렬 프로그램에서도재현됨 2 찾고수정하는작업이훨씬어려움 1 Parallel Studio 활용 2 Hotspot 이아닌곳을병렬화하면 역효과가발생할수도있음 1 병렬로직에서재활용을위함 2 기존코드를정리하는효과 글로벌활용사례와함께하는 TBB 도입전략 36
Big Picture Step 4. 알고리즘선택 Step 5. 태스크정의 Step 6. 데이터교환? for while sort TBB parallel_for parallel_for_each parallel_reduce parallel_do parallel_while parallel_sort Task class MyCalculation { MyCalculation(); Serial Program How does the task use the data in the serial code? void operator()( ) const { for ( ) { // Reuse! } } } task Data 1 직렬로직에해당하는알고리즘선 택 2 TBB 4.0 기준 12 개알고리즘존재 1 operator() 중복을통한함수객체생성용클래스 ( 구조체 ) 선언 2 직렬로직재활용 3 알고리즘마다코딩스타일다름 1 이미지, 파일등처리대상데이터 를어떻게태스크에넘겨줄것인가? 2 직접 or 간접? 유효범위는? 글로벌활용사례와함께하는 TBB 도입전략 37
Big Picture Step 7. 안정성 / 조정성 All Cores are busy? TBB concurrent_queue Container concurrent_vector concurrent_hash_map Memory Mutex scalable_malloc scalable_free cache_aligned_allocator 성능? 1 스레드에안전한컨테이너사용 2 조정성있는메모리할당 3 상호배제사용 조정성? 글로벌활용사례와함께하는 TBB 도입전략 38
TIP 2 알고리즘선택 Guide
알고리즘? 알고리즘 = Algorithm 수학적개념에서출발 아랍의수학자알콰리즈미 (Alkwarizmi, 780-850) 의이름에서유래 [ 출처 ] 네이버백과사전 어떠한문제를해결하기위한여러동작들의유한한모임이다. [ 출처 ] 위키백과 컴퓨터가어떤일을수행하기위한단계적방법이다. [ 출처 ] 네이버백과사전 TBB C++ 알고리즘을작성할때사용하는 for, while, sort 와같은키워드, 함수와 그절차들의집합자체를템플릿함수화한결과물이다! 글로벌활용사례와함께하는 TBB 도입전략 40
for 루프를병렬화할때... // 각루프반복이서로독립적인경우 for (int i = 0; i < N; i++) { ApplyFilter(bitmap[i]); parallel_for }; // 각루프반복결과가독립적이며한값으로귀결되어야할때 int result = 0; for (int i = 0; i < N; i++) { parallel_reduce }; result += ApplyFilter(bitmap[i]); 리덕션연산! 글로벌활용사례와함께하는 TBB 도입전략 41
여러함수를병렬로호출하고자할때... // 여러함수호출 ( 호출순서에관계가없어야한다 ) A(); B(); C(); parallel_invoke 글로벌활용사례와함께하는 TBB 도입전략 42
대용량배열을 STL 보다빠르게정렬하고싶을때... #include <vector> int main() { vector<int> v; ( 중략 ) std::sort(v.begin(), v.end()); } parallel_sort #include <tbb/parallel_sort.h> int main() { vector<int> v; ( 중략 ) tbb::parallel_sort(v.begin(), v.end()); } 글로벌활용사례와함께하는 TBB 도입전략 43
LAB : parallel_sort 와 STL sort 비교하기 설명 1000 만개의대량데이터를각방법으로빠르게정렬한후각실행시간을비교해본다. 1. STL 의정렬시간은몇초인가? 2. parallel_sort 를사용한정렬시간은몇초인가? 3. 속도는몇배증가했는가? 글로벌활용사례와함께하는 TBB 도입전략 44
TIP 3 태스크작성 Guide
태스크이해 Task = 태스크 = 작업작업? TBB 에서정의된개념일뿐이다 병렬화대상 작업? 글로벌활용사례와함께하는 TBB 도입전략 46
태스크의뼈대는함수객체에서유래 // 함수객체를구현하기위한클래스예 class MyFunction { void operator()(int x) { // 구현코드 } }; // 함수객체를사용하는예 MyFunction f; f(10); // 일반함수를호출하는것과동일 Task = 태스크 병렬화대상 작업 태스크 = 함수객체 = Function Object = Functor 글로벌활용사례와함께하는 TBB 도입전략 47
병렬알고리즘 : parallel_for 에사용할태스크 class MyTask 클래스이름 { private: 데이터멤버선언 float* my_data; public: 생성자 MyTask (float a[]) : my_data(a) {} }; operator() void 연산자 (const 오버로딩 blocked_range<size_t>& r) const { float* a = my_data; }; for(size_t i = r.begin(); i!= r.end(); i++) MyCalulation(a[i]); 글로벌활용사례와함께하는 TBB 도입전략 48
LAB 행렬곱셈병렬화 설명 두개의 N x N 행렬을생성하고행렬곱셈을한다. parallel_for 를사용하여직렬버전을병렬화하고실행시간을비교해본다. 1. 직렬실행시간은몇초인가? 2. 직렬프로그램을수정하여병렬화하는절차 1 태스크 (Body 클래스 ) 를생성한다. 곱셈처리는 operator() 연산자중복함수에구현한다. 2 병렬화가구현된루프수준은? 3 blocked_range와 Body 클래스를인수로하여 parallel_for를사용한구현으로수정한다. 4 컴파일하고실행해본다. 3. 병렬실행시간은몇초인가? 4. 속도는몇배증가했는가? 글로벌활용사례와함께하는 TBB 도입전략 49
병렬알고리즘 : parallel_for 사용법 // TBB를위한포함 #include <tbb/parallel_for.h> #include <tbb/blocked_range.h> #include <tbb/tick_count.h> using namespace tbb; void ParallelCalculation(float a[], int n) { parallel_for( blocked_range<int>(0, n, 1000), MyTask(a) ); } 글로벌활용사례와함께하는 TBB 도입전략 50
병렬알고리즘 : parallel_reduce 에사용할태스크 class MyTask { private: float* my_data; public: float sum; void operator()(const blocked_range<size_t>& r) { float* a = my_data; for (size_t i = r.begin(); i!= r.end(); ++i) sum += MyCalculation(a[i]); MyCalulation(a[i]); } const MyTask(MyTask& x, split) : my_data(x.my_data), sum(0) { } MyTask(float a[]) : my_data(a), sum(0) { } }; void join(const MyTask& y) { sum += y.sum; } 글로벌활용사례와함께하는 TBB 도입전략 51
병렬알고리즘 : parallel_reduce 사용법 #include "tbb\parallel_reduce.h" #include "tbb\blocked_range.h" void ParallelSum(float a[], size_t n) { ParallelSumBody body(a); parallel_reduce( blocked_range<float*>(0, n, 10000), body ); } 글로벌활용사례와함께하는 TBB 도입전략 52
PI 계산하기 설명 수치적분법을사용하여 PI(3.141592 ) 의근사값을직렬및병렬로계산하고, parallel_reduce 의사용법을익힌다. 0.1 π = 0 1 4 1 + x 2 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0.0 A 4 간격 = 0.1 4 1 + 0.35 2 부분면적 A 4 = 0.1 ⅹ 4 1+0.35 2 0.05 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.95 전체면적 A = A 0 + A 1 + + A 9 = 0.1 ⅹ 4 1+0.05 2 + 0.1 ⅹ 4 1+0.15 2 + + 0.1 ⅹ 4 1+0.95 2 = 3.142426 글로벌활용사례와함께하는 TBB 도입전략 53
병렬알고리즘 : parallel_invoke 사용법 설명 여러함수들을한꺼번에병렬로실행하게해주는템플릿함수역할을한다! 포함 #include <tbb/parallel_invoke.h> 예제 A(), B(), C() 함수를병렬로실행한다. #include "tbb/parallel_invoke.h" using namespace tbb; class MyFunctor { int arg; public: MyFunctor(int a) : arg(a) {} void operator()() const { // Do Something! } }; void RunFunctionsInParallel() { MyFunctor A(1); MyFunctor B(2); MyFunctor C(3); tbb::parallel_invoke(a, B, C); } 글로벌활용사례와함께하는 TBB 도입전략 54
Divide-Conquer ( 분할정복 ) 패턴에사용할태스크 class MyTask: public task { public: const long n; long* const sum; MyTask(long n_, long* sum_) : n(n_), sum(sum_) {} task* execute() // 가상함수 task::execute의중복정의 { if (n < CutOff) { *sum = DoCalculation(n); } else { long x, y; MyTask& a = *new(allocate_child()) MyTask(n - 1, &x); MyTask& b = *new(allocate_child()) MyTask(n - 2, &y); set_ref_count(3); // 3 = 2개의자식 + 1개의대기 (wait) 참조자설정 } }; spawn(b); spawn_and_wait_for_all(a); *sum = x + y; } return NULL; 두개의자식생성 ( 재귀 ) 자식들을실행 A 는실행후다른자식들이모두완료될때까지기다림 ( 동기화 ) 글로벌활용사례와함께하는 TBB 도입전략 55
태스크스포닝 spawn 물고기가알을낳다 작업분해를구현하기위해 자식태스크가생성되는것을 물고기가알을낳는것이비유! 병렬화개념을위해단순히 create 가아닌 spawn 을사용한것임. 낳는다 가아닌 스포닝되었다 라고번역! 글로벌활용사례와함께하는 TBB 도입전략 56
C# 에서 TBB 를이용할수있을까요?
Q & A
감사합니다! C++ 개발자를위한하이퍼포먼스개발전략 글로벌활용사례와함께하는 TBB 도입전략 문의 : changjay@hanmail.net