문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 OpenCL (문단 편집) == 특징 == {{{#!syntax cpp kernel void arrAdd(global const int *src1, global const int *src2, global int *dest) { const uint index = get_global_id(0); dest[index] = src1[index] + src2[index]; return; } }}} OpenCL용 프로그램은 C언어를 기반으로한 확장으로 이루어져 C언어에 익숙한 경우 직관적으로 작성할 수 있으며[* 물론 하드웨어, 특히 GPU의 경우 연산유닛과 구조적 특성에 맞게 코드를 짜야 한다. 대표적인 예로 if와 같은 분기문과 루프문을 최대한 사용하지 않는 것이 그 예. 전통적인 CPU 프로그램들과 달리 GPU의 경우 위 코드와 같은 저런 작은 서브루틴들이 최소 수십에서 수만개의 스레드로 대규모 병렬연산(Massively Parallel)으로 동작하게 되며, 제어유닛이 빈약한 GPU와 같은 [[매니코어 프로세서]]에서 CPU프로그래밍과 같이 분기문으로 서로 다른 동작을 하는 루틴이 포함된 코드의 경우 else statement 만큼의 성능을 깎아먹는다고 보면 된다.] 이를 통해 OpenCL을 지원하는 장비는 [[CPU]]든 [[GPU]]든 혹은 그 이외의 연산 장비든 모두 가져다 동시에 쓸 수 있다[* 이를 통해 FPGA 등을 통해 연산 유닛들을 구현하고 OpenCL 표준에 맞춘다면 그걸 OpenCL 연산 유닛으로 써먹는 것 또한 가능하다. CL_DEVICE_TYPE_ACCELERATOR]. 다만 후발주자라서 그런지 많이 알려져 있지 않다. OpenCL은 공개 규격(API)일 뿐이지 소스가 공개된 게 아니며, 구현은 전적으로 개발사에 달려 있다. CUDA는 NVIDIA 하드웨어에서만 동작한다는 단점을 가지고 있어 장래가 기대된다고 보는 사람도 있고, [[AMD]] 측과 [[인텔]] 측에선 OpenCL을 밀고 있다. 현재 클로즈드 소스 드라이버 중에서는 AMD APP SDK 3.0이 OpenCL 2.0을 지원한다. [[NVIDIA]]는 자사에서 먼저 개발된 [[CUDA]]를 밀고 있다 보니 2.0에 대한 지원이 더디었고 2016년 이후 불완전하게나마 지원하던 상태에 그쳤지만[* 정식 지원은 2017년에 나온 378 버전부터 시작됐다.] OpenCL 3.0이 출시되고 465버전부터 3.0까지 지원하기 시작했다. 그에 비하면 오픈소스 진영의 mesa는 OpenCL 2.0을 지원한다. OS X의 경우, 10.6 Snow Leopard부터 기본적으로 OpenCL을 지원하고 있으며, 따라서 별도의 SDK/드라이버 설치 등이 필요하지 않다. 다만 1.1이 나왔음에도 불구하고 버전이 계속 1.0에 머물러 있으므로 굳이 1.1을 사용하고 싶다면 별도로 드라이버 및 SDK를 설치해야 한다. 또한 일부 헤더 파일을 include할 때 다소 차이가 있다. GPU만 제어하는 CUDA에 비해 여러 가지 장비를 동시에 관리해야 하므로, 아무래도 함수 호출이 많이 길어지고 초기화 과정도 하나하나 다 해 줘야 하는 결점이 있다. 그렇기 때문에 코드 길이가 CUDA 코드에 비해 압도적으로 길고, 명령어가 많아서 아무래도 처음 배우는 사람들에게는 문턱이 높다.[* CUDA가 별도의 디바이스 초기화 코드 없이 디바이스 번호만 지정하면 드라이버가 알아서 기본적인 초기화를 해 주는것에 비해 OpenCL은 플랫폼(드라이버 인터페이스)를 열거후 컨텍스트를 받아온 후, 거기서 다시 디바이스를 열거 후 초기화해준 다음 커널 코드를 빌드 후 실행시키는 단계를 거쳐야 한다.] 대신 여러 장비를 동시에 통제할 수 있고, 그 방법 또한 CUDA보다 세련된 면이 있다.[* CUDA로 구현 가능한 것이라면 OpenCL로도 구현이 가능하며, CUDA로 구현 불가능한 것조차 OpenCL로는 구현이 가능하다. 따라서 기능만 따지자면 OpenCL이 상위호환인 셈으로, 코드가 길어지는 건 자유도가 높은 대신 그에 따른 부작용이라 보는게 좋다.] 그리고 CUDA에 비해 OpenGL과 결합시키기 좋다. 다만, 게임처럼 OpenGL을 적극 활용하는 환경에서는 장치의 초기화 문제로 대부분의 드라이버에서 딜레이가 생기므로, 간단한 행렬 연산은 CPU의 SSE/AVX나 NEON와 같은 SIMD 확장을 이용하고, 꽤나 무거운 계산이라면 GLSL Compute Shader를 이용하는 것이 낫다. 즉 OpenCL은 CUDA에 비해 하드웨어 범용성이 좋고 소프트웨어적으로도 다양한 응용이 가능하지만 대신 최적화에 한계가 있다고 볼 수 있다. PyOpenCL이라는 [[파이썬]] wrapper를 사용하여 편리하고 간결하게 사용할 수 있다. 관심이 있다면 찾아서 배워 보자. [[Java]] 또한 OpenCL을 사용할 수 있도록 wrapper가 존재한다. 관심있는 사람은 [[http://www.jocl.org|jocl 공식 홈페이지]]에서 간단하면서 좋은 샘플들을 볼 수 있다. (당연히 메이븐으로 간단하게 라이브러리 추가가 된다) 현재는 [[스마트폰]]에서도 OpenCL을 지원하고 있긴 하다. 다만 OpenGL과의 OpenGL ES의 관계처럼 풀 데스크톱 OpenCL은 아니고, OpenCL ES를 지원한다. 안드로이드의 경우에는 SDK를 지원하며, 최근 안드로이드 스마트폰의 경우는 대부분 Open CL 2.0 Full profile을 지원한다. iOS의 경우 4.3 버전에 힌트를 넣어 놨으며, 5.0 버전부터는 프라이빗 라이브러리 안에 박아넣고 있었다가 iOS 12부터 지원을 중단했다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기