C++ AMP(Accelerated Massive Parallelism) 2013-03-29 고형호 hyungho.ko@gmail.com http://hhko.tistory.com
목차 Part 1. 다중프로세서 Part 2. 연산자원 Part 3. GPU 특징 Part 4. 병렬화프로그래밍기술 Part 5. AMP Portability( 이식성 ) Part 6. AMP Productivity( 생산성 ) Part 7. AMP Performance( 성능 ) Part 8. 정리 2
Part 1. 다중프로세서 3
직렬 vs. 병행성 vs. 병렬성 스레드 1 스레드 1 스레드 2 스레드 1 스레드 1 A-1 A-1 A-1 B-1 A-2 A-2 A-2 B-2 시간 A-3 B-1 스케줄링 깨어남 B-1 A-3 B-3 B-2 대기 B-2 프로세서 1 프로세서 2 B-3 B-3 프로세서 1 깨어남 A-3 스케줄링 프로세서 1 직렬 (Serial) 병행성 (Concurrency) 병렬성 (Parallelism) 단일프로세서 단일프로세서 다중프로세서 4
프로세서발전사 다중프로세서 단일프로세서 5
Part 2. 연산자원 6
CPU CPU(multi-core, 다중프로세서 ) 자원활용하기 while(true) { } 직렬 Vs. 병렬 parallel_for( { }); 이제 CPU 자원활용은필수다. 7
GPU 연산능력을갖고있는자원은 CPU 뿐인가? GPU(Graphics Processing Unit) 그래픽카드에장착된그래픽연산장치 CPU GPU 8
AMD ATI Radeon HD 5870 SIMD 은 GPU 연산의핵심이다. 9
병렬하드웨어아키텍처분류 Instruction Multiple MISD (Multiple Instruction, Single Data) MIMD (Multiple Instruction, Multiple Data) Single SISD (Single Instruction, Single Data) SIMD (Single Instruction, Multiple Data) Single Multiple Data 10
SISD vs. SIMD 배열 A 배열 B a0 a1 a2 a3 a4 a5 b0 b1 b2 b3 b4 b5 배열 A 와 B 를더하여라! 단일명령으로단일데이터처리 단일명령으로다중데이터처리 사이클 1 a0 + b0 사이클 1 a0 + b0 a1 + b1 a2 + b2 사이클 2 a1 + b1 사이클 2 a3 + b3 a4 + b4 a5 + b5 사이클 3 a2 + b2 사이클 4 a3 + b3 사이클 5 a4 + b4 사이클 6 a5 + b5 SISD (Single Instruction stream, Single Data stream) SIMD (Single Instruction stream, Multiple Data stream) 11
연도 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 CPU 펜티엄 P55C 펜티엄 3 카트마이펜티엄 4 윌라멧펜티엄 4 프레스캇코어2 메롬코어2 펜린코어 i7 네할렘웨스트미어샌디브릿지 SIMD 발전사 CPU 확장명령어셋 벡터처리능력 ( 벡터레지스터수 ) MMX Multi Media extensions 64 비트 SSE Streaming SIMD Extensions 128 비트 SSE 2 SSE 3 SSE 4 AVX Advanced Vector Extensions 256 비트 12
SIMD 예제 for (unsigned int i = 0; i < MAX_SIZE2; i++) { view_c[i] = view_a[i] + view_b[i]; } view_c[i] = view_a[i] + view_b[i]; 00AC121B mov 00AC1220 movdqu 00AC1225 movdqu 00AC1229 lea 00AC122C paddd eax,2625a0h xmm1,xmmword ptr [ecx+edx] xmm0,xmmword ptr [edx] edx,[edx+10h] xmm1,xmm0 이제 SIMD 연산은일반화되고있다. 13
Part 3. GPU 특징 14
CPU Vs. GPU CPU CPU 그래픽카드 GPU 메인보드 Vs. 메인보드 메모리 (DRAM) 입력데이터 출력데이터 메모리 (DRAM) 메모리 (DRAM) 입력데이터 출력데이터 입력데이터 출력데이터 CPU 처리과정 GPU 처리과정 15
GPU 제약사항 1. Recursion 8. goto or labeled statements 2. 'volatile 9. throw, try, catch 3. virtual functions 10. globals or statics 4. pointers to functions 11. dynamic_cast or typeid 5. pointers to member functions 12. asm declarations 6. pointers in structs 13. Varargs 7. pointers to pointers 14. unsupported types e.g. bool, char, short, long double 16
Part 4. 병렬화프로그래밍기술 17
병렬화프로그래밍기술의발전사 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 Chare Kernel Threaded C JSR 166 STAPL ECMA CLI McRT Cilk (MIT) OpenMP 1.0 2.0 C/C++ 버전 Intel Parallell Building Blocks 2.5 TBB 1.0 NVIDIA 2.0 Intel Ct CUDA 1.0 3.0 RapidMind Cilk++ OpenCL 1.0 Microsoft 3.0 ArBB beta Cilk Plus PPL 3.1 4.0 beta end 1.2 4.0 RC1 4.1 Build 2546 5.0 AMP 18
병렬화프로그래밍기술 vs. 병렬성 기술 / 병렬성 벡터처리 루프병렬성 태스크병렬성 자원 OpenMP O O CPU TBB O O CPU ArBB O O CPU Cilk Plus O O O CPU PPL O O CPU CUDA O O GPU OpenCL O O GPU AMP O O GPU 19
Part 5. AMP Portability( 이식성 ) 20
Programming Models & Languages 21
Programming Models & Languages 22
Programming Models & Languages 23
Programming Models & Languages 24
restrict 예약어 double sin(double); double cos(double) restrict(amp); double tan(double) restrict(cpu, amp); // CPU // GPU // CPU, GPU parallel_for_each(av.extent, [=](index<1> idx) restrict(amp) { // sin(data.analge); // non amp restricted function }); cos(data.angle); tan(data.angle); 25
Part 6. AMP Productivity( 생산성 ) 26
Productivity Part of C++ STL-like library for multidimensional data Minimal API Visual Studio integration 27
C++ to AMP #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pa, int * pb, int * pc) { void AddArrays(int n, int * pa, int * pb, int * pc) { array_view<int,1> a(n, pa); array_view<int,1> b(n, pb); array_view<int,1> sum(n, pc); 메모리 } for (int i=0; i<n; i++) { pc[i] = pa[i] + pb[i]; } } parallel_for_each( sum.grid, 병렬처리 [=](index<1> idx) restrict(amp) { sum[idx] = a[idx] + b[idx]; } ); 프로세서 28
AMP Vs. CUDA #include <amp.h> using namespace concurrency; void AddArrays(int n, int * pa, int * pb, int * pc) { array_view<int,1> a(n, pa); array_view<int,1> b(n, pb); array_view<int,1> sum(n, pc); 메모리 #include <cutil_inline.h> cudamemcpy(dev_a, InputA, size*sizeof(int), cudamemcpyhosttodevice); cudamemcpy(dev_b, InputB, size*sizeof(int), cudamemcpyhosttodevice); VectorAdd<<<65535,512>>>(dev_A, dev_b, dev_r); parallel_for_each( sum.grid, 병렬처리 cudamemcpy(result, dev_r, size*sizeof(int), cudamemcpydevicetohost); [=](index<1> idx) restrict(amp) { global void VectorAdd( int*a, int*b, int*c) } sum[idx] = a[idx] + b[idx]; 연산 { int tid = blockidx.x * blockdim.x+ threadidx.x; ); c[tid] = a[tid] + b[tid]; } } 29
Part 7. AMP Performance( 성능 ) 30
Morph 서로다른이미지를자연스럽게변화하는과정이나기법 직렬 CPU 병렬 GPU 병렬 31
Part 8. 정리 32
정리 연산자원 CPU(multi-core) C++ Cilk Plus, TBB, PPL, C# TPL, PLinq GPU(SIMD) C++ AMP, CUDA, 이제 CPU 및 GPU 자원활용은필수다. 33
AMP Vs. CUDA 1. 이식성 (Portability) AMP CUDA AMP 는 성능이요구되는범용클라이언트프로그램에적합 2. 생산성 (Productivity) 또는 AMP CUDA 생산성과유지보수가요구되는서버 / 클라이언트프로그램에적합 3. 성능 (Performance) AMP CUDA CUDA 는 성능이요구되는특화된서버 / 클라이언트프로그램에적합 34
참고자료 1. 프로그래머가몰랐던멀티코어 CPU 이야기, 김민장 2. Heterogeneous Computing and C++ AMP http://channel9.msdn.com/events/amd-fusion-developer-summit/amd- Fusion-Developer-Summit-11/KEYNOTE 3. Welcome to the Jungle http://herbsutter.com/welcome-to-the-jungle/ 35