{{위키데이터 속성 추적}}
{{다른 뜻|Botan|프레임워크|OpenCL이라 불렸던 암호화 라이브러리}}
{{소프트웨어 정보
| 제목      = OpenCL
| 로고      = OpenCL logo.svg
| 개발자    = [[크로노스 그룹]]
| released = {{시작 날짜와 나이|2009|08|28}}
| discontinued = 
| latest release version = {{wikidata|property|preferred|references|edit|P348|P548=Q2804309}}
| latest release date    = {{시작 날짜와 나이|{{wikidata|qualifier|preferred|single|P348|P548=Q2804309|P577}}|df=yes}}
| 운영체제  = [[크로스 플랫폼]]
| 종류      = [[API]]
| 라이선스  = OpenCL 규격 라이센스(OpenCL specification license)
| 웹사이트  = [http://www.khronos.org/opencl/ www.khronos.org/opencl]
}}

'''OpenCL'''({{lang|en|'''Open''' '''C'''omputing '''L'''anguage}})은 개방형 범용 병렬 컴퓨팅 프레임워크이다. [[중앙 처리 장치|CPU]], [[그래픽 처리 장치|GPU]], [[디지털 신호 처리 장치|DSP]] 등의 프로세서로 이루어진 이종 플랫폼에서 실행되는 프로그램을 작성할 수 있게 해 준다. OpenCL은 커널 코드를 작성하기 위한 [[C99]] 기반의 언어인 OpenCL C와 플랫폼을 정의하고 제어하기 위한 [[API]]를 포함하고 있다. OpenCL은 작업 기반(task-based) 및 데이터 기반(data-based) 병렬 컴퓨팅을 제공한다.

OpenCL이 만들어진 이유는 [[OpenGL]]이나 [[OpenAL]]이 만들어진 이유와 비슷하다. OpenGL과 OpenAL은 각각 [[3차원 컴퓨터 그래픽스]] 및 컴퓨터 오디오에 대한 산업계의 [[개방형 표준]]이다. OpenCL은 비영리 기술 컨소시엄인 [[크로노스 그룹]](Khronos Group)에서 관리하고 있다.

== 역사 ==
OpenCL은 [[애플]]이 최초로 개발했으며 OpenCL의 상표권도 애플이 가지고 있다. 그 후 [[AMD]], [[인텔]], [[엔비디아]] 등과 함께 애플은 문서를 다듬어 최초의 제안서(proposal)를 [[크로노스 그룹]]에 제출하였다. 2008년 6월 16일 크로노스 컴퓨트 워킹 그룹(Khronos Compute Working Group)이 결성되었다.<ref>
{{웹 인용
 |url          = http://www.khronos.org/news/press/releases/khronos_launches_heterogeneous_computing_initiative/
 |제목       = Khronos Launches Heterogeneous Computing Initiative
 |날짜       = 2008-06-18
 |출판사    = Khronos Group
 |확인날짜 = 2008-06-20
 |보존url    = https://web.archive.org/web/20080620123431/http://www.khronos.org/news/press/releases/khronos_launches_heterogeneous_computing_initiative/
 |보존날짜 = 2008-06-20
 |url-status = dead
}}</ref> 크로노스 컴퓨트 워킹 그룹에는 CPU, GPU, 임베디드 프로세서, 소프트웨어 업체들이 참여하였다. 2008년 6월부터 5개월 동안 이 그룹은 OpenCL 1.0을 만들기 위해 작업하였다. 2008년 11월 18일 마침내 기술 규격 정보를 담은 OpenCL 1.0 명세서(specification)가 완성되었다.<ref name=macWorld>
{{웹 인용
|url=http://www.macworld.com/article/136921/2008/11/opencl.html?lsrc=top_2
|제목=OpenCL gets touted in Texas
|출판사=MacWorld
|확인날짜=2008-11-20
}}
</ref>
이 기술 명세서는 크로노스 그룹 그룹원들이 검토(review)하였다. 그 후, 2008년 12월 8일 공식적으로 발표되었다.<ref name=khronosGroup>{{웹 인용
|url=http://www.khronos.org/news/press/releases/the_khronos_group_releases_opencl_1.0_specification/
|제목=The Khronos Group Releases OpenCL 1.0 Specification
|출판사=Khronos Group
|확인날짜=2008-12-08
|보존url=https://web.archive.org/web/20100713014204/http://www.khronos.org/news/press/releases/the_khronos_group_releases_opencl_1.0_specification/
|보존날짜=2010-07-13
|url-status=dead
}}</ref>

OpenCL은 [[맥 OS X 10.6]] 스노 레퍼드에서부터 지원된다.<ref name=pressrelease>{{웹 인용  |url=https://www.apple.com/pr/library/2008/06/09snowleopard.html  |제목=Apple Previews Mac OS X Snow Leopard to Developers  |날짜=2008-06-09  |출판사=Apple  |확인날짜=2008-06-11  |보존url=https://www.webcitation.org/66GmLMR6B?url=http://www.apple.com/pr/library/2008/06/09Apple-Previews-Mac-OS-X-Snow-Leopard-to-Developers.html  |보존날짜=2012-03-19  |url-status=dead  }}</ref>
{{인용문|
스노우 레퍼드(MAC OS 10.6)는 오픈 컴퓨팅 언어(OpenCL)로 최신의 하드웨어에 대한 지원을 확장하였다. 이전에는 GPU의 방대한 기가플롭스 계산 능력을 그래픽 애플리케이션에만 사용해 왔지만, OpenCL을 통하여 이제 어떠한 응용 프로그램에서도 끌어와 쓸 수 있다. OpenCL은 C 프로그래밍 언어에 기반하고 있으며, 개방형 표준으로 제안되었다.<ref>비공식 번역</ref>
<br /><br />
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.
|애플|프레스 릴리즈<ref name=pressrelease />}}
최초의 OpenCL 구현은 [[LLVM]] 및 [[Clang]] 컴파일러를 기반으로 한 것으로 알려졌다.

AMD는 OpenCL 및 [[다이렉트엑스]] 11을 지원하는 대신 AMD 고유의 스트림 프레임워크 내 "Close to Metal"을 포기하기로 결정했다.<ref name=AMDpressrelease>
{{웹 인용
|url=http://www.amd.com/us-en/Corporate/VirtualPressRoom/0,,51_104_543~127451,00.html
|제목=AMD Drives Adoption of Industry Standards in GPGPU Software Development
|날짜=2008-08-14
|출판사=AMD
|확인날짜=2008-08-06}}
</ref><ref name=eweekAMD>{{웹 인용
|url=http://www.eweek.com/c/a/Desktops-and-Notebooks/AMD-Backing-OpenCL-and-Microsoft-DirectX-11/
|제목=AMD Backs OpenCL, Microsoft DirectX 11
|날짜=2008-08-14
|출판사=eWeek
|확인날짜=2008-08-06
|archive-date=2012-03-19
|archive-url=https://www.webcitation.org/66GmKFQK7?url=http://www.eweek.com/c/a/Desktops-and-Notebooks/AMD-Backing-OpenCL-and-Microsoft-DirectX-11/
|url-status=dead
}}</ref>
[[RapidMind]]는 OpenCL 채택을 공식 선언하여 자신들의 개발 플랫폼의 밑단에 쓰기로 하였는데, 여러 제조업체의 GPU를 단일 인터페이스를 통해 지원하기 위해서였다.<ref name=RapidMindHPCWire>
{{웹 인용
 |url          = http://www.hpcwire.com/topic/applications/RapidMind_Embraces_Open_Source_and_Standards_Projects.html
 |제목       = HPCWire: RapidMind Embraces Open Source and Standards Projects
 |날짜       = 2008-11-11
 |출판사    = HPCWire
 |확인날짜 = 2008-11-11
 |보존url    = https://web.archive.org/web/20081218113648/http://www.hpcwire.com/topic/applications/RapidMind_Embraces_Open_Source_and_Standards_Projects.html
 |보존날짜 = 2008-12-18
 |url-status = dead
}}</ref>
[[엔비디아]]는 2008년 12월 9일 자사의 GPU 컴퓨팅 툴킷에서 OpenCL 1.0을 완벽히 지원한다고 발표하였다.<ref name="Nvidia Press Release 2008-12-09">
{{웹 인용
|url=http://www.nvidia.com/object/io_1228825271885.html
|제목=NVIDIA Adds OpenCL To Its Industry Leading GPU Computing Toolkit
|날짜=2008-12-10
|출판사=Nvidia
|확인날짜=2008-12-09}}</ref> OpenCL과 [[쿠다]]를 비교한다면 두개의 컴퓨터 언어를 비교하는 것과 비슷하다는 입장이다.

OpenCL 명세서는 크로노스에서 개발 중이며, 관심 있는 어떤 회사에라도 개방되어 있다.

== 구현 ==
2008/12/10 AMD와 엔비디아는 OpenCL 최초의 대중 시연을 실시하여 75분짜리 발표를 Siggraph Asia 2008에서 선보였다. AMD는 CPU 가속 OpenCL 시연으로 OpenCL의 코어 개수에 대한 규모가변성을 보였고, 엔비디아는 GPU-가속 시범을 보였다.<ref>
{{웹 인용
|url=https://www.youtube.com/watch?v=sLv_fhQlqis
|제목=OpenCL Demo, AMD CPU
|날짜=2008-12-10
|확인날짜=2009-03-28
}}
</ref><ref>
{{웹 인용
|url=https://www.youtube.com/watch?v=PJ1jydg8mLg
|제목=OpenCL Demo, NVIDIA GPU
|날짜=2008-12-10
|확인날짜=2009-03-28
}}
</ref>

2009/03/26 GDC 2009에서는 AMD와 [[하복]]이 최초로 AMD [[라데온 HD 4000 시리즈]] GPU 상에서 OpenCL을 이용하여 [[하복 클로스]](Havok Cloth)를 가속시키는 시연을 실시하였다.<ref>{{웹 인용
|url=http://www.pcper.com/comments.php?nid=6954
|제목=AMD and Havok demo OpenCL accelerated physics
|출판사=PC Perspective
|날짜=2009-03-26
|확인날짜=2009-03-28
|보존url=https://web.archive.org/web/20090405072046/http://www.pcper.com/comments.php?nid=6954
|보존날짜=2009-04-05
|url-status=dead
}}</ref>

2009/04/20, 엔비디아가 OpenCL 조기 접근 프로그램 참가 개발자 대상으로 자신의 OpenCL 드라이버와 SDK를 배포한다고 발표하였다.<ref>{{웹 인용
|url=http://www.nvidia.com/object/io_1240224603372.html
|제목=NVIDIA Releases OpenCL Driver To Developers
|출판사=NVIDIA
|날짜=2009-04-20
|확인날짜=2009-04-27
|보존url=https://www.webcitation.org/66GmM7jsd?url=http://www.nvidia.com/object/io_1240224603372.html
|보존날짜=2012-03-19
|url-status=dead
}}</ref>

2009년 9월 애플에서 [[맥 OS X 10.6]] 스노 레퍼드 버전에 OpenCL이 구현되었다.<ref>
{{웹 인용
|author=Dan Moren
|author2=Jason Snell
|url=http://www.macworld.com/article/140897/2009/06/keynote.html
|제목=Live Update: WWDC 2009 Keynote
|work=macworld.com
|출판사=MacWorld
|날짜=2009-06-08
|확인날짜=2009-06-12
}}
</ref> 스노 레퍼드에 포함되는 OpenCL은 초기에는 다음 GPU를 지원한다:<ref>{{
웹 인용
|url=https://www.apple.com/macosx/specs.html
|제목=Mac OS X Snow Leopard – ''Technical specifications and system requirements''
|출판사=Apple Inc
|날짜=2009-06-08
|확인날짜=2009-06-12
}}
</ref>
* NVIDIA Geforce 8600M GT, GeForce 8800 GT, GeForce 8800 GTS, Geforce 9400M, GeForce 9600M GT, GeForce GT 120, GeForce GT 130,
* ATI Radeon 4850, Radeon 4870.

== 예제 ==
다음은 [[고속 푸리에 변환]]을 하는 예제이다. 호스트 프로그램은 다음과 같다.
<ref name=siggraph>{{웹 인용
|url=http://s08.idav.ucdavis.edu/munshi-opencl.pdf
|제목=OpenCL
|날짜=2008-08-14
|출판사=SIGGRAPH2008
|확인날짜=2008-08-14
|보존url=https://www.webcitation.org/66GmScoh5?url=http://s08.idav.ucdavis.edu/munshi-opencl.pdf
|보존날짜=2012-03-19
|url-status=dead
}}</ref>
<syntaxhighlight lang="c">
// GPU 장치와 계산 context를 생성한다
context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);

// 작업 대기열을 생성한다
clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
queue = clCreateCommandQueue(context, device_id, 0, NULL);

// 버퍼 메모리 객체를 생성한다
memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);
memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);

// 계산 프로그램을 생성한다
program = clCreateProgramFromSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);

// 계산 프로그램 실행 코드를 생성한다
clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

// 계산 커널을 생성한다
kernel = clCreateKernel(program, "fft1D_1024", NULL);

// args 값을 설정한다
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);
clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);

// 커널을 실행시킨다
global_work_size[0] = num_entries;
local_work_size[0] = 64;
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
</syntaxhighlight>

실제 계산이 이루어지는 커널 함수는 다음과 같다.<ref>[http://www.cs.berkeley.edu/~kubitron/courses/cs258-S08/projects/reports/project6_report.pdf Fitting FFT onto the G80 Architecture]를 바탕으로 구현함</ref><ref name=VolkovKazianFFTG80>
{{웹 인용
|url=http://www.cs.berkeley.edu/~kubitron/courses/cs258-S08/projects/reports/project6_report.pdf
|제목=Fitting FFT onto G80 Architecture
|날짜=2008-11-14
|출판사=Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report
|확인날짜=May 2008}}
</ref>
<syntaxhighlight lang="c">
// This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into
// calls to a radix 16 function, another radix 16 function and then a radix 4 function

__kernel void fft1D_1024 (__global float2 *in, __global float2 *out,
                          __local float *sMemx, __local float *sMemy) {
  int tid = get_local_id(0);
  int blockIdx = get_group_id(0) * 1024 + tid;
  float2 data[16];

  // 전역 메모리 입출력 영역 시작 주소
  in = in + blockIdx;  out = out + blockIdx;

  globalLoads(data, in, 64); // 한 덩어리로 전역 메모리 읽기
  fftRadix16Pass(data);       // 자리 변경 없이 radix-16 처리
  twiddleFactorMul(data, tid, 1024, 0);

  // 지역 메모리를 이용한 지역 shuffle
  localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
  fftRadix16Pass(data);               // 자리 변경 없이 radix-16 처리
  twiddleFactorMul(data, tid, 64, 4); // 회전 인수 곱셈

  localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));

  // radix-4 함수 호출 4회
  fftRadix4Pass(data);
  fftRadix4Pass(data + 4);
  fftRadix4Pass(data + 8);
  fftRadix4Pass(data + 12);

  //한덩어리로 전역 메모리에 기록
  globalStores(data, out, 64);
}
</syntaxhighlight>

== 같이 보기 ==
{{위키공용분류}}
* [[그래픽 처리 장치|GPU]]
* [[GPGPU]]
* [[CUDA]]
* [[Close to Metal]]
* [[BrookGPU]]
* [[Lib Sh]]
* [[라라비 (마이크로아키텍처)|인텔 라라비]]

== 각주 ==
{{각주|2}}

== 외부 링크 ==
* {{언어링크|en}} [http://www.khronos.org/opencl/ OpenCL 홈페이지]
* {{언어링크|en}} [http://www.khronos.org/registry/cl/specs/opencl-1.2.pdf OpenCL 1.2 기술 명세서]
* {{언어링크|en}} [http://www.macworld.com/article/134858/2008/08/snowleopard_opencl.html OpenCL: What you need to know] - article published in Macworld, August 2008
* {{언어링크|en}} [https://web.archive.org/web/20081218113641/http://www.hpcwire.com/blogs/OpenCL_On_the_Fast_Track_33608199.html HPCWire: OpenCL on the Fast Track]
* {{언어링크|en}} [https://web.archive.org/web/20100713014204/http://www.khronos.org/news/press/releases/the_khronos_group_releases_opencl_1.0_specification/ The Khronos Group Releases OpenCL 1.0 Specification]

{{크로노스 그룹 표준}}
{{OS X}}

{{전거 통제}}

[[분류:GPGPU]]
[[분류:API]]
[[분류:2009년 소프트웨어]]
[[분류:GPGPU 라이브러리]]