# OpenCL

* No s'ha de confondre amb OpenGL.
Open Computing Language (OpenCL) és un framework per a programes d'escriptura que s'executa mitjançant plataformes heterogènies consistents en unitats centrals de processament (CPU), unitats de procés gràfic (GPUs), processadors de senyals digitals (DSP), FPGAs i altres processadors o acceleradors de hardware.
OpenCL és un estàndard obert i lliure de royalties, per a la programació paral·lela de CPU's, GPU's i altres processadors, a fi i efecte de proporcionar als desenvolupadors l'accés portable i eficient a la potència d'aquestes plataformes de procés heterogènies.
OpenCL admet una extensa gamma d'aplicacions, des de sistemes encastats, passant per aplicacions per al consumidor fins a solucions HPC (acrònim de Computació d'Alt Rendiment, també anomenada supercomputació).
OpenCL consisteix en una API per coordinar la computació paral·lela entre processadors heterogenis, i a més un llenguatge multiplataforma i una especificació de l'entorn de computació.
* Suporta ambdós models de programació paral·lela, el basat en dades i el basat en tasques.
* Utilitza un subconjunt del llenguatge C en la versió del 1999 C99 amb extensions per al paral·lelisme.
* Defineix requeriments numèrics basats en l'estàndard IEEE 754.
* Defineix un perfil de configuració per a dispositius de mà (PDA,..) i sistemes encastats.
* Interacciona eficientment amb API's gràfiques com OpenGL, OpenGL ES i altres.

## Història

OpenCL va ser concebut inicialment per Apple, que en reté els drets comercials, i adreçat als equips tècnics de AMD, Intel i Nvidia. Apple va sotmetre també aquesta proposta a l'impulsor de l'estàndard gràfic OpenGL, el Grup Khronos.
El 16 de juny del 2008 es va formar el Grup de Treball Khronos Computació amb representants de CPU's, GPU's, sistemes incrustats i companyies de programari i va donar lloc a l'especificació OpenCL 1.0 que després de revisada va ser aprovada el 8 de desembre del 2008.
NVIDIA és el primer fabricant a proporcionar drivers OpenCL per a WindowsXP i Linux
Publicació de l'edició OpenCL 1.1

## Terminologia de l'arquitectura
### Nucli (kernel)

    Per paral·lelitzar una iteració, se'n pren el nucli, se l'enclou en una funció de les estructures (vectors o matrius) i variables que hi intervenen, i s'hi afegeix l'obtenció de l'índex que la GPU assigni al processador elemental on s'executin.
    Dit d'altra manera: Procés o operació sobre elements individuals de les estructures dels operands, equivalent al nucli d'una iteració, que s'executarà en paral·lel per a cadascun dels elements als múltiples Processadors elementals de la GPU.
Visualització figurativa:
   * si només hi ha un processador, executarem seqüencialment N vegades el nucli.
   * si en tenim un grapat, el sistema enviarà el nucli a cadascun dels processadors, requerint-ne l'execució (N / # processadors) vegades. A la darrera alguns processadors obtindran índexs superiors a N i és per això que hi ha la guarda.
Vegeu l'#Exemple de nucli.

### model de plataforma
#### host

    ord. amfitrió, conté 1 o més Dispositius OpenCL

#### dispositiu OpenCL (Compute device)

    conté una o més Unitats de computació. Té accés a una memòria global.

#### unitat de computació (Compute unit)

    conté un o més processadors elementals. Disposa d'una memòria local compartida entre els P.E. de la unitat. Pot processar una feina-agrupada.

#### processador elemental (Process element)

    processa feines elementals. Disposa d'una memòria privada per a les variables locals de la funció nucli.

### model d'execució
#### objectes de programa

    dades en memòria que contenen la funció nucli en codi font, compilat al vol (ang:just-in-time) o precompilat.

#### objectes de memòria N-dimensionals

    operands de la funció nucli que poden ser tractats com a vector, matriu o estructura N-dimensional.

#### Rang N-dimensional (NDRange)

    espai N-dimensional dels índexs a les estructures dels operands.

#### Identificador global (global-id)

    N-tupla d'índexs que identifica els elements individuals (en les estructures N-dimensionals dels operands) que intervenen en una computació (feina elemental)

