Vés al contingut

OpenCL: diferència entre les revisions

De la Viquipèdia, l'enciclopèdia lliure
Contingut suprimit Contingut afegit
redueixo enllaços
retocs #QQ23
Línia 1: Línia 1:
{{confusió|OpenGL}}
{{confusió|OpenGL}}
[[File:Matrix multiplication qtl5.svg|thumb|Cada invocació (''work-item'') del nucli pren una fila de la matriu verda ({{mono|A}} al codi), multiplica aquesta fila amb el vector vermell ({{mono|x}}) i col·loca el resultat en una entrada del vector blau ({{mono|y}}). El nombre de columnes {{mvar|n}} es passa al nucli com a {{mono|ncols}}; el nombre de files està implícit en el nombre d'elements de treball produïts pel programa amfitrió.]]
{{MF|data=2014}}
'''Open Computing Language''' ('''OpenCL''') és un [[framework]] per a programes d'escriptura que s'executa mitjançant plataformes [[Computació heterogènia|heterogènies]] consistents en [[Unitat central de processament|unitats centrals de processament]] (CPU), [[Unitat de procés gràfic|unitats de procés gràfic]] (GPUs), [[Processador de senyals digitals|processadors de senyals digitals]] (DSP), [[FPGA]]s i altres processadors o [[Accelerador de hardware|acceleradors de hardware]].
'''Open Computing Language''' ('''OpenCL''') és un [[framework]] per a programes d'escriptura que s'executa mitjançant plataformes [[Computació heterogènia|heterogènies]] consistents en [[Unitat central de processament|unitats centrals de processament]] (CPU), [[Unitat de procés gràfic|unitats de procés gràfic]] (GPUs), [[Processador de senyals digitals|processadors de senyals digitals]] (DSP), [[FPGA]]s i altres processadors o [[Accelerador de hardware|acceleradors de hardware]].


OpenCL és un estàndard obert i lliure de ''[[royalty|royalties]]'', per a la programació paral·lela de [[CPU]]'s, [[GPU]]'s i altres [[processador]]s, 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.<ref>[http://www.khronos.org/registry/cl/specs/opencl-1.0.29.pdf Especificació d'OpenCL 1.0] {{en}}</ref>
OpenCL és un estàndard obert i lliure de ''[[royalty|royalties]]'', per a la programació paral·lela de [[CPU]]'s, [[GPU]]'s i altres [[processador]]s, 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.<ref>{{Ref-web|títol=Khronos OpenCL Registry - The Khronos Group Inc|url=https://registry.khronos.org/OpenCL/|consulta=2023-12-20}}</ref>


OpenCL admet una extensa gamma d'aplicacions, des de [[sistema incrustat|sistemes encastats]], passant per aplicacions per al consumidor fins a solucions HPC ([[acrònim]] de Computació d'Alt Rendiment, també anomenada [[Supercomputador|supercomputació]]).
OpenCL admet una extensa gamma d'aplicacions, des de [[sistema incrustat|sistemes encastats]], passant per aplicacions per al consumidor fins a solucions HPC ([[acrònim]] de Computació d'Alt Rendiment, també anomenada [[Supercomputador|supercomputació]]).
Línia 18: Línia 18:
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]].
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]].
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]].<ref name=khronosGroup>{{ref-web
<ref name=khronosGroup>{{ref-web
|url=http://www.khronos.org/news/press/releases/the_khronos_group_releases_opencl_1.0_specification/
|url=http://www.khronos.org/news/press/releases/the_khronos_group_releases_opencl_1.0_specification/
|títol=The Khronos Group Releases OpenCL 1.0 Specification
|títol=The Khronos Group Releases OpenCL 1.0 Specification
Línia 29: Línia 28:
}}</ref>
}}</ref>


[[NVIDIA]] és el primer fabricant a proporcionar drivers OpenCL per a [[Windows|WindowsXP]] i [[Linux]]<ref>[http://www.hpcwire.com/topic/developertools/NVIDIA-Releases-OpenCL-Drivers-for-XP-and-Linux-48258812.html HPC-Wire - Nvidia llança drivers OpenCL per a WindowsXP i Linux] {{Webarchive|url=https://web.archive.org/web/20090629133037/http://www.hpcwire.com/topic/developertools/NVIDIA-Releases-OpenCL-Drivers-for-XP-and-Linux-48258812.html |date=2009-06-29}}{{en}}</ref><ref>[http://www.khronos.org/news/permalink/nvidia_releases_opencl_driver_to_developers/ Khronos.org - Nvidia llança driver OpenCL per a desenvolupadors]{{en}}</ref>
[[NVIDIA]] és el primer fabricant a proporcionar drivers OpenCL per a [[Windows|WindowsXP]] i [[Linux]]<ref>[http://www.hpcwire.com/topic/developertools/NVIDIA-Releases-OpenCL-Drivers-for-XP-and-Linux-48258812.html HPC-Wire - Nvidia llança drivers OpenCL per a WindowsXP i Linux] {{Webarchive|url=https://web.archive.org/web/20090629133037/http://www.hpcwire.com/topic/developertools/NVIDIA-Releases-OpenCL-Drivers-for-XP-and-Linux-48258812.html |date=2009-06-29}}{{en}}</ref><ref>{{Ref-web|títol=The Khronos Group|url=https://www.khronos.org/news/permalink/nvidia_releases_opencl_driver_to_developers|data=2023-12-20|consulta=2023-12-20|llengua=en}}</ref>


Publicació de l'edició OpenCL 1.1<ref>[http://gpgpu.org/2010/06/18/opencl-1-1-released Publicació de l'edició OpenCL 1.1] {{Webarchive|url=https://web.archive.org/web/20101023193625/http://gpgpu.org/2010/06/18/opencl-1-1-released |date=2010-10-23}}{{en}}</ref>
Publicació de l'edició OpenCL 1.1<ref>[http://gpgpu.org/2010/06/18/opencl-1-1-released Publicació de l'edició OpenCL 1.1] {{Webarchive|url=https://web.archive.org/web/20101023193625/http://gpgpu.org/2010/06/18/opencl-1-1-released |date=2010-10-23}}{{en}}</ref>
Línia 87: Línia 86:


== Exemple de nucli ==
== Exemple de nucli ==
Nucli per obtenir la Suma de vectors d'1 dimensió. Vegeu exemple a<ref>[http://www.fz-juelich.de/jsc/datapool/cell/OpenCL_for-eQPACE.pdf Centre de supercomputació de Jülisch (Rin nord - Westfalia) - OpenCL]{{Enllaç no actiu|bot=InternetArchiveBot |data=2021}} {{en}}</ref>
Nucli per obtenir la Suma de vectors d'1 dimensió. Vegeu exemple a<ref>{{Ref-web|títol=Jülich Supercomputing Centre (JSC)|url=https://www.fz-juelich.de/en/ias/jsc|consulta=2023-12-20}}</ref>


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Línia 109: Línia 108:


== Eines per detectar suport OpenCL ==
== Eines per detectar suport OpenCL ==
* GPU-Z<ref>[http://www.techpowerup.com/downloads/ TechPowerUp GPU-Z]</ref> de TechPowerUp mostra,<ref>[http://www.gameprotv.com/foro/viewtopic.php?p=1739019&t=1739019 Gameprotv.com - GPU-Z] {{Webarchive|url=https://web.archive.org/web/20160303173156/http://www.gameprotv.com/foro/viewtopic.php?p=1739019&t=1739019 |date=2016-03-03}} {{es}}</ref> en entorn Windows, el suport de les [[API]]'s de [[GPU]] OpenCL, [[CUDA]], [[PhysX]], [[DirectCompute]].
* GPU-Z<ref>[http://www.techpowerup.com/downloads/ TechPowerUp GPU-Z]</ref> de TechPowerUp mostra,<ref>{{Ref-web|títol=Tech Advisor - Inicio|url=https://www.techadvisor.com/es-es|consulta=2023-12-20|llengua=es}}</ref> en entorn Windows, el suport de les [[API]]'s de [[GPU]] OpenCL, [[CUDA]], [[PhysX]], [[DirectCompute]].
* GPU caps viewer<ref>[http://www.ozone3d.net/gpu_caps_viewer/index.php#intro gpu_caps_viewer]{{en}}</ref>
* GPU caps viewer<ref>{{Ref-web|títol=GPU Caps Viewer: Graphics card and GPU information utility, OpenGL, OpenCL and CUDA API support, NVIDIA GeForce, ATI Radeon {{!}} oZone3D.Net|url=http://www.ozone3d.net/gpu_caps_viewer/index.php#intro|consulta=2023-12-20}}</ref>


== API's multiplataforma ==
== API's multiplataforma ==
Línia 128: Línia 127:
; a [[Haskell]]
; a [[Haskell]]


* OpenCLRaw: Ref.<ref>[http://hackage.haskell.org/package/OpenCLRaw OpenCLRaw]{{en}}</ref> Cal modificar-ne les dependències dels paquets.
* OpenCLRaw: Ref.<ref>{{Ref-web|títol=OpenCLRaw|url=http://hackage.haskell.org/package/OpenCLRaw|consulta=2023-12-20}}</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]]).<ref>[http://hackage.haskell.org/package/accelerate Paquet ''Accelerate'' del llenguatge Haskell sobre CUDA]</ref>
* 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]]).<ref>[http://hackage.haskell.org/package/accelerate Paquet ''Accelerate'' del llenguatge Haskell sobre CUDA]</ref>


Línia 136: Línia 135:


== Biblioteques optimitzades amb OpenCL ==
== Biblioteques optimitzades amb OpenCL ==
* ImageMagick<ref>[http://www.imagemagick.org/script/architecture.php?ImageMagick=qrtog4cvd8p4a326cd6dfct9v6#distributed ImageMagick - OpenCL]{{en}}</ref>
* ImageMagick<ref>{{Ref-web|títol=ImageMagick|url=https://imagemagick.org/|consulta=2023-12-20|llengua=en|nom=ImageMagick Studio|cognom=LLC}}</ref>
* Codificador x264. Paralel·lització amb OpenCL de la Univ. de [[Heidelberg]].<ref>[http://li5.ziti.uni-heidelberg.de/x264gpu/ Parallelization of the x264 encoder using OpenCL]{{en}}</ref>
* Codificador x264. Paralel·lització amb OpenCL de la Univ. de [[Heidelberg]].<ref>[http://li5.ziti.uni-heidelberg.de/x264gpu/ Parallelization of the x264 encoder using OpenCL]{{en}}</ref>


== OpenCL sobre [[CPU]] (no [[GPU]]) ==
== OpenCL sobre [[CPU]] (no [[GPU]]) ==
* AMD SDK segons la ref.<ref>[http://www.acooke.org/cute/Developing0.html Developing OpenCL Code with an Intel x86 CPU]{{en}}</ref>
* AMD SDK segons la ref.<ref>{{Ref-web|títol=Andrew Cooke: C[omp]ute|url=https://www.acooke.org/cute/Developing0.html|consulta=2023-12-20}}</ref>


== Referències ==
== Referències ==

Revisió del 19:00, 20 des 2023

No s'ha de confondre amb OpenGL.
Cada invocació (work-item) del nucli pren una fila de la matriu verda (A al codi), multiplica aquesta fila amb el vector vermell (x) i col·loca el resultat en una entrada del vector blau (y). El nombre de columnes n es passa al nucli com a ncols; el nombre de files està implícit en el nombre d'elements de treball produïts pel programa amfitrió.

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

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

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

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[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

API's multiplataforma

Biblioteques per a altres llenguatges

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

  • ImageMagick[18]
  • Codificador x264. Paralel·lització amb OpenCL de la Univ. de Heidelberg.[19]

OpenCL sobre CPU (no GPU)

  • AMD SDK segons la ref.[20]

Referències

  1. «Khronos OpenCL Registry - The Khronos Group Inc». [Consulta: 20 desembre 2023].
  2. «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].
  3. HPC-Wire - Nvidia llança drivers OpenCL per a WindowsXP i Linux Arxivat 2009-06-29 a Wayback Machine.(anglès)
  4. «The Khronos Group» (en anglès), 20-12-2023. [Consulta: 20 desembre 2023].
  5. Publicació de l'edició OpenCL 1.1 Arxivat 2010-10-23 a Wayback Machine.(anglès)
  6. «Jülich Supercomputing Centre (JSC)». [Consulta: 20 desembre 2023].
  7. TechPowerUp GPU-Z
  8. «Tech Advisor - Inicio» (en castellà). [Consulta: 20 desembre 2023].
  9. «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].
  10. Using OpenCL with Qt Arxivat 2010-10-15 a Wayback Machine.(anglès)
  11. JavaCL(anglès)
  12. AMD Aparapi Arxivat 2011-08-04 a Wayback Machine.(anglès)
  13. ScalaCL(anglès)
  14. ScalaCLPlugin
  15. «OpenCLRaw». [Consulta: 20 desembre 2023].
  16. Paquet Accelerate del llenguatge Haskell sobre CUDA
  17. Ruby-OpenCL Arxivat 2012-11-04 a Wayback Machine.(anglès)
  18. LLC, ImageMagick Studio. «ImageMagick» (en anglès). [Consulta: 20 desembre 2023].
  19. Parallelization of the x264 encoder using OpenCL(anglès)
  20. «Andrew Cooke: C[ompute]». [Consulta: 20 desembre 2023].

Enllaços externs