이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

49
이기종 멀티코어 환경을 위한 프로그래밍 언어 및 영상처리 오픈소스 송승화

Upload: seunghwa-song

Post on 06-Jul-2015

612 views

Category:

Software


4 download

DESCRIPTION

오늘날 멀티코어 프로세서 세상은 이기종 컴퓨팅 환경이 대부분이라 해도 과언이 아니다. 병렬 컴퓨팅은 비약적인 속도 향상과 전력 소비 감소라는 장점이 있지만 사용하기가 까다롭고 특히 다양한 아키텍처로 이루어진 이기종 컴퓨팅 환경에서는 소프트웨어 개발이 더욱 어려워진다. 이 프리젠테이션에서는 이기종 컴퓨팅 환경에서의 병렬 처리를 위한 프로그래밍 언어를 소개하고 OpenCV와 같은 영상처리 라이브러리에서의 활용 예시를 보여준다

TRANSCRIPT

Page 1: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

이기종멀티코어환경을위한프로그래밍언어및영상처리오픈소스

송승화

Page 2: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

이기종멀티코어플랫폼과병렬화

병렬프로그래밍

그리고오픈소스응용들

Page 3: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

멀티코어의필요성 (= 병렬화의필요성)

성능? 전력소모? 소모전력당성능이중요해짐

Page 4: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

코어는한번에하나의명령(instruction)을처리하는하드웨어연산장치

프로세서는코어와캐쉬메모리,

컨트롤러등을구성하여하나의Die에구현한것

시스템은프로세서, 메모리, I/O

버스등으로구성한하나의복합체

시스템안의프로세서안의코어

Page 5: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

병렬컴퓨팅을위한프로세서(수십개의코어)

= 주로데이터병렬화 (예 : GPU)

직렬컴퓨팅을위한프로세서(몇개의코어)

= 주로태스크병렬화 (예 : 쿼드코어 CPU)

멀티코어프로세서의분류

Page 6: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

멀티코어프로세서의분류

SMP(Symmetric Multi Processor)

- Homogeneous Computing

AMP(Asymmetric Multi Processor)

- Heterogeneous Computing

Page 7: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

멀티코어프로세서발전과정

1die

1core

1die

1corex N 1die

N core

1die

SMP +

ASMP

Page 8: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

멀티코어프로세서설계트렌드변화

과거에는목적에따라SMP 또는 ASMP를설계

SMP와 ASMP의장점을모두접목시킨설계로발전

다양한산업의요구사항을만족하기위하여

Page 9: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

하나의다이에All in One

Page 10: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

같은종류의코어들로구성(일반적으로 CPU들을하나의프로세서에구현)

다른종류의코어들로구성(CPUs, GPUs, DSPs 하드웨어가속기등을하나의프로세서에구현)

각각의코어에서동일하게동작 각각의코어에서동작의균일성을보장못함

각각의코어들은범용목적으로설계됨 각각의코어들은보통특정목적에최적화됨

태스크를분산시키기좋음(Task off loading) 태스크분산이복잡함

소프트웨어호환성이좋음 소프트웨어호환성이나쁨

Page 11: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

이러한복잡한환경에서어떻게병렬화를쉽게할까?

Page 12: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

먼저병렬컴퓨팅을위한프로그래밍언어에대해알아보자

Page 13: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Stanford 대학에서 Ian Buck 박사가제안

ANSI C를확장한데이터병렬화를위한초창기언어

Streaming programming 모델개념도입

현재병렬프로그래밍분야의

핵심 Guru 들이 Brook Language에관여하였고

오늘날기술들이 Brook의영향을받음

Brook Language (Stream computing on graphics H/W)

Page 14: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Streams :

- 비슷한연산이요구되는데이터의집합

- 데이터의병렬처리

- 배열과비슷하지만 index 연산이불가능

Ray r<200>;

float3 velocityfield<100,100,100>;

r[3] = 3; // ERROR!!

예를들면이런연산들

Page 15: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Kernel:

Stream을연산하기위한함수

커널함수의인자는 input/output stream 이다.Linux Kernel이아님

Page 16: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Arithmetic intensity(산술집중도) 때문Arithmetic intensity는 ( GPU로)전송된데이터당수행된명령어의수에의해결정됨

만약이하나의 data element만수정한다면메모리접근이끝날때까지다른 element들은기다려야한다

따라서 Streamming programming 에서는 stream 내의특정 element에대한접근은불허

이상적인 GPGPU 연산은최대한많은데이터를최대한병렬화로처리를하고데이터 element간의의존도를최소화해야한다.

왜 Array 접근, 연산을허용하지않는가?

Page 17: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

GPGPU를위해 Nvidia에서개발한기술가장성공적인상업용기술중하나

nVidia는 Brook을제안한 Ian Buck을고용하여 CUDA 프로젝트를진행

CUDA에는 Stream, kernel 과같은개념이그대로적용되어있다

CUDA는 nVidia 사의 GPGPU만을위한기술이지만병렬프로그래밍을성공적으로상업화하였다는데에그의미가있다그외에도 MS의 C++ AMP나 OpenACC 등과같은기술들도존재한다

CUDA

취업의신

Page 18: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

지금까지는 GPU를위한병렬컴퓨팅기술의발전...

그렇다면이기종멀티코어환경에서는?

Page 19: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL

Apple의 SW 아키텍트 Munshi Aaftab에의해제안이기종플랫폼에서이식성과확장성을높이기위해제안된개방형범용병렬컴퓨팅프레임워크(CPU, GPU, DSP 등의프로세서로이루어진이종플랫폼에서실행되는프로그램작성을위함)

OpenCL 표준명세는 Khronos 에서관리

현재 2.0까지공개되어있으며많은 SDK들은 OpenCL 1.2를지원한다.

https://www.khronos.org/opencl/

얼굴공개안함

Munshi Aaftab역시 CUDA와 Brook의영향을받았고OpenCL와 CUDA의 문법이크게다르지않다.

OpenCL-CUDA 간의코드이식연구들도진행된바있다

Page 20: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

이프리젠테이션에서는 OpenCL 에대한자세한명세를모두다룰수없기때문에중요한특징만짚고넘어가도록할예정이다.

Page 21: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

호스트

디바이스

디바이스

디바이스

계산유닛계산유닛

계산유닛계산유닛

계산유닛(Compute Unit)

Processing

Element

OpenCL 플랫폼모델

Legacy program이

여기서수행된다.

int main(){

...

}

OpenCL C program이

여기서수행된다

__kernel__ void func(){

...

}

단하나의호스트와한개이상의디바이스로구성

Page 22: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

호스트는 Master 프로세서이며 Legacy 프로그램이동작하는환경

즉, 입출력이나프로그램사용자등 OpenCL 프로그램외부의환경과상호작용

디바이스는 Slave 프로세서이며 OpenCL 계산유닛, 즉커널을수행

실질적인병렬연산이디바이스에서수행되며실제적인계산은 PE(Processing

Element) 안에서이루어진다.

디바이스는 CPU, GPU, DSP 또는하드웨어가속기등이될수도있다

OpenCL 플랫폼모델

Page 23: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL 플랫폼모델

Master 프로세서가다른 Slave 프로세서들을관리하는구조는태스크를 Offloading 하고처리결과를취합및동기화

Page 24: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL C 프로그래밍

문맥작성

커널작성

OpenCL 프레임워크에서프로그래밍은크게두단계로나뉜다

Page 25: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

커널은연산을위한핵심로직!!

이핵심로직은이기종플랫폼간의높은이식성을위해

OpenCL C 언어로구현되며 OpenCL C 컴파일러로컴파일

된다

OpenCL C는상당부분을 ANSI C 표준을기준으로설계되

었지만병렬처리를위해추가(내장함수들)되거나제약(I/O,

stdlib 등) 되는기능과문법들이많다.

Page 26: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

호스트프로그램은 OpenCL안에서정의된커널객체들이어떻게상호연동해야하는지를규정

이정책과연산순서를문맥이라고한다

문맥에포함된것은한개이상의프로그램객체이고이객체는커널을위한코드를갖고있다

Page 27: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL 예제

OpenCL 창시자이자 OpenCL programming

guide 저자인 Aafftab Munshin는블로그관리가귀찮았는지폐쇄하고예제코드를구글코드저장소에올려버렸으니참고하길바란다https://code.google.com/p/opencl-book-samples/

Page 28: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Hello OpenCL

HelloWorld.cpp 에는우리가잘아는 c++ 언어로구현되어문맥이작성되어있다.

HelloWorld.cl 은 C 언어문법이지만조금은생소한지시자가보인다.

__kernel 지시자는커널함수를의미한다

Page 29: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

HelloWorld.cl

__kernel void hello_kernel(__global const float *a, __global const float *b, __global float *result)

{

int gid = get_global_id(0); //OpenCL에서 element에접근하기위한기준인 1차원 global ID를받아오기위함

result[gid] = a[gid] + b[gid]; // 병렬연산. Streaming programming 이다

}

+

=

a

b

result

Page 30: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

(The world’s most complex) HelloWorld.cpp

int main(int argc, char** argv)

{

cl_context context = 0;

cl_command_queue commandQueue = 0;

cl_program program = 0;

cl_device_id device = 0;

cl_kernel kernel = 0;

cl_mem memObjects[3] = { 0, 0, 0 };

cl_int errNum;

// 문맥객체생성context = CreateContext();

// 명령큐객체생성commandQueue = clCreateCommandQueue(context, devices[0], 0, NULL);

// OpenCL 프로그램객체생성program = clCreateProgramWithSource(context, 1, (const char**)&srcStr, NULL,

NULL);

// OpenCL 커널객체생성kernel = clCreateKernel(program, "hello_kernel", NULL);

// 명령큐에커널전달및연산수

행errNum = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL,

globalWorkSize, localWorkSize,

0, NULL, NULL);

// 버퍼로부터결과값읽어옴errNum = clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE, 0,

ARRAY_SIZE * sizeof(float), result, 0, NULL, NULL);

// 결과출력for (int i = 0; i < ARRAY_SIZE; i++)

{

std::cout << result[i] << " ";

}

std::cout << std::endl;

std::cout << "Executed program succesfully." << std::endl;

Cleanup(context, commandQueue, program, kernel, memObjects);

return 0;

}

// 메모리객체생성float result[ARRAY_SIZE];

float a[ARRAY_SIZE];

float b[ARRAY_SIZE];

for (int i = 0; i < ARRAY_SIZE; i++)

{ a[i] = (float)i; b[i] = (float)(i * 2); }

memObjects[0] = clCreateBuffer(context, CL_MEM_READ_ONLY |

CL_MEM_COPY_HOST_PTR, sizeof(float) * ARRAY_SIZE, a, NULL);

memObjects[1] = clCreateBuffer(context, CL_MEM_READ_ONLY |

CL_MEM_COPY_HOST_PTR, sizeof(float) * ARRAY_SIZE, b, NULL);

memObjects[2] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float) *

ARRAY_SIZE, NULL, NULL);

...

// 커널인자에메모리객체포인

터전달errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memObjects[0]);

errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &memObjects[1]);

errNum |= clSetKernelArg(kernel, 2, sizeof(cl_mem), &memObjects[2]);

size_t globalWorkSize[1] = { ARRAY_SIZE };

size_t localWorkSize[1] = { 1 };

Page 31: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

명령큐

// 문맥객체생성

// 명령큐객체생성

// OpenCL 프로그램객체생성

// OpenCL 커널객체생성

// 메모리객체생성

// 커널인자에메모리객체포인터

전달

// 명령큐에커널전달및연산수행

// 명령큐로부터결과값읽어옴

// 결과출력 호스트

디바이스

커널객체

커널객체

메모리객체

메모리객체

메모리객체

커널객체

메모리객체

HelloWorld.cpp

커널연산수행

결과값복사

프로그램객체

HelloWorld.clgray_scale.cl

프로그램객체

직접접근불가!

이개념을문맥이라한다

Page 32: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

플랫폼 1

플랫폼, 디바이스그리고문맥

플랫폼1 플랫폼1

CPUGP

U

GP

U

문맥 문맥

OpenCL에서문맥은연관된디바이스들과메모리객체, 명령큐를위한컨테이너를제공한다특정디바이스, 또는디바이스들사이의통신을수행하는것이바로문맥(Context) 이다OpenCL은문맥의관점에서메모리모델을정의하며같은문맥안에있는모든디바이스들은메모리에있는내용의갱신을볼수있도록보장한다

- OpenCL Programming guide 중에서 -

Page 33: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

프로그램객체란?프로그램객체는커널에서사용하는함수들을정의하는동적라

이브러리고생각하는것이좋다.

왜냐하면프로그램객체는호스트프로그램안에서 런타임에빌드되기때문이다

프로그래머는 OpenCL 응용을작성하고최종사용자에게전해주는데, 최종사용자

는그 OpenCL 응용을어디서든실행가능하다

응용프로그래머는엔드유저가어떤 GPU나 CPU 에서혹은다른칩위에서응용

을실행할지알수없다!

프로그래머가알수있는것은그냥타겟플랫폼이 OpenCL명세를따른다는것뿐

이다.

HelloWorld.cl

디바이스A 디바이스B

프로그램객체A 프로그램객체A

런타임에빌드

커널객체

커널객체

커널객체

커널객체커널

객체

Page 34: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

Hello OpenCL

역대 Hello world 예제를많이보았지만 OpenCL 예제가가장길고복잡한것으로보임

디바이스자원을활용하기위해호스트와디바이스간데이터공유절차가복잡한이유는1) 다양한디바이스를지원하기위한추상화와2) 병렬화를위한제약사항때문

Page 35: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL을지원하는플랫폼및프로젝트들

개방형. 플랫폼독립적. 이러한 OpenCL의장점은이기종멀티코어프로세서세상에서그진가를발휘하고있다

특히멀티미디어데이터처리가중요한분야에서

Page 36: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCL SDK를지원하는 Chip vendor들

상당수의 major chip vendor들역시 OpenCL을지원하기위한 SDK를발표

Page 37: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCV 와병렬처리

OpenCV는가장대표적이고유명한컴퓨터비전, 이미지처리, 머신러닝을위한오픈소스라이브러리

다양한플랫폼을지원하기때문에이식성이뛰어남

주로 2차원의영상데이터를다루기때문에데이터병렬화의이득을가장많이받는라이브러리중하나

Page 38: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCV on CUDA

Page 39: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
Page 40: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

CUDA Operations

Page 41: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

CUDA Operations

Page 42: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

CUDA Operations

Page 43: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCV on OpenCL

OpenCV는이미 CUDA 뿐만아니라 OpenCL을위한3rd party 라이브러리를지원하고있다

현재 2.4.9까지 release 되어있으며 3.0은 alpha 버전이개발및테스트중에있다3.0에서가장두드러진특징은 OpenCL에대한상당한개선들이이루어질것으로보인다

Page 44: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCV OCL module

OCL 이라고불리는 OpenCL wrapping 모듈을통해알고리즘을조합

opencv / modules / ocl / src /

- opencl을응용한알고리즘코드.

- 커널연산을위한문맥들을정의하고있으며 c++ 함수로 wrapping 하였다

opencv / modules / ocl / src / opencl

- opencl kernel 코드들

Page 45: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

산술연산

arithm_add, arithm_log, arithm_minMax, arithm_pow 등등...

색공간변환

convertC3C4, cvt_color 등등..

이미지처리

imgproc_bilateral, imgproc_calcHarris, imgproc_canny, imgproc_convolve

imgproc_gftt, imgproc_histogram, imgproc_median, imgproc_resize imgproc_sobel3,

imgproc_threshold, imgproc_warpAffine 등등..

객체검출haarobjectdetect, haarobjectdetect_scaled2, objdetect_hog 등등..

kernel 함수로구현된알고리즘들수십개의영상처리알고리즘이커널로구현되어있다

Page 46: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

OpenCV-CL 알고리즘구현예시

kernel

func

opencl wrapping 함수호출

kernel

func

kernel

func

kernel

func

hog()

알고리즘완성에필요한각각의단계별알고리즘을 kernel

로구현

단계별알고리즘을 wrapping한함수들을차례로호출

Page 47: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

끝마치며소모전력당성능요구사항은병렬처리와이기종멀티코어프로세서의발전을가져옴

복잡한플랫폼에서 task off loading과재사용성을모두만족해야하는소프트웨어의개발언어가필요해짐

Brook, CUDA와같은기존의병렬처리를위한기술들의아이디어에영향을받아개방형범용병렬컴퓨팅프레임워크가등장

영상처리, 컴퓨터비전등멀티미디어데이터처리를위한오픈소스라이브러리들이 OpenCL을지원하기시작

Page 48: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

ReferencesKhronos Association https://www.khronos.org/

Brook Language

https://graphics.stanford.edu/projects/brookgpu/lang.html

Ian Buck 블로그 http://graphics.stanford.edu/~ianbuck/

논문과발표자료 http://graphics.stanford.edu/papers/brookgpu/

From Brook to CUDA by Ian Buck

http://www.nvidia.com/content/GTC/documents/1001_GTC09.pdf

OpenCL Programming Guide Paperback – July 23, 2011

by Aaftab Munshi, Benedict Gaster , Timothy G. Mattson, James

Fung, & 1 more (번역서 : OpenCL 프로그래밍가이드. 이영민역)

예제코드 repository https://code.google.com/p/opencl-book-

samples/

OpenCV on CUDA

http://on-

demand.gputechconf.com/gtc/2013/webinar/open

cv.mp4

http://on-

demand.gputechconf.com/gtc/2013/webinar/open

cv-gtc-express-shalini-gupta.pdf\

OpenCV www.opencv.org

OpenCV code repository

www.github.com/Itseez/opencv

Page 49: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스

감사합니다

이발표자료는온라인에공개합니다http://sshlab.blogspot.com

http://http://www.slideshare.net/sshtel