ROCK YOUR CODE Intel Software Conference 2010 Parallel Programming using Intel Parallel Studio Threading Building Blocks in Action Oct 12, 2010 EL Tower, Seoul TBB 역자이창재 changjay@hanmail net
Goal Important Parallel programming trend and status in Korea Key challenges for developers How to enhance the performance of parallel application by using TBB TBB 를이용한병렬프로그래밍실무 Slide No. 2
Agenda Motivation Background TBB Overview TBB Basic TBB in Action Vision Image Analysis Reference Summary TBB 를이용한병렬프로그래밍실무 Slide No. 3
Motivation 슈퍼컴퓨터, 병렬컴퓨터분야에서만연구되어온병렬프로그래밍 슈퍼컴퓨터 병렬컴퓨터 멀티코어프로세서의대중화병렬프로그래밍가능영역이확장되었다! 개인용컴퓨터 그러나, 코어가늘어난다고프로그램의성능이저절로증가하는것이아님 멀티코어프로그래밍필요 TBB 를이용한병렬프로그래밍실무 Slide No. 4
Motivation 병렬처리기술을실무에쉽게도입할수있는가? 병렬프로그래밍기술이필요하지만 어려워서도입부에서포기 배우기쉬운기술이면좋겠다! 스레드를직접생성, 관리, 동기화하는 복잡함과불편함때문에포기 스레드를직접관리하지않는 추상화된기술이면좋겠다! 모두의기술이될수없음으로인해포기 개발자간공유와인수인계가쉬우면좋겠다! 역시불편하고어렵다는 공감대를형성하기에이르고 기존개발환경에쉽게도입할수있는 라이브러리형태면좋겠다! TBB!!! TBB 를이용한병렬프로그래밍실무 Slide No. 5
Background Single Core vs. Multi Core Single Core 대안기술 Multi Core CPU Core Cache C CPU C C C 펜티엄 4 프레스캇 2.8GHz 펜티엄 4 노스우드 3.0 GHz 동시멀티스레딩 (SMT) 하나의 CPU를외부에서 2개처럼보이게함. 하이퍼스레딩에서사용 싱글코어의대안으로 제시됨 Cache 성능은클록속도에비례 속도가빨라지면전력소모가커지고발열이많아더이상속도를늘리기가어려웠다. 여러개의코어를탑재하기때문에보다낮은주파수에서작동성능향상 싱글코어에서소모되는전력을여러코어에분산 TBB 를이용한병렬프로그래밍실무 Slide No. 6
Background 헥사코어, 옥타코어 6 코어걸프타운 (Gulftown) 8 코어네할렘 (Nehalem) 6 8 TBB 를이용한병렬프로그래밍실무 Slide No. 7
Background 멀티스레딩 vs. 병렬처리 1. 멀티스레딩 스레드스위칭을통해병렬처리효과를구현하고, 결국은동시성에도달하려는기술 스레드 스레드 스레드 2. 병렬처리 멀티스레딩은하나의프로세서에서여러프로세서를사용하는효과를볼수있지만, 진정한병렬처리를위해서는스레드들을각프로세서에분배하여실행해야한다. 병렬컴퓨터 CPU CPU CPU 스레드스레드스레드 멀티코어컴퓨터 Core Core Core 스레드스레드스레드 TBB 를이용한병렬프로그래밍실무 Slide No. 8
Background CPU 사용비교 하나의코어만사용될때 두개의코어에부하가분산된상태 TBB 를이용한병렬프로그래밍실무 Slide No. 9
Background 데이터병렬화 vs. 작업병렬화 1. 데이터병렬화 대문자변환 2. 작업병렬화 TBB 를이용한병렬프로그래밍실무 Slide No. 10
Background Embarrassingly Parallelism 당황스러운병렬처리 Parallelism는문맥에따라 병렬성, 병렬처리 및 병렬이론 등으로번역됨. 병렬컴퓨팅에서, ' 당황스러운병렬처리 ' 란작업간에의존성이없이독립적이어서그냥병렬화가되는경우를말함. 예 : 화면에있는각픽셀이독립적으로렌더링되는그래픽처리 이와같이병렬성이너무풍부하여그냥병렬화구현이되는경우를 ' 당황스럽다 ' 고표현한것임. 김민장님 (minjang@gatech.edu) 께서번역에도움을주셨습니다. TBB 를이용한병렬프로그래밍실무 Slide No. 11
Background 고려사항 1. 불확실성문제 리소스를동시접근하는병렬프로그래밍에서동시성에대한대가로발생하는문제 대표적인경우 데드락 (deadlock) 레이스컨디션 (race condition) [ 해결책 ] 고전적인방법 LOCK 상호배제의원리이다. 명시적잠금 : 동시에한스레드만해당데이터에접근하도록중앙관리 단점 : 일일이관리해야하는불편, 부하문제발생가능 보다나은방법 암시적잠금을사용한다. Fine-grained 잠금을사용한다. 명시적잠금은최후의수단으로한다. TBB에서제공하는상호배제기능 뮤텍스 (Mutex) : 여러태스크들이접근할수있는전역변수 원자적연산 (Atomic Operation) : 하드웨어에서제공하는원자적연산에기반을둠 인터럽트의영향을받지않으려는시도 TBB를이용한병렬프로그래밍실무 Slide No. 12
Background 고려사항 2. 메모리거짓공유 (False-Sharing) 병렬프로그램에서캐시를이용한데이터동기화가일어나는과정에서발생할수있는성능저하문제 (Worst 100x) 캐시라인 : 캐시메모리의접근단위 ( 프로세서마다다름. 보통은 64바이트 ) 1. Core 1이데이터 1을사용하면 2. 동일한캐시라인에있다는이유만으로 Core 2의데이터 2가무효화되는데 Core 1 사용 데이터 1 Core 1 데이터 1 이러한불필요한동작이끊임없이발생 Core 2 데이터 2 Core 2 데이터 2 이때데이터 2 는메모리에저장 불필요한동작이발생 해결책 : 서로다른코어의데이터를인접영역에생성하지않거나, TBB 의 cache_aligned_allocator 사용 TBB 를이용한병렬프로그래밍실무 Slide No. 13
TBB Overview Mind Map 스레드가아닌 태스크 개념도입 Intel 제작 더높은수준, 더단순한해결책제공 기존병렬처리기술과호환 특징 일반 최초출시 2006 년 8 월 ver 1.0 최신버전 2010 년 4 월 ver 3.0 TBB 오픈 C++ 라이브러리 병렬처리기술 목표 성능 Performance 스레드추상화기술 기술관점 조정성 Scalability TBB 를이용한병렬프로그래밍실무 Slide No. 14
TBB Overview 역사적배경 TBB 를이용한병렬프로그래밍실무 Slide No. 15
TBB Overview 타스레딩기술과비교 Challenges for parallel programming Windows threads OpenMP Threading Build Blocks Task level O O Cross-platform support O O Scalable runtime libraries O Threads Control O Pre-tested and validated O O C Development support O O Intel Threading Tools support O O O Maintenance for tomorrow O O Scalable memory allocator light mutex O O Processor affinity O Thread affinity [ 참고 ] http://software.intel.com/en-us/blogs/2008/12/16/compare-windows-threads-openmp-intel-threading-building-blocks-for-parallelprogramming TBB 를이용한병렬프로그래밍실무 Slide No. 16
TBB Overview 전체기술구조 기본알고리즘 고급알고리즘 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 상호배제 뮤텍스 spin_mutex queuing_mutex spin_rw_mutex queuing_rw_mutex 조정성있는메모리할당자 scalable_malloc scalable_free scalable_realloc scalable_calloc scalable_allocator cache_aligned_allocator 원자적연산 recursive_mutex null_mutex null_rw_mutex fetch_and_add fetch_and_swap fetch_and_store fetch_and_increment zero_allocator fetch_and_decrement 태스크스케줄러 타이밍 TBB 를이용한병렬프로그래밍실무 Slide No. 17
TBB Overview 태스크 (Task) 태스크란? 병렬화될작업단위 (Raw thread 대신에 ) 에서정의한단어일뿐, 특정기술개념은아님 C++ 함수객체 (Functor, function object) 로정의 태스크에대한정확한이해를위한두가지선행지식 스레드추상화 : 직접스레드를생성하고일감을효율적으로분배하고관리하는복잡함을뒤에감추는논리적접근 함수객체 : 평소에익숙하지못할경우 TBB 의태스트를이해하는데도장애가될수있음 TBB 를이용한병렬프로그래밍실무 Slide No. 18
TBB Overview 함수객체 (Function Object) // 함수객체를구현하기위한클래스예 class FunctionA { void operator()(int x) { // 구현코드 } }; 코드를보면함수객체는 함수처럼동작하는클래스 임을알수있다. 함수는함수이름과괄호로구성되어있다는점에착안 C++ 기술중에연산자 (operator) 중복을사용 operator() 를중복하는클래스를객체로인스턴스화한다음괄호만붙여주면함수처럼인수를넘겨동작할수있게함 // 함수객체를사용하는예 FunctionA f; f(10); // 일반함수를호출하는것과동일 TBB에서는태스크를기술적인용어로 Body 객체 라고부르며, Body라는말은 C언어의 Function Body" 에서따왔음 클래스로구현해야복사생성을통해분신술처럼일꾼들을복제해낼수있음. 이복사본들을얼만큼생성할지, 각코어에효율적으로할당하면서병렬화효과를최대화할지에대한역할은 TBB의 태스크스케줄러 가담당 TBB 를이용한병렬프로그래밍실무 Slide No. 19
TBB Overview 태스크스케줄러 (Task Scheduler) 태스크스케줄러가 Blocked Range라는 Range 객체를통해태스크를각코어에분배 (Work Stealing) 병렬프로그래밍에서각스레드에게균형있게작업량을주는것이중요 parallel_for와같은 TBB 알고리즘은태스크스케줄러에기반을두고실행 TBB는생성될개별태스크들의개수를런타임에결정하며, Range 객체를통해전체범위를재귀적으로분할하여분할된하위범위를생성된태스크에할당하고실제스레드에잘들어맞도록스케줄링 Core 스레드 태스크스케줄러 TBB Blocked Range 태스크 Pool 태스크태스크태스크 Core 스레드 Core 스레드 TBB 를이용한병렬프로그래밍실무 Slide No. 20
TBB Overview 조정성 (Scalability) 조정성이란? 프로세서코어개수에비례하여프로그램성능이자동으로결정되는특성 확장과축소모두를포함하는개념 ( 단순히 확장성 으로번역되면안되는이유 ) 듀얼코어에서는두개의코어가모두사용, 쿼드코어에서는네개의코어가모두사용 All Cores are Busy TBB에서는타스레딩패키지처럼직접조정성처리를해줄필요가없다. TBB 를이용한병렬프로그래밍실무 Slide No. 21
TBB Overview Grain 크기 하나의코어에합리적인크기의작업덩어리 (grain) 를분배하기위한개념 과도한병렬처리에대한부하를막아준다. 처리할전체범위가 grain 크기보다클동안, TBB는이범위를독립적으로스케줄링되는개별하위범위들로계속 ( 재귀적으로 ) 분할한다. 지정방법 ( 경험적방법론 - 휴리스틱 ) 1단계 : 충분히큰값으로시작. 보통은 10,000으로설정하는것이좋다. 2단계 : 프로그램실행후결과관찰 3단계 : 값을절반으로줄이고프로그램속도변화관찰 최적치를찾을때까지반복 TBB 를이용한병렬프로그래밍실무 Slide No. 22
TBB Overview 알고리즘템플릿 루프병렬화알고리즘 parallel_for, parallel_reduce 고정된개수의루프반복들에대해부하분산이고려된병렬실행지원 parallel_scan 스캔 (scan) 이라고도알려진 prefix 계산을병렬로실행 (y[i] = y[i-1] op x[i]) 하는템플릿함수 스트림에대한병렬알고리즘 parallel_while pipeline 비정형적인스트림또는작업더미 (dummy) 에사용실행중에작업더미에다른작업을추가하기위한기능제공 작업단계들의선형시퀀스가있을때사용전송중에있을수있는항목들의최대개수를지정 병렬정렬 parallel_sort 단일프로세서에서 O(n log n) 을넘지않고프로세서개수가늘어날수록 O(N) 에근접하는평균시간복잡성을가진비교정렬 TBB 를이용한병렬프로그래밍실무 Slide No. 23
TBB Basic 초기화 절차 1단계 : 헤더파일 task_scheduler_init.h 포함 2단계 : 네임스페이스 tbb 사용선언 3단계 : task_scheduler_init 형식객체선언 Example #include "tbb\task_scheduler_init.h" using namespace tbb; int main() { task_scheduler_init init; return 0; } 위와같이선언만으로초기화가되며, 소멸은기본소멸자실행시컴파일러가자동으로호출해준다. TBB 를이용한병렬프로그래밍실무 Slide No. 24
TBB Basic 루프병렬화절차 1단계태스크정의 = Body 객체를위한 Class 작성 2 단계 알고리즘에인수로대입할 Range 객체정의 3 단계 앞에서정의한 Body 객체와 Range 객체를알고리즘에대입 TBB 를이용한병렬프로그래밍실무 Slide No. 25
TBB Basic parallel_for 고정개수의독립적인반복에사용하는알고리즘템플릿 Form 1 범위객체 void parallel_for(const Range& range, const Body& body); #include "tbb\parallel_for.h" #include "tbb\blocked_range.h" void ParallelCalculation (float a[], size_t n) { ParallelCalculation body; parallel_for( blocked_range<size_t>(0, n, 10000), body(a) ); } 바디객체 TBB 를이용한병렬프로그래밍실무 Slide No. 26
TBB Basic parallel_for 자동분할사용하기 Form 2 범위객체 void parallel_for(const Range& range, const Body& body, Partitioner& partitioner); 분할자 바디객체 #include "tbb\parallel_for.h" #include "tbb\blocked_range.h" void ParallelCalculation (float a[], size_t n) { ParallelCalculation body; parallel_for( blocked_range<size_t>(0, n), body(a), auto_partitioner() ); } TBB 를이용한병렬프로그래밍실무 Slide No. 27
TBB Basic parallel_for parallel_for 를사용하여직렬코드를병렬화하는방법 1단계태스크정의 = Body 객체를위한 Class 작성 Body Class 를구성하는코딩스타일의허들을거뜬히넘어가십시오!!! 직렬코드의 for 루프 Body 에있는구현로직을적절히재활용하십시오!!! 2 단계 parallel_for 에인수로대입할 Range 객체정의 3 단계 앞에서정의한 Body 객체와 Range 객체를 parallel_for 에대입 TBB 를이용한병렬프로그래밍실무 Slide No. 28
TBB Basic parallel_for 1 단계 : 직렬코드를활용하여태스크정의하기 직렬방식루프코드 void SerialCalculation(float a[], size_t n) { for (size_t i = 0; i < n; ++i) MyCalculation(a[i]); } 태스크정의 = Body 클래스정의 class ParallelCalculation { float* const my_a; public: void operator()(const blocked_range<size_t>& r) const { float* a = my_a; for (size_t i = r.begin(); i!= r.end(); ++i) MyCalculation(a[i]); } ParallelCalculation(float a[]) : my_a(a) { } }; TBB 를이용한병렬프로그래밍실무 Slide No. 29
TBB Basic parallel_for Body 클래스작성법 STL 스타일의함수객체, 연산자오버로딩, const class ParallelCalculationBody 클래스이름 { private: 데이터멤버선언 float* my_a; public: 생성자 ParallelCalculationBody(float a[]) : my_a(a) {} }; operator() void operator()(const 연산자오버로딩 blocked_range<size_t>& r)const { float* a = my_a; }; for(size_t i = MyCalulation(a[i]); r.begin(); i!= r.end(); i++) TBB 를이용한병렬프로그래밍실무 Slide No. 30
TBB Basic parallel_for 2 단계 : Range 객체정의하기 blocked_range 0부터 n-1까지전체반복간격을나타낸다. parallel_for가각프로세서에대해하위간격들로나눈것이다. 생성자원형 blocked_range<t>(begin, end, grainsize) T는값형식을지정 begin과 end는반개구간 [begin, end) 을의미하는 STL 스타일의반복간격을지정 예를들어, 만일 blocked_range<int>(0, 3000, 1000) 에서 3개의프로세서 ( 코어 ) 를가동할수있다면, 각프로세서에는 1000개의반복문이할당된다. blocked_range<size_t>(0, n, 10000) TBB 를이용한병렬프로그래밍실무 Slide No. 31
TBB Basic parallel_reduce 리덕션 (reduction) 연산을수행하기위한알고리즘템플릿 reduction 은 감소 라는의미가아니라 데이터정리 의의미를가지며, 한그룹에있는모든멤버들에 sum, max, min 또는논리 AND 와같은함수를적용하는것을리덕션연산 (reduction operation) 이라고함. parallel_reduce( blocked_range<t>(begin, end, grainsize), BodyObject ); 바디객체 범위객체 #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 를이용한병렬프로그래밍실무 Slide No. 32
TBB Basic parallel_reduce 1 단계 : 직렬코드를활용하여태스크정의하기 직렬방식루프코드 float SerialSum(float a[], size_t n) { float sum = 0; for (size_t i = 0; i!= n; ++i) sum += Calculation(a[i]); return sum; } 태스크정의 = Body 클래스정의 class ParallelSum{ float* my_a; public: float sum; void operator()(const blocked_range<size_t>& r) { float* a = my_a; for (size_t i = r.begin(); i!= r.end(); ++i) sum += Calculation(a[i]); } ParallelSum(ParallelSumBody& x, split) : my_a(x.my_a), sum(0) { } void join(const ParallelSumBody& y) { sum += y.sum; } ParallelSum(float a[]) : my_a(a), sum(0) { } }; TBB 를이용한병렬프로그래밍실무 Slide No. 33
TBB Basic parallel_reduce Body 클래스작성법 Class SumBody{ float* my_a; public: float sum; void operator()(const blocked_range<size_t>& r) const { float* a = my_a; for (size_t i = r.begin(); i!= r.end(); ++i) sum += Calculation(a[i]); } SumBody(SumBody& x, split) : my_a(x.my_a), sum(0) { } SumBody(float a[]) : my_a(a), sum(0) { } }; void join(const SumBody& y) { sum += y.sum; } 1. sum을업데이트하기위해 operator() 의마지막에 const를붙이지않는다. 2. 스레드에대응하는각객체복사본의결과를병합하기위해 join 메서드추가 (split-join 메커니즘 ) 3. 분할생성자를추가로정의 split는더미인수이며복사생성자와구분하기위해역할 TBB를이용한병렬프로그래밍실무 Slide No. 34
TBB in Action 설치 (1/4) www.threadingbuildingblocks.org [Downloads] [Stable Release] TBB 3.0 다운로드! TBB 를이용한병렬프로그래밍실무 Slide No. 35
TBB in Action 설치 (2/4) 윈도우운영체제일경우 tbb30_20100406oss_win.zip 다운로드 클릭! TBB 를이용한병렬프로그래밍실무 Slide No. 36
TBB in Action 설치 (3/4) 다운로드한파일을원하는폴더에압축해제 TBB 를이용한병렬프로그래밍실무 Slide No. 37
TBB in Action 설치 (4/4) 환경변수설정 TBB_INSTALL_DIR 사용자변수로추가 TBB 버전에관계없이동일한변수명을사용하면편리 TBB 를이용한병렬프로그래밍실무 Slide No. 38
TBB in Action 개발환경셋팅 (1/4) 포함디렉터리설정 [ 모든구성 ] [C/C++] > [ 일반 ] > [ 추가포함디렉터리 ] $(TBB_INSTALL_DIR) include TBB 를이용한병렬프로그래밍실무 Slide No. 39
TBB in Action 개발환경셋팅 (2/4) 라이브러리디렉터리설정 [ 모든구성 ] [ 링커 ] > [ 일반 ] > [ 추가라이브러리디렉터리 ] $(TBB_INSTALL_DIR) ia32 vc9 lib TBB 를이용한병렬프로그래밍실무 Slide No. 40
TBB in Action 개발환경셋팅 (3/4) 종속성설정 각구성별 > [ 링커 ] > [ 입력 ] > [ 추가종속성 ] 구성별로각각 tbb_debug.lib, tbb.lib 입력 TBB 를이용한병렬프로그래밍실무 Slide No. 41
TBB in Action 개발환경셋팅 (4/4) TBB DLL 파일복사 방법 1 : 프로젝트의각구성별디렉터리에해당 DLL 복사 ( ia32 vc9 bin 에있는 ) [Debug] 폴더에 tbb_debug.dll 복사 [Release] 폴더에 tbb.dll 복사 방법 2 : System32 디렉터리에두파일모두복사 TBB 를이용한병렬프로그래밍실무 Slide No. 42
TBB in Action 기본실습 1 (parallel_for) 용도 루프의각반복에가해지는행위가독립적일때 문제정의 입력배열에있는각원소의제곱값을결과배열에저장 실험방법 실험 (1) : 배열개수를변경해가면서직렬및병렬버전의속도비교 실험 (2) : 배열개수를고정하고, Grain 크기를변경하면서최적값찾기 실습순서 1. 직렬버전작성 2. 병렬버전작성 1 태스크정의 = Body 클래스작성 2 parallel_for 구문작성 3. 실험 (1) 수행 4. 실험 (2) 수행 실습 TBB 를이용한병렬프로그래밍실무 Slide No. 43
TBB in Action 기본실습 2 (parallel_reduce) 용도 루프의모든반복이하나의결과값에영향을끼칠때 ( 여러입력값으로부터하나의결과값산출 (reduce)) 문제정의 입력배열에있는모든원소의평균값구하기 실험방법 배열개수를변경해가면서직렬및병렬버전의속도비교 실습순서 1. 직렬버전작성 2. 병렬버전작성 1 태스크정의 = Body 클래스작성 2 parallel_reduce 구문작성 3. 실험수행 실습 TBB 를이용한병렬프로그래밍실무 Slide No. 44
TBB in Action Vision Image Analysis 개요 Wafer Edge에있는 Crack, Chipping을자동검사하는 Vision 장치의이미지처리 MFC 애플리케이션의성능을향상시키기위해병렬화가능부분을식별하고병렬구현으로변경하는과정을실습을통해알아본다. TBB 를이용한병렬프로그래밍실무 Slide No. 45
TBB in Action Vision Image Analysis 실험방법 비전장치에의해획득된 60 개의 Edge 이미지를분석하여 Defect 크기와위치를찾아내는루프로직을 parallel_for 알고리즘으로변경하고, 직렬실행과병렬실행결과를 CPU 점유율과속도향상율로비교해본다. 실습순서 1. 직렬버전설명 2. 병렬버전작성 1 태스크정의 = Body 클래스작성 2 parallel_for 구문작성 3. 실험수행 실습 TBB 를이용한병렬프로그래밍실무 Slide No. 46
TBB in Action Vision Image Analysis 결과 for 루프를병렬알고리즘으로변경한것만으로도상당한성능개선효과가있었다. 발전사항 중첩된 parallel_for 구조로한층더병렬화 이미지획득과동시에처리하기위해동시적컨테이너 (concurrent_vector) 를사용 CPU 사용율 50% 처리속도 3124 ms x2 x1.7 CPU 사용율 100% 처리속도 1850 ms TBB 를이용한병렬프로그래밍실무 Slide No. 47
Reference 도서 TBB 를이용한병렬프로그래밍실무 Slide No. 48
Reference 문서 1. www.intel.com 또는 www.threadingbuildingblocks.org 에서다운로드 2. 월간마소 2009 년 2 월호 프로세서아키텍처의변화로본병렬프로그래밍 / 김민장 TBB 를이용한병렬프로그래밍실무 Slide No. 49
Reference 웹사이트 2. www.threadingbuildingblocks.org TBB 를이용한병렬프로그래밍실무 Slide No. 50
Reference 웹사이트 3. http://hermet.pe.kr (TBB 도서테크니컬리뷰어블로그 ) TBB 를이용한병렬프로그래밍실무 Slide No. 51
Reference 웹사이트 4. http://rein.kr/blog TBB 를이용한병렬프로그래밍실무 Slide No. 52
Summary 1. 기존병렬처리기술은스레드 (Thread) 를직접다루는방식이었다. 스레드추상화기술로발전했다 ( 예 : OpenMP, PPL). 2. 스레딩빌딩블록 (TBB) 은인텔이출시한최신스레드추상화기술이다. 3. TBB는 태스크 를사용하는데, 함수객체와스레드추상화의이해가선행되어야한다. 4. TBB는 STL과같이형식제약이최소화된템플릿라이브러리형태를취한다. 5. TBB 를이용한병렬프로그래밍실무의목적은동시성 (Concurrency) 과성능및조정성이다. 6. 조정성 (scalability) 은 스케일러빌리티 로도읽으며, 코어개수가변할때그에비례하여성능도조정된다는의미의용어이며 조정성 으로번역된다. 7. 코딩스타일의생소함을넘어서실무에자신있게도입하시기바랍니다! TBB 를이용한병렬프로그래밍실무 Slide No. 53
Thank You! TBB 를이용한병렬프로그래밍실무 Slide No. 54