OpenCL

De Viquipèdia
Dreceres ràpides: navegació, cerca


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 suporta un extens rang 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 | modifica el codi]

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 | modifica el codi]

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 | modifica el codi]

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 | modifica el codi]

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 | modifica el codi]

Nucli per obtenir la Suma de vectors de 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 | modifica el codi]

API's multiplataforma[modifica | modifica el codi]

Biblioteques per a altres llenguatges[modifica | modifica el codi]

a Java
  • JavaCL[11]
  • Aparapi[12] Biblio. de AMD d'interfície OpenCL per al lleng. 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 | modifica el codi]

OpenCL sobre CPU (no GPU)[modifica | modifica el codi]

  • AMD SDK segons la ref.[21]

Referències[modifica | modifica el codi]

  1. Especificació d'OpenCL 1.0 (anglès)
  2. «The Khronos Group Releases OpenCL 1.0 Specification». Khronos Group, 2008-12-08.
  3. HPC-Wire - Nvidia llança drivers OpenCL per a WindowsXP i Linux(anglès)
  4. Khronos.org - Nvidia llança driver OpenCL per a desenvolupadors(anglès)
  5. Publicació de l'edició OpenCL 1.1(anglès)
  6. Centre de supercomputació de Jülisch (Rin nord - Westfalia) - OpenCL (anglès)
  7. TechPowerUp GPU-Z
  8. Gameprotv.com - GPU-Z (castellà)
  9. gpu_caps_viewer(anglès)
  10. Using OpenCL with Qt(anglès)
  11. JavaCL(anglès)
  12. AMD Aparapi(anglès)
  13. ScalaCL(anglès)
  14. ScalaCLPlugin
  15. OpenCLRaw(anglès)
  16. Paquet Accelerate del llenguatge Haskell sobre CUDA
  17. Ruby-OpenCL(anglès)
  18. ImageMagick - OpenCL(anglès)
  19. x264 a la viqui anglesa(anglès)
  20. Parallelization of the x264 encoder using OpenCL(anglès)
  21. Developing OpenCL Code with an Intel x86 CPU(anglès)

Enllaços externs[modifica | modifica el codi]

Guies

OpenCL a les plataformes