# OpenCL

OpenCL (Open Computing Language) is een programmeertaal, framework en platform ontwikkeld door Apple voor het uitvoeren van onder andere complexe parallelle berekeningen op de CPU en de GPU (ook bekend als GPGPU). De taal is gebaseerd op een dialect van de C-programmeertaal en stelt applicaties in staat om op een uniforme wijze diverse soorten processoren te gebruiken voor allerlei berekeningen.

## Geschiedenis

OpenCL werd door Apple bij de Khronos Group voorgesteld als open standaard, zoals OpenGL en OpenAL, standaarden voor respectievelijk 3D-computergraphics en 3D-geluid. Op 16 juni 2008 werd de Compute Working Group opgericht bij Khronos Group met als doel met standaardiseren van berekeningen op heterogene data (data van allerlei bronnen) en parallelle berekeningen op de CPU en de GPU. Op 9 december 2008 werd versie 1.0 van de standaard uitgebracht. Op dezelfde dag kondigde NVIDIA ook aan deze versie geheel te zullen ondersteunen. Op 12 december 2008 werd OpenCL door AMD en NVIDIA voor het eerst gedemonstreerd op SIGGRAPH Asia 2008.
Aan OpenCL wordt meegewerkt door allerlei bedrijven, zoals Activision, Blizzard, AMD, Apple, Electronic Arts, Ericsson, IBM, Intel, Motorola, Nokia, NVIDIA, Samsung en Texas Instruments.
OpenCL is uitgebracht in Mac OS X 10.6 Snow Leopard.
Sinds Ubuntu 10.10 bevat ook Ubuntu ondersteuning voor OpenCL-applicaties. (en onofficieel sinds 9.10)
OpenCL 2.0 kwam uit op 22 juli 2013.

## Techniek

OpenCL maakt gebruik van een deelverzameling van de ISO/IEC C99-standaard van C met uitbreidingen voor parallellisme. De IEEE 754-standaard wordt gebruikt voor berekeningen met zwevendekommagetallen.
De implementaties van Apple, NVIDIA, RapidMind en Mesa Gallium3D zijn gebaseerd op LLVM met clang als frontend.

## Toepassingen

OpenCL kan toegepast worden op gebieden waarbij de rekenkracht van de grafische kaart een prestatievoordeel biedt. Voorbeelden zijn: simulaties van vloeistoffen, beeldbewerking, wiskundige operaties (vb. Fast Fourier Transform), medische beeldverwerking en computerspellen.

## OpenCL C

OpenCL definieert ook OpenCL C. Dit is een variant van de gelijksoortige C99-taal die gebruikt wordt voor het optimaliseren van GPU-programmatie. Het implementeert veranderingen die nodig zijn om een C-programmeertaal te gebruiken voor onder andere GPU's (en toekomstige processoren) aan te passen zodat er een ondersteuning is voor parallelle berekeningen. OpenCL C omvangt ook een ondersteuning voor vectortypes. Dit zorgt voor een betere efficiëntie van de streamline dataflow. Ontwikkelaars gebruiken OpenCL C om prestatie- en data-intensieve routines te herschrijven in hun applicatie. Tijdens de herschrijving wordt de routine naar zijn meest elementaire staat gebracht. Een serie van discrete operaties beschrijven de berekeningen die gevormd kunnen worden in parallel over een dataset.

## Kernel

De resulterende code is gelijkwaardig aan die van een normale C-functie; dit wordt OpenCL-kernel genoemd. In tegenstelling tot traditionele C-code is OpenCL-kernel geïmplementeerd in de applicatie in een ongecompileerde status. Ze worden on-the-fly (tijdens het draaien van de applicatie) gecompileerd en geoptimaliseerd voor de gebruikershardware voordat het naar de GPU of simultaan naar de CPU wordt gestuurd voor de berekeningen.

## API

Een andere variant op de OpenCL is OpenCL-API. De OpenCL-API zorgt voor functies die toegang geven tot applicaties om parallelle computertaken te beheren. Het somt de openCL-capabele hardware op in een systeem en stelt ze klaar voor gebruik van datastructuren tussen applicaties en OpenCL. Het controleert ook de compilatie en de indiening van kernels naar de GPU. Het heeft ook een rijke set aan functies die wachttijden beheren en ook synchronisatie.

## Runtime

OpenCl Runtime voert taken uit die gevraagd zijn door de applicatie via OpenCL-API. OpenCL Runtime zorgt ook voor de efficiënte transfer van data tussen het hoofdgeheugen en het gewijde VRAM dat gebruikt wordt door de GPU. Op zijn beurt geeft het commando's van de kernel naar de GPU-hardware. Tijdens deze commando's regelt OpenCL Runtime alles.