[ODROID] OpenCL Study 01

책도 빌렸는데 기초부터 OpenCL을 살펴본다.

우선 OpenCL은 이종 컴퓨텅(Heterogeneous Computing)이라는 분야의 한 종류이다.

이종 컴퓨팅에서는 GPU를 본연의 목적 외에 연산 유닛으로 사용하게 된다. 오늘날 GPGPU(General Purpose GPU)라고 불리는 것도 그래픽 연산 외에 다른 용도로 많이 사용되서 그러는 듯.

이쪽 분야는 NVIDIA의 CUDA와 크로노스의 OpenCL 정도로 나눠볼 수 있다. 쿠다는 NVIDIA를 위한 것이고, 임베디드나 AMD 당은 OpenCL가 가능하겠다라는 것을 유추해볼 수 있다.

흔히 OpenMP와 헷갈리는데 이쪽은 뭔가 공유메모리 위주로 다중 프로세싱 중심인 것 같다.

 

OpenCL은 병렬화에 도움을 준다.

대부분 소프트웨어가 싱글 코어에 최적화 되어 있는데 이를 고성능 컴퓨터 분야에서는 연산량이 적은 다수의 코어로 나누어 처리한다. 이를 병렬화해서 처리한다고 할 수 있는데 Divide-and-conquer나 scatter-gather 적 방법론이 있다. Divide-and-conquer는 어떤 문제를 서브 문제로 나누어 해결하는 방식이고 scatter-gather는 서브 문제들을 쫙 뿌리고 치리하고 나중에 모아서 결과를 만든다고 한다. 사실 잘 모르겠다. 빠르게 넘어간다.

여튼 이러한 병렬의 특징으로 인하여 이미지 처리와 관련된 알고리즘에 적용하면 성능 향상을 기대할 수 있다.

예를 들면 배열 연산의 경우 각 연산을 시리얼하게 순차적으로 하는 것보다 한번에 작은 코어들에서 병렬적으로 처리하는 것이 더 빠르다! 당연하겠지?!

 

바로 실무적은 설명으로 들어가보자

아래 요소만 확실하게 이해하고 시작해야 한다.

호스트와 디바이스

앞선 포스팅에선 호스트로 ARM 머시기, 디바이스로는 Mali GPU가 언급됐었다. 이때 호스트는 교통정리를 하주고 디바이스는 연산 유닛을 이용해서 연산을 수행 하는 듯하다.

OpenCL의  핵심 실행요소에 대해서 알아두고 시작하도록 하자

컨텍스트

호스트에 존재하는 추상적인 컨테이너 이다. 그러니 호스트나 디바이스에 접근가능한 주소 등을 포함하고 있다고 생각하면 된다. 그러니 같은 플랫폼과 디바이스 내에서는 한번 작성되면 계속적인 재사용이 가능하다.

명령어 큐

디바이스 간 통신과 관련된 부분이다. 명령어 큐는 호스트가 디바이스에 어떤 처리를 요청할 때사용되는 매커니즘이다. 큐 라는 개념은 스택과 비교되어 기초 지식자라면 알고 있을 것이다.

이벤트

명령어 큐에 명령어가 들어가면 이벤트가 발생하게 되는데 이 부분에서는 1. 의존성 표현 2. 프로파일링 메커니즘이 중요하단다. 뒤에서 설명이 나온다고 하네..

여튼 뭔가가 발생되는 것을 말하는 듯

버퍼

동적할당, malloc, new 등과 비슷한 개념이라고 한다. 그냥 넘어가자 나중에 예제를 보면 이해될 것이다.

이미지

물리적 데이터의 공간을 추상화하기 위한 메모리 객체라고 한다. 버퍼랑 차이점이 뭔가요? 라고 한다면 직접참조가 불가능 하다고 한다. 그리고 옆 데이터가 연속적 데이터라는 보장도 없다고 한다.

기능 지원여부를 파악해야 한다고 하니 약간 optional한 부분인 듯.

플러시와 피니쉬

베리어 오퍼레이션이라고 한다. 뭔소리야… Finish는 큐의 명령어가 완료될 때까지 기다리고, Flush는 모든 큐가 제거될 때까지 멈춘다고 한다. 뭔가 동기화 라던징 안정성을 위해서 실행하는 부분인 것 같다.

 

 

204 Comments

  1. Hey this is kinda of off topic but I was wondering if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon but have no coding skills so I wanted to get guidance from someone with experience. Any help would be enormously appreciated!