OpenCL

 

[image]
'''Open''' '''C'''omputing '''L'''anguage
1. 개요
2. 배경
3. 특징
4. 역사


1. 개요


2009년 8월에 발표된 엔비디아의 CUDA 프로그래밍, MS의 DirectCompute와 대응되는 GPGPU 프로그래밍용 API. 한국어로는 개방형 범용 병렬 컴퓨팅 프레임워크라고도 부른다.

2. 배경


개발자는 Apple Inc. 개발자라 덩달아 이 이름의 상표권도 가지고 있다. 애플은 2008년 12월 8일에 어느 정도 틀을 잡아놓고 NVIDIA, AMD, 인텔 등과 같이 다듬어서 OpenGL 등을 개발하는 크로노스 그룹에 맡긴다. 그 후 크로노스 그룹은 열심히 노력해서 2009년 8월 28일에 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 프로그래밍 언어에 기반하고 있으며, 개방형 표준으로 제안되었습니다.

그러나, 2018년에 출시된 macOS 10.14 Mojave/iOS 12부터 애플은 OpenGL과 OpenCL의 지원을 중단하였다. 2014년에 발표된 자체 그래픽 API인 Metal을 밀어주기 위함으로 보인다.
마이크로소프트의 windows 10 20h2버전 부터는 공식적으로 WSL2를 지원하는데, 이 WSL2 지원과 함께 directX12의 신버전 발표, 그리고 새로운 ML용 툴이 공개 되었다. directML이란 툴로써, 무려 AMD,Intel,NVIDIA 3회사의 그래픽카드를 모두 지원하는 ML 툴이다. tensorflow 1.15 버전 호환이 가능한 데모 버전으로써, 윈도우와 WSL2 양쪽 모두 사용 가능한 툴이다. 기본적으로 윈도우상에서는 AMD와 Intel의 GPU는 ML을 사용할 수 없던터라 해당 GPU를 사용하는 작업자들에게는 희소식.[1] 또한 DirectML 자체는 2019년 발표인데, 이를 이용해 AMD 진영에서는 DLSS에 대응하는 툴을 개발한단 소식이 있다.

3. 특징


OpenCL을 지원하는 장비는 CPUGPU든 혹은 그 이외의 연산 장비든 모두 가져다 동시에 쓸 수 있다. 다만 후발주자라서 그런지 많이 알려져 있지 않다. OpenCL은 공개 규격(API)일 뿐이지 소스가 공개된 게 아니며, 구현은 전적으로 개발사에 달려 있다. CUDA는 NVIDIA 하드웨어에서만 동작한다는 단점을 가지고 있어 장래가 기대된다고 보는 사람도 있고, AMD 측과 인텔 측에선 OpenCL을 밀고 있다. 현재 클로즈드 소스 드라이버 중에서는 AMD APP SDK 3.0이 OpenCL 2.0을 지원한다. NVIDIA는 자사에서 먼저 개발된 CUDA를 밀고 있기 때문에 아직 OpenCL 1.2까지만 지원한다. 2.0도 2016년 이후 불완전하게나마 지원하기는 한다. 그에 비하면 오픈소스 진영의 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과 결합시키기 좋다. 다만, 게임처럼 OpenGL을 적극 활용하는 환경에서는 장치의 초기화 문제로 대부분의 드라이버에서 딜레이가 생기므로, 간단한 행렬 연산을 CPU의 SSE나 neon을 이용하고, 꽤나 무거운 계산이라면 GLSL Compute Shader를 이용하는 것이 낫다.
PyOpenCL이라는 파이썬 wrapper를 사용하여 편리하고 간결하게 사용할 수 있다. 관심이 있다면 찾아서 배워 보자.
Java 또한 OpenCL을 사용할 수 있도록 wrapper가 존재한다. 관심있는 사람은 jocl 공식 홈페이지에서 간단하면서 좋은 샘플들을 볼 수 있다. (당연히 메이븐으로 간단하게 라이브러리 추가가 된다)
현재는 스마트폰에서도 OpenCL을 지원하고 있긴 하다. 다만 OpenGL과의 OpenGL ES의 관계처럼 풀 데스크톱 OpenCL은 아니고, OpenCL ES를 지원한다. 안드로이드의 경우에는 SDK를 지원하며, 최근 안드로이드 스마트폰의 경우는 대부분 Open CL 2.0 Full profile을 지원한다. iOS의 경우 4.3 버전에 힌트를 넣어 놨으며, 5.0 버전부터는 프라이빗 라이브러리 안에 박아넣고 있었다가 iOS 12부터 지원을 중단했다.

4. 역사


2010년 6월 14일 OpenCL 1.1 버전이 발표되어 OpenGL과의 상호 운용성이 개선되었다.
2011년 11월 15일 OpenCL 1.2 버전이 발표되었다. OpenGL뿐만 아니라 DirectX의 일부 기능과 공유가 가능해졌다.
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와의 연동을 소개했는데 이후에 출시된 인텔 스카이레이크, 카비레이크가 현재 OpenCL 2.1이 아닌 2.0 버전에 머물고 있다. 그리고 11월 18일에 OpenCL 2.1의 최종 스펙이 발표되었다.
2017년 5월 16일 SPIR-V 1.1과 연동 가능한 OpenCL 2.2가 최종 발표되었다.
2020년 4월 27일 OpenCL 3.0 표준이 발표되었다. OpenCL 2.x 에서 추가된 모든 기능들이 Optional 로 변경되고 사실상 다시 OpenCL 1.2 로 돌아왔는데 가뜩이나 빈약한 환경에서 플랫폼의 파편화만 유발한다고 비판하는 목소리가 높다.