OpenCL
![]() |
L'article o secció necessita millores quant al seu format. |
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.[1]
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[modifica]
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. [2]
NVIDIA és el primer fabricant a proporcionar drivers OpenCL per a WindowsXP i Linux[3][4]
Publicació de l'edició OpenCL 1.1[5]
Terminologia de l'arquitectura[modifica]
- 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:
#define nucli_suma_vectors(A,B,C,N) { \ \ i = j + id_del_processador; \ // el ''id'' del primer processador és 0 if ( i < N) { \ C[i] = A[i] + B[i]; \ } \ }
- si només hi ha un processador, executarem seqüencialment N vegades el nucli.
for (j = 0; j < N; j++) p0.nucli_suma_vectors(A,B,C,N) ;
- 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.
for (j = 0; j < N; j += nombre_processadors) { || p0.nucli_suma_vectors(A,B,C,N); || p1.nucli_suma_vectors(A,B,C,N); ... || pM.nucli_suma_vectors(A,B,C,N); }
Vegeu l'#Exemple de nucli.
model de plataforma[modifica]
- 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ó[modifica]
- 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[modifica]
Nucli per obtenir la Suma de vectors d'1 dimensió. Vegeu exemple a[6]
__kernel void vec_add (__global const float *a,
__global const float *b,
__global float *c,
__global int iNombreElements)
{
// obtenir l'índex de la primera dimensió (0) de l{{'}}''id-global''
// que li pertoqui a la ''feina elemental''
int gid0 = get_global_id(0);
// si l'índex supera el darrer element, no cal processar
if (gid0 >= iNombreElements) { return ;}
c[gid0] = a[gid0] + b[gid0];
}
Eines per detectar suport OpenCL[modifica]
- GPU-Z[7] de TechPowerUp mostra,[8] en entorn Windows, el suport de les API's de GPU OpenCL, CUDA, PhysX, DirectCompute.
- GPU caps viewer[9]
API's multiplataforma[modifica]
- QtOpenCL[10]
Biblioteques per a altres llenguatges[modifica]
- a Java
- a Scala
- ScalaCL[13] Paquet amb optimització sobre estructures ad hoc ScalaCLCollections
- ScalaCLPlugin[14] Optimitza codi normal per a l'execució a la GPU
- a Haskell
- OpenCLRaw: Ref.[15] 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).[16]
- a Ruby
- Ruby-opencl: Ref.[17]
Biblioteques optimitzades amb OpenCL[modifica]
- ImageMagick[18]
- Codificador x264. Paralel·lització amb OpenCL de la Univ. de Heidelberg.[19]
OpenCL sobre CPU (no GPU)[modifica]
- AMD SDK segons la ref.[20]
Referències[modifica]
- ↑ Especificació d'OpenCL 1.0 (anglès)
- ↑ «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)
- ↑ Khronos.org - Nvidia llança driver OpenCL per a desenvolupadors(anglès)
- ↑ Publicació de l'edició OpenCL 1.1 Arxivat 2010-10-23 a Wayback Machine.(anglès)
- ↑ Centre de supercomputació de Jülisch (Rin nord - Westfalia) - OpenCL[Enllaç no actiu] (anglès)
- ↑ TechPowerUp GPU-Z
- ↑ Gameprotv.com - GPU-Z Arxivat 2016-03-03 a Wayback Machine. (castellà)
- ↑ gpu_caps_viewer(anglès)
- ↑ 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(anglès)
- ↑ Paquet Accelerate del llenguatge Haskell sobre CUDA
- ↑ Ruby-OpenCL Arxivat 2012-11-04 a Wayback Machine.(anglès)
- ↑ ImageMagick - OpenCL(anglès)
- ↑ Parallelization of the x264 encoder using OpenCL(anglès)
- ↑ Developing OpenCL Code with an Intel x86 CPU(anglès)
Enllaços externs[modifica]
- 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.
- Khronos - OpenCL Heterogeneous Parallel Programming Arxivat 2008-11-21 a Wayback Machine. (anglès) Presentació
- Khronos - Fòrum de OpenCL Arxivat 2009-07-03 a Wayback Machine. (anglès)
- Olav Fagerlund - OpenCL - What's in store?[Enllaç no actiu] (anglès)
- SigGraph2008 - OpenCL Parallel Computing on the GPU and CPU Arxivat 2012-02-16 a Wayback Machine. (anglès) Presentació tècnica
Guies
- Nvidia - Introduction to OpenCL (anglès) Presentació en pdf. Seminari en-línia (anglès)
- AMD - Introductory Tutorial to OpenCL Arxivat 2010-01-05 a Wayback Machine. (anglès)
- MacResearch.org - OpenCL tutorials (anglès)
- MulticoreInfo - Parallel Programming Tutorial Series - OpenCL (anglès)
OpenCL a les plataformes
- OpenCL a AMD-ATI Arxivat 2009-05-03 a Wayback Machine. (anglès)
- GPGPU.org - AMD Stream SDK v2.0 suporta CPU's i GPU's Arxivat 2010-11-23 a Wayback Machine.(anglès) Suport per a CPU's de AMD i Intel així com a GPU's de AMD de les dues darreres generacions.
- OpenCL a NVIDIA (anglès) Descàrrega controladors OpenCL
- NVIDIA - OpenCL Guia d'inici ràpid Arxivat 2009-05-20 a Wayback Machine. (anglès) Diferències entre CUDA i OpenCL
- Forum OpenCL a Nvidia
- Instal·lació manual de drivers Nvidia a Linux Ubuntu
- Apple.Desenvolupadors - OpenCL als Mac