#### feina elemental (work-item)

    una instància de les execucions de la funció nucli en un processador elemental, sobre els elements resultants d'indexar els operands amb un identificador global.

#### feina agrupada (work-group)

    conjunt de feines elementals que s'executen dins una mateixa unitat de computació i comparteixen una memòria local. Les feines elementals s'hi caracteritzen per un identificador de grup i un identificador local.

## Exemple de nucli

Nucli per obtenir la Suma de vectors d'1 dimensió. Vegeu exemple a

## Eines per detectar suport OpenCL

* GPU-Z de TechPowerUp mostra, en entorn Windows, el suport de les API's de GPU OpenCL, CUDA, PhysX, DirectCompute.
* GPU caps viewer

## API's multiplataforma

* QtOpenCL

## Biblioteques per a altres llenguatges
### a Java

* JavaCL
* Aparapi Biblio. de AMD d'interfície OpenCL per al lleng. Java

### a Scala

* ScalaCL Paquet amb optimització sobre estructures ad hoc ScalaCLCollections
* ScalaCLPlugin Optimitza codi normal per a l'execució a la GPU

### a Haskell

* OpenCLRaw: Ref. Cal modificar-ne les dependències dels paquets.
* Accelerate: llenguatge DSL (Domain Specific Language: específic per al camp d'aplicació) que compila directament codi Haskell a nuclis de GPU (de moment amb rerefons CPU i CUDA).

### a Ruby

* Ruby-opencl: Ref.

## Biblioteques optimitzades amb OpenCL

* ImageMagick
* Codificador x264. Paralel·lització amb OpenCL de la Univ. de Heidelberg.

## OpenCL sobre CPU (no GPU)

* AMD SDK segons la ref.

## Referències

* ↑ «Khronos OpenCL Registry - The Khronos Group Inc». [Consulta: 20 desembre 2023].
* ↑ «The Khronos Group Releases OpenCL 1.0 Specification». Khronos Group, 08-12-2008. Arxivat de l'original el 2010-07-13. [Consulta: 10 gener 2009].
* ↑ HPC-Wire - Nvidia llança drivers OpenCL per a WindowsXP i Linux Arxivat 2009-06-29 a Wayback Machine.(anglès)
* ↑ «The Khronos Group» (en anglès), 20-12-2023. [Consulta: 20 desembre 2023].
* ↑ Publicació de l'edició OpenCL 1.1 Arxivat 2010-10-23 a Wayback Machine.(anglès)
* ↑ «Jülich Supercomputing Centre (JSC)». [Consulta: 20 desembre 2023].
* ↑ TechPowerUp GPU-Z
* ↑ «Tech Advisor - Inicio» (en castellà). [Consulta: 20 desembre 2023].
* ↑ «GPU Caps Viewer: Graphics card and GPU information utility, OpenGL, OpenCL and CUDA API support, NVIDIA GeForce, ATI Radeon | oZone3D.Net». [Consulta: 20 desembre 2023].
* ↑ Using OpenCL with Qt Arxivat 2010-10-15 a Wayback Machine.(anglès)
* ↑ JavaCL(anglès)
* ↑ AMD Aparapi Arxivat 2011-08-04 a Wayback Machine.(anglès)
* ↑ ScalaCL(anglès)
* ↑ ScalaCLPlugin
* ↑ «OpenCLRaw». [Consulta: 20 desembre 2023].
* ↑ Paquet Accelerate del llenguatge Haskell sobre CUDA
* ↑ Ruby-OpenCL Arxivat 2012-11-04 a Wayback Machine.(anglès)
* ↑ LLC, ImageMagick Studio. «ImageMagick» (en anglès). [Consulta: 20 desembre 2023].
* ↑ Parallelization of the x264 encoder using OpenCL(anglès)
* ↑ «Andrew Cooke: C[ompute]». [Consulta: 20 desembre 2023].

## Enllaços externs

* Pàgina inicial de OpenCL (anglès)
* Khronos - OpenCL API 1.0 Quick reference card (anglès) Targeta de referència ràpida de l'API d'OpenCL.
* Nvidia - Introduction to OpenCL (anglès)