이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
-
Upload
seunghwa-song -
Category
Software
-
view
612 -
download
4
description
Transcript of 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
![Page 1: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/1.jpg)
이기종멀티코어환경을위한프로그래밍언어및영상처리오픈소스
송승화
![Page 2: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/2.jpg)
이기종멀티코어플랫폼과병렬화
병렬프로그래밍
그리고오픈소스응용들
![Page 3: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/3.jpg)
멀티코어의필요성 (= 병렬화의필요성)
성능? 전력소모? 소모전력당성능이중요해짐
![Page 4: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/4.jpg)
코어는한번에하나의명령(instruction)을처리하는하드웨어연산장치
프로세서는코어와캐쉬메모리,
컨트롤러등을구성하여하나의Die에구현한것
시스템은프로세서, 메모리, I/O
버스등으로구성한하나의복합체
시스템안의프로세서안의코어
![Page 5: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/5.jpg)
병렬컴퓨팅을위한프로세서(수십개의코어)
= 주로데이터병렬화 (예 : GPU)
직렬컴퓨팅을위한프로세서(몇개의코어)
= 주로태스크병렬화 (예 : 쿼드코어 CPU)
멀티코어프로세서의분류
![Page 6: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/6.jpg)
멀티코어프로세서의분류
SMP(Symmetric Multi Processor)
- Homogeneous Computing
AMP(Asymmetric Multi Processor)
- Heterogeneous Computing
![Page 7: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/7.jpg)
멀티코어프로세서발전과정
1die
1core
1die
1corex N 1die
N core
1die
SMP +
ASMP
![Page 8: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/8.jpg)
멀티코어프로세서설계트렌드변화
과거에는목적에따라SMP 또는 ASMP를설계
SMP와 ASMP의장점을모두접목시킨설계로발전
다양한산업의요구사항을만족하기위하여
![Page 9: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/9.jpg)
하나의다이에All in One
![Page 10: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/10.jpg)
같은종류의코어들로구성(일반적으로 CPU들을하나의프로세서에구현)
다른종류의코어들로구성(CPUs, GPUs, DSPs 하드웨어가속기등을하나의프로세서에구현)
각각의코어에서동일하게동작 각각의코어에서동작의균일성을보장못함
각각의코어들은범용목적으로설계됨 각각의코어들은보통특정목적에최적화됨
태스크를분산시키기좋음(Task off loading) 태스크분산이복잡함
소프트웨어호환성이좋음 소프트웨어호환성이나쁨
![Page 11: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/11.jpg)
이러한복잡한환경에서어떻게병렬화를쉽게할까?
![Page 12: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/12.jpg)
먼저병렬컴퓨팅을위한프로그래밍언어에대해알아보자
![Page 13: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/13.jpg)
Stanford 대학에서 Ian Buck 박사가제안
ANSI C를확장한데이터병렬화를위한초창기언어
Streaming programming 모델개념도입
현재병렬프로그래밍분야의
핵심 Guru 들이 Brook Language에관여하였고
오늘날기술들이 Brook의영향을받음
Brook Language (Stream computing on graphics H/W)
![Page 14: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/14.jpg)
Streams :
- 비슷한연산이요구되는데이터의집합
- 데이터의병렬처리
- 배열과비슷하지만 index 연산이불가능
Ray r<200>;
float3 velocityfield<100,100,100>;
r[3] = 3; // ERROR!!
예를들면이런연산들
![Page 15: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/15.jpg)
Kernel:
Stream을연산하기위한함수
커널함수의인자는 input/output stream 이다.Linux Kernel이아님
![Page 16: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/16.jpg)
Arithmetic intensity(산술집중도) 때문Arithmetic intensity는 ( GPU로)전송된데이터당수행된명령어의수에의해결정됨
만약이하나의 data element만수정한다면메모리접근이끝날때까지다른 element들은기다려야한다
따라서 Streamming programming 에서는 stream 내의특정 element에대한접근은불허
이상적인 GPGPU 연산은최대한많은데이터를최대한병렬화로처리를하고데이터 element간의의존도를최소화해야한다.
왜 Array 접근, 연산을허용하지않는가?
![Page 17: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/17.jpg)
GPGPU를위해 Nvidia에서개발한기술가장성공적인상업용기술중하나
nVidia는 Brook을제안한 Ian Buck을고용하여 CUDA 프로젝트를진행
CUDA에는 Stream, kernel 과같은개념이그대로적용되어있다
CUDA는 nVidia 사의 GPGPU만을위한기술이지만병렬프로그래밍을성공적으로상업화하였다는데에그의미가있다그외에도 MS의 C++ AMP나 OpenACC 등과같은기술들도존재한다
CUDA
취업의신
![Page 18: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/18.jpg)
지금까지는 GPU를위한병렬컴퓨팅기술의발전...
그렇다면이기종멀티코어환경에서는?
![Page 19: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/19.jpg)
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: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/20.jpg)
이프리젠테이션에서는 OpenCL 에대한자세한명세를모두다룰수없기때문에중요한특징만짚고넘어가도록할예정이다.
![Page 21: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/21.jpg)
호스트
디바이스
디바이스
디바이스
계산유닛계산유닛
계산유닛계산유닛
계산유닛(Compute Unit)
Processing
Element
OpenCL 플랫폼모델
Legacy program이
여기서수행된다.
int main(){
...
}
OpenCL C program이
여기서수행된다
__kernel__ void func(){
...
}
단하나의호스트와한개이상의디바이스로구성
![Page 22: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/22.jpg)
호스트는 Master 프로세서이며 Legacy 프로그램이동작하는환경
즉, 입출력이나프로그램사용자등 OpenCL 프로그램외부의환경과상호작용
디바이스는 Slave 프로세서이며 OpenCL 계산유닛, 즉커널을수행
실질적인병렬연산이디바이스에서수행되며실제적인계산은 PE(Processing
Element) 안에서이루어진다.
디바이스는 CPU, GPU, DSP 또는하드웨어가속기등이될수도있다
OpenCL 플랫폼모델
![Page 23: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/23.jpg)
OpenCL 플랫폼모델
Master 프로세서가다른 Slave 프로세서들을관리하는구조는태스크를 Offloading 하고처리결과를취합및동기화
![Page 24: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/24.jpg)
OpenCL C 프로그래밍
문맥작성
커널작성
OpenCL 프레임워크에서프로그래밍은크게두단계로나뉜다
![Page 25: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/25.jpg)
커널은연산을위한핵심로직!!
이핵심로직은이기종플랫폼간의높은이식성을위해
OpenCL C 언어로구현되며 OpenCL C 컴파일러로컴파일
된다
OpenCL C는상당부분을 ANSI C 표준을기준으로설계되
었지만병렬처리를위해추가(내장함수들)되거나제약(I/O,
stdlib 등) 되는기능과문법들이많다.
![Page 26: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/26.jpg)
호스트프로그램은 OpenCL안에서정의된커널객체들이어떻게상호연동해야하는지를규정
이정책과연산순서를문맥이라고한다
문맥에포함된것은한개이상의프로그램객체이고이객체는커널을위한코드를갖고있다
![Page 27: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/27.jpg)
OpenCL 예제
OpenCL 창시자이자 OpenCL programming
guide 저자인 Aafftab Munshin는블로그관리가귀찮았는지폐쇄하고예제코드를구글코드저장소에올려버렸으니참고하길바란다https://code.google.com/p/opencl-book-samples/
![Page 28: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/28.jpg)
Hello OpenCL
HelloWorld.cpp 에는우리가잘아는 c++ 언어로구현되어문맥이작성되어있다.
HelloWorld.cl 은 C 언어문법이지만조금은생소한지시자가보인다.
__kernel 지시자는커널함수를의미한다
![Page 29: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/29.jpg)
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: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/30.jpg)
(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: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/31.jpg)
명령큐
// 문맥객체생성
// 명령큐객체생성
// OpenCL 프로그램객체생성
// OpenCL 커널객체생성
// 메모리객체생성
// 커널인자에메모리객체포인터
전달
// 명령큐에커널전달및연산수행
// 명령큐로부터결과값읽어옴
// 결과출력 호스트
디바이스
커널객체
커널객체
메모리객체
메모리객체
메모리객체
커널객체
메모리객체
HelloWorld.cpp
커널연산수행
결과값복사
프로그램객체
HelloWorld.clgray_scale.cl
프로그램객체
직접접근불가!
이개념을문맥이라한다
![Page 32: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/32.jpg)
플랫폼 1
플랫폼, 디바이스그리고문맥
플랫폼1 플랫폼1
CPUGP
U
GP
U
문맥 문맥
OpenCL에서문맥은연관된디바이스들과메모리객체, 명령큐를위한컨테이너를제공한다특정디바이스, 또는디바이스들사이의통신을수행하는것이바로문맥(Context) 이다OpenCL은문맥의관점에서메모리모델을정의하며같은문맥안에있는모든디바이스들은메모리에있는내용의갱신을볼수있도록보장한다
- OpenCL Programming guide 중에서 -
![Page 33: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/33.jpg)
프로그램객체란?프로그램객체는커널에서사용하는함수들을정의하는동적라
이브러리고생각하는것이좋다.
왜냐하면프로그램객체는호스트프로그램안에서 런타임에빌드되기때문이다
프로그래머는 OpenCL 응용을작성하고최종사용자에게전해주는데, 최종사용자
는그 OpenCL 응용을어디서든실행가능하다
응용프로그래머는엔드유저가어떤 GPU나 CPU 에서혹은다른칩위에서응용
을실행할지알수없다!
프로그래머가알수있는것은그냥타겟플랫폼이 OpenCL명세를따른다는것뿐
이다.
HelloWorld.cl
디바이스A 디바이스B
프로그램객체A 프로그램객체A
런타임에빌드
커널객체
커널객체
커널객체
커널객체커널
객체
![Page 34: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/34.jpg)
Hello OpenCL
역대 Hello world 예제를많이보았지만 OpenCL 예제가가장길고복잡한것으로보임
디바이스자원을활용하기위해호스트와디바이스간데이터공유절차가복잡한이유는1) 다양한디바이스를지원하기위한추상화와2) 병렬화를위한제약사항때문
![Page 35: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/35.jpg)
OpenCL을지원하는플랫폼및프로젝트들
개방형. 플랫폼독립적. 이러한 OpenCL의장점은이기종멀티코어프로세서세상에서그진가를발휘하고있다
특히멀티미디어데이터처리가중요한분야에서
![Page 36: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/36.jpg)
OpenCL SDK를지원하는 Chip vendor들
상당수의 major chip vendor들역시 OpenCL을지원하기위한 SDK를발표
![Page 37: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/37.jpg)
OpenCV 와병렬처리
OpenCV는가장대표적이고유명한컴퓨터비전, 이미지처리, 머신러닝을위한오픈소스라이브러리
다양한플랫폼을지원하기때문에이식성이뛰어남
주로 2차원의영상데이터를다루기때문에데이터병렬화의이득을가장많이받는라이브러리중하나
![Page 38: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/38.jpg)
OpenCV on CUDA
![Page 39: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/39.jpg)
![Page 40: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/40.jpg)
CUDA Operations
![Page 41: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/41.jpg)
CUDA Operations
![Page 42: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/42.jpg)
CUDA Operations
![Page 43: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/43.jpg)
OpenCV on OpenCL
OpenCV는이미 CUDA 뿐만아니라 OpenCL을위한3rd party 라이브러리를지원하고있다
현재 2.4.9까지 release 되어있으며 3.0은 alpha 버전이개발및테스트중에있다3.0에서가장두드러진특징은 OpenCL에대한상당한개선들이이루어질것으로보인다
![Page 44: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/44.jpg)
OpenCV OCL module
OCL 이라고불리는 OpenCL wrapping 모듈을통해알고리즘을조합
opencv / modules / ocl / src /
- opencl을응용한알고리즘코드.
- 커널연산을위한문맥들을정의하고있으며 c++ 함수로 wrapping 하였다
opencv / modules / ocl / src / opencl
- opencl kernel 코드들
![Page 45: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/45.jpg)
산술연산
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: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/46.jpg)
OpenCV-CL 알고리즘구현예시
kernel
func
opencl wrapping 함수호출
kernel
func
kernel
func
kernel
func
hog()
알고리즘완성에필요한각각의단계별알고리즘을 kernel
로구현
단계별알고리즘을 wrapping한함수들을차례로호출
![Page 47: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/47.jpg)
끝마치며소모전력당성능요구사항은병렬처리와이기종멀티코어프로세서의발전을가져옴
복잡한플랫폼에서 task off loading과재사용성을모두만족해야하는소프트웨어의개발언어가필요해짐
Brook, CUDA와같은기존의병렬처리를위한기술들의아이디어에영향을받아개방형범용병렬컴퓨팅프레임워크가등장
영상처리, 컴퓨터비전등멀티미디어데이터처리를위한오픈소스라이브러리들이 OpenCL을지원하기시작
![Page 48: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/48.jpg)
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: 이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스](https://reader034.fdocument.pub/reader034/viewer/2022042511/5599c1331a28abd5078b45fb/html5/thumbnails/49.jpg)
감사합니다
이발표자료는온라인에공개합니다http://sshlab.blogspot.com
http://http://www.slideshare.net/sshtel