OpenCL


Open Computing Language

1 개요

한글명칭은 개방형 범용 병렬 컴퓨팅 프레임워크이며, 엔비디아의 CUDA 프로그래밍, MS의 DirectCompute와 대응되는 GPGPU 프로그래밍용 API.

2 배경

개발자는 Apple Inc. 개발자라 덩달아 이 이름의 상표권도 가지고 있다. 애플은 이걸 어느 정도 틀을 잡아놓고 NVIDIA, AMD, 인텔 등과 같이 다듬어서 OpenGL 등을 개발하는 크로노스 그룹에 맡긴다. 그후 크로노스 그룹은 열심히 노력해서 1.0을 개발하였고, 1.0은...

당연하게도 OS X 스노우 레오파드와 같이 공개되었다.

애플은 OpenCL 1.0을 공개하면서 이렇게 말했다.

Snow Leopard further extends support for modern hardware with Open Computing Language (OpenCL), which lets any application tap into the vast gigaflops of GPU computing power previously available only to graphics applications. OpenCL is based on the C programming language and has been proposed as an open standard.

스노우 레오파드는 OpenCL로 현대 하드웨어에 대한 지원을 확장하였습니다. 이전에는 GPU의 방대한 기가플롭스 계산 능력을 그래픽 애플리케이션에만 사용해 왔지만, OpenCL을 통하여 이제 어떠한 응용 프로그램에서도 끌어와 쓸 수 있습니다. OpenCL은 C 프로그래밍 언어에 기반하고 있으며, 개방형 표준으로 제안되었습니다.

3 특징

OpenCL을 지원하는 장비는 CPUGPU든 혹은 그 이외의 연산 장비든 모두 가져다 동시에 쓸 수 있다.
다만, 나온 지가 얼마 되지 않아서 많이 알려져 있지 않다. OpenCL은 공개 규격(API)일뿐이지 소스가 공개된 게 아니며, 구현은 전적으로 개발사의 몫이긴 하지만, CUDA는 NVIDIA 하드웨어에서만 동작한다는 단점을 가지고 있어 장래가 기대된다고 보는 사람도 있고, AMD측과 인텔측에선 OpenCL을 밀고 있다. 현재 클로즈드 소스 드라이버 중에서는 AMD APP SDK 3.0이 OpenCL 2.0을 지원한다. NVIDIA인텔은 아직 OpenCL 1.1만을 지원한다. 그에 비하면 오픈소스 진영의 mesa는 OpenCL 2.0을 지원한다.

OS X의 경우, 10.6 Snow Leopard부터 기본적으로 OpenCL을 지원하고 있으며, 따라서 별도의 SDK/드라이버 설치 등이 필요하지 않다. 다만 1.1이 나왔음에도 불구하고 버전이 계속 1.0에 머물러 있으므로 굳이 1.1을 사용하고 싶다면 별도로 드라이버 및 SDK를 설치해야 한다. 또한 일부 헤더 파일을 include할 때 다소 차이가 있다. 만들어 놓고도 공개를 안하는것을 보면 애플츤데레인가보다.

GPU만 제어하는 CUDA에 비해 여러 가지 장비를 동시에 관리해야 하므로, 아무래도 함수 호출이 많이 길어지고 초기화 과정도 하나하나 다 해 줘야 하는 결점이 있다. 코드 길이가 CUDA 코드에 비해 압도적으로 길고, 명령어가 많아서 아무래도 처음 배우는 사람들에게는 문턱이 높다. 대신 여러 장비를 동시에 통제할 수 있고, 그 방법 또한 CUDA보다 세련된 면이 있다. 그리고 CUDA에 비해 OpenGL과 결합시키기 좋다. [1]

PyOpenCL이라는 파이썬 wrapper를 사용하여 편리하고 간결하게 사용할 수 있다. 관심이 있다면 찾아서 배워 보자.

Java 또한 opencl을 사용할수 있도록 wrapper가 존재한다 관심있는 사람은 jocl 공식홈페이지 에서 간단하면서 좋은 샘플들을 볼수 있다. (당연히 메이븐으로 간단하게 라이브러리 추가가 된다)

현재는 스마트폰에서도 OpenCL을 지원하고 있긴하다. 다만 OpenGL처럼 풀 데스크톱 OpenCL은 아니고, OpenCL ES를 지원한다. 안드로이드의 경우에는 SDK를 지원하며, iOS의 경우 4.3버전에 힌트를 넣어놨으며, 5.0버전부터는 프라이빗 라이브러리안에 박아넣고 있다.

2013년 11월 18일에 OpenCL 2.0 최종 스펙을 발표했다. 그리고 NVIDIA, AMD 각각 SDK 를 제공한다. (NVIDIACUDA 툴킷에 포함하여 제공, AMD 는 자체 IDE 를 제작함) 2.0에 신기술인 HSA가 추가됐으며, AMD APU 칩셋은 2014년 초에 출시한 카베리부터 지원된다.

2015년 3월 GDC에서 Vulkan API와 함께 OpenCL 2.1을 발표하여 SPIR-V와의 연동을 소개했는데 정작 5개월 후에 출시한 인텔 스카이레이크에서는 2015년 11월 현재 OpenCL 2.1이 아닌 2.0버전을 지원한다.[2]

4 문제점

그런데 OpenCL을 사용할 때, 개발에 사용된 다른 중요한 소스가 공개돼서는 안 되는 상용 프로젝트에 사용할 경우에서 문제가 발생한다. OpenCL은 호환성 확보를 위해 Online Compile 이라는 방법을 사용하는데 소스 코드를 불러와 그걸을 즉석에서 컴파일하여 바이너리를 만드는 방식이다. 문제는, 이 것 때문에 소스 코드 공개를 막을 방법이 없다! 소스코드를 어떤 방법으로든 난독화를 하더라도(암호화, 압축 등) 소스를 컴파일하여 바이너리를 만드는 그 함수엔 반드시 원본 소스를 집어넣어야 하기 때문에 이 함수만 잘 추적한다면 원본 소스를 통째로 도둑맞게 된다. 그렇다고 미리 컴파일된 바이너리를 로드하는 방법을 쓰자니, 각 아키텍처에 맞게 컴파일된 바이너리라 호환성을 보장할 수 없다. 이 상황에서 유일한 방법은 각각 아키텍처마다 일일이 바이너리를 만드는 것이다.[3]

이 부분을 개선해달라고 개발자들이 요청하고 있으니 다음 개정판을 기다려보자.
  1. 다만, 게임등 OpenGL을 적극 활용하는 환경에서는 장치의 초기화 문제로 대부분의 드라이버에서 딜레이가 생기므로, 간단한 행렬 연산을 CPU의 SSE나 neon을 이용하고, 꽤나 무거운 계산이라면 GLSL Compute Shader를 이용하는것이 낫다.
  2. 새로운 표준이 나오자 마자 그것을 지원하는건 상당히 힘든 일이다. 아마도 가까운 장래에 2.1을 지원할것으로 보인다.
  3. CUDA는 엔비디아의 GPU 아키텍쳐만 지원하면 되니 바이너리 배포가 가능한 것이다.