개요편집이의 제기
OpenCL(Open Computing Language)은 이기종 컴퓨팅 시스템에서 병렬 프로그램을 작성하기 위한 개방형, 로열티 프리 표준이자 프레임워크다. 중앙처리장치(CPU), 그래픽처리장치(GPU), 디지털 신호 처리장치(DSP), 필드 프로그래머블 게이트 어레이(FPGA), 텐서 프로세서 등 다양한 가속기를 단일 프로그래밍 모델로 제어할 수 있게 해준다. 크로노스 그룹(Khronos Group)이 관리하며, 2009년 8월 28일 최초 공개되었다.[1][2][3][4]
OpenCL은 커널(kernel) 코드를 작성하기 위한 C99 기반 언어(OpenCL C)와 플랫폼을 정의·제어하기 위한 호스트 API로 구성된다. 작업 기반(task-based) 및 데이터 기반(data-based) 병렬성을 모두 지원하며, 실행 시점(JIT)에 커널을 컴파일해 이식성을 확보한다. 호스트 프로그램은 C/C++로 작성하고 OpenCL API를 통해 커널을 디바이스에 디스패치하며, 디바이스 메모리는 호스트 메모리와 개념적으로 분리되어 있다.[3]
작동 방식과 유형편집이의 제기
플랫폼 모델과 실행 모델
OpenCL은 컴퓨팅 시스템을 호스트(host)와 하나 이상의 컴퓨트 디바이스(compute device)로 본다. 호스트(일반적으로 CPU)는 애플리케이션 로직을 수행하고 OpenCL API를 호출해 디바이스를 제어한다. 디바이스는 CPU, GPU, DSP, FPGA, 전용 추론 엔진 등일 수 있다.[3][4]
단일 컴퓨트 디바이스는 여러 컴퓨트 유닛(compute unit)으로 구성되며, 각 컴퓨트 유닛은 다수의 처리 요소(processing element, PE)를 포함한다. 커널 한 번 실행으로 다수 PE에서 병렬 연산이 수행된다. 컴퓨트 유닛과 PE의 구체적 구성은 벤더 재량이며, '코어' 개념이 모든 디바이스 유형에 일관되게 적용되지는 않는다.[3]
메모리 계층
OpenCL은 디바이스 측에서 네 단계 메모리 계층을 정의한다.[3]
* 전역 메모리(__global): 모든 처리 요소가 공유하며 접근 지연시간이 길다.
* 읽기 전용 메모리/상수 메모리(__constant): 더 작고 지연시간이 낮으며, 호스트 CPU만 쓸 수 있고 디바이스는 읽기만 가능하다.
* 로컬 메모리(__local): 처리 요소 그룹(워크 그룹) 내 공유된다.
* 프라이빗 메모리/레지스터(__private): 개별 처리 요소 전용이다.
모든 디바이스가 각 단계를 하드웨어로 구현할 필요는 없으며, 계층 간 일관성은 명시적 동기화(배리어 등)로만 강제된다. 디바이스 메모리와 호스트 메모리는 공유될 수도, 분리될 수도 있으며, 호스트 API는 버퍼 핸들과 전송 함수를 제공한다.[3]
프로그래밍 언어: OpenCL C와 C++ for OpenCL
* OpenCL C: C99 기반 방언. 포인터에 주소 공간 한정자(`__global`, `__local`, `__constant`, `__private`)를 붙여 메모리 계층을 명시한다. `main` 함수 대신 `__kernel` 한정자로 진입점을 표시한다. 함수 포인터, 비트 필드, 가변 길이 배열, 재귀는 금지되며, 표준 라이브러리는 수학 중심의 전용 함수 집합으로 대체된다. 벡터 타입(`float4` 등)과 SIMD 매핑, 워크 아이템·워크 그룹 동기화 기능을 내장한다.[3]
* OpenCL C++ (단명 사양): OpenCL C와 C++14를 결합하려 했으나 온라인 컴파일만 지원하고 확장 감지 메커니즘이 없었으며 실제 드라이버 지원 여부가 불확실하다.[3]
* C++ for OpenCL (2020~현재): 커뮤니티 주도로 C++17 기능을 OpenCL C 위에 얹으면서 역호환성을 유지한다. Clang 9부터 지원하며, `-cl-std=CLC++` 옵션이나 `cl_ext_cxx_for_opencl` 확장으로 드라이버에서 온라인 컴파일 가능. 오프라인 컴파일로 SPIR-V나 실행 바이너리를 생성해 런타임에 로드하는 흐름도 권장된다. 가상 함수, 예외, `dynamic_cast`, 비배치 `new/delete`, C++ 표준 라이브러리 등은 미지원이나, 템플릿, 람다, 연산자 오버로딩 등 다수 C++ 기능을 주소 공간 개념과 함께 활용할 수 있다.[3]
중간 표현과 이식성
* SPIR-V: 프론트엔드 컴파일러와 OpenCL 백엔드 간 커널을 타깃 독립적으로 전달하기 위한 표준 휴대용 중간 표현(Standard Portable Intermediate Representation). OpenCL 3.1에서 핵심 사양에 편입되었다.[3][4]
* 오프라인 컴파일: 복잡도 증가에 따라 Clang 등으로 SPIR-V나 벤더별 바이너리를 미리 빌드해 배포하고, 런타임에 `clCreateProgramWithBinary` 등으로 로드하는 방식이 일반화되고 있다.[3]
상위 프로그래밍 모델: SYCL
크로노스 그룹은 순수 C++17 기반 단일 소스 임베디드 DSL(Single-source eDSL)인 SYCL을 비준해 OpenCL 위에서 더 높은 생산성의 추상화 계층을 제공한다. SYCL은 OpenCL 커널과 호스트 코드를 같은 C++ 소스에 작성하게 하며, OpenCL 구현체 위에서 동작한다.[3][4]
사례편집이의 제기
자료에 명시된 초기 구현·시연·채택 사례는 다음과 같다.[2][3]
* 애플: 맥 OS X 10.6 스노 레퍼드(2009-09)에 최초 탑재. 초기 지원 GPU 목록 제시.
* AMD: 2008-12-10 시그라프 아시아(Siggraph Asia 2008)에서 CPU 가속 OpenCL 시연으로 코어 수에 따른 규모가변성 입증. 2009-03-26 GDC 2009에서 하복(Havok)과 라데온 HD 4000 시리즈 GPU 상에서 하복 클로스(Havok Cloth) 가속 시연.
* 엔비디아: 2008-12-10 시그라프 아시아에서 GPU 가속 시연. 2009-04-20 조기 접근 프로그램 참가 개발자 대상 드라이버·SDK 배포.
* IBM: 2009-10-30 XL 컴파일러의 일부로 첫 OpenCL 구현 릴리스.
* RapidMind: 개발 플랫폼 하부에 OpenCL 채택 공식 선언.
그 밖의 주제편집이의 제기
적합성 테스트와 에코시스템
크로노스 그룹은 OpenCL 적합성 테스트 스위트(CTS)를 제공해 구현체 신뢰성을 검증한다. 적합 제품 목록(Conformant Products)은 크로노스 웹사이트에 공개되며, AMD, Arm, Cadence, Google, Imagination, Intel, Nvidia, Qualcomm, Samsung, SPI, Verisilicon 등 다수 기업이 적합 구현체를 보유한다.[3][4]
개발 도구와 참고 자료
공식 사이트는 명세서(HTML/PDF), SDK(헤더, 바인딩, 로더, 유틸리티, 샘플), 입문 가이드(OpenCL Guide), 레퍼런스 페이지, 퀵 레퍼런스 카드, Clang 지원, 인터셉트 레이어(디버깅·성능 분석), GPUInfo.org 연동 등을 제공한다. 연례 컨퍼런스 IWOCL(International Workshop on OpenCL)이 개최된다.[4]
상표와 라이선스
OpenCL 상표는 애플이 소유하며 크로노스 그룹이 라이선스 관리한다. 명세서는 로열티 프리(open, royalty-free standard)로 공개되며, 구현체는 오픈 소스 라이선스 하에 배포되기도 한다.[1][4]
운영체제·아키텍처 지원 범위
마이크로소프트 윈도우, macOS, 리눅스, FreeBSD, 안드로이드에서 동작하며, x86_64, IA-32, ARM 아키텍처를 지원한다.[1]
이 문서는 GGWiki AI가 공개 자료(아래 출처)를 조사해 새로 쓴 초안입니다. 틀린 내용은 편집하거나 이의 제기로 알려 주세요.
