OpenCL (Open Computing Language, en espaol lenguaje de computacin abierto) es un estndar
de programacin para propsitos generales en sistemas heterogneos, llmese heterogneo a sistemas computaciones que constan de distintos tipos de arquitecturas tales como procesadores Intel o,AMD, procesadores de tarjetas grficas, FPGA's . Consta de una interfaz de programacin de aplicaciones y de un lenguaje de programacin y esta est basado en lenguaje C, la finalidad de OpenCL es tener un lenguaje comn entre los distintos dispositivos que pueden tener arquitecturas y formas de programacin diferentes entre si y darle as una posibilidad de comunicacin entre ellos, sin tener que saber mucho acerca del dispositivo como tal. Apple cre la especificacin original y fue desarrollada en conjunto con AMD, IBM, Intel y NVIDIA. Apple la propuso al Grupo Khronos para convertirla en un estndar abierto y libre de derechos. Una de las principales ventajas de OpenCL es que permite paralelismo a nivel de datos, con lo cual una simple instruccin puede ser ejecutada a muchos datos de manera simultanea, si no se esta familiarizado con la programacin en paralelo de computadores y la programacin tradicional una forma de ver esto es imaginare los siguiente: Se quiere realizar un calculo matemtico que consiste en sumar 1000 parejas de nmeros, el resultado seria 1000 nmeros con la suma de las parejas de estos nmeros, primero le damos la tarea a un matemtico experto muy hbil en clculos, el sumaria cada pareja de numero y copiara el resultado , luego le damos a la misma tarea a 200 personas personas que tienen una habilidad promedio para las matemticas regular , quien terminara primero? Aunque el experto matemtico fuera mas rpido que cualquier de las dems 200 personas en un solo calculo, tiene que hacer 1000 sumas y escribir el resultado, en cambio las 200 personas solo tiene que realizar 5 sumas y escribir su resultado que se hara en forma simultanea o paralela. El experto matemtico hbil seria equivalente a tener un gran procesador mono ncleo, capaz de hacer clculos muy rpido pero de manera secuencial, las 200 personas serian pequeos procesadores que no tienen tanto poder de calculo pero trabajan de manera simultanea. Si lo desean poden visitar el siguinte enlace http://www.youtube.com/watch?v=fKK933KK6Gg El anterior prrafo pone en evidencia las ventajas de poder programar con cierto nivel de paralelismo y una de las mejores formas de poder realizar eso consiste en la utilizacin de tarjetas grficas (GPU graphics processing unit ); aunque estas fueron diseadas mas que todo para videojuegos y procesamiento de vdeos o imgenes, la arquitectura de las tarjetas de vdeo generalmente cuentan con muchos procesadores (80, 200, 1000 o mas), cada uno de ellos es pequeo y no tiene tanto poder de calculo, pero al trabajar juntos como en el ejemplo anterior pueden obtener en muchas ocasiones ventaja sobre otro tipo de procesadores mas grandes en poder pero no tan numerosos. OpenCL al trabajar en sistemas heterogneos es capaz de trabajar sobre las GPU's al igual que procesadores tradicionales de los computadores, el cual seria complicado de hacer al no tener las herramientas adecuadas o al no saber como es el funcionamiento de una especifica tarjeta o configuracin. Aunque hay entornos tales como CUDA que permiten hacer los mismo sobre las tarjetas de vdeo, CUDA esta restringido solo a tarjetas de la marca NVIDIA, OpenCL puede ejecutarse en
cualquier tipo que sea compatible.
Otra ventaja de OpenCL es que provee de nos tipos especiales de datos con los cuales puede pasar estos datos a travs de diferentes dispositivos que muy a menudo tienen tipos de datos diferentes y poder realizar operaciones con ellos y esto nos lleva tambin a su portabilidad de cdigo pues no se necesita generar un nuevo cdigo para trabajar en diferentes arquitecturas tales como AMD o Intel, NVIDIA o ATI, Linux, Windows o MACOS , sino que el mismo cdigo sirve en todas. Para la instalacin de OpenCL es necesario primero comprobar que el hardware es compatible con este, por lo general las tarjetas de vdeo AMD ATI o Nvidia desde hace aos ya son compatibles, las tarjetas de vdeo Intel solo en las nuevas versiones. Cada fabricante da un SDK (software development kit) para sus dispositivos y los driver necesarios para este. Por ejemplo para AMD ATI tenemos el AMD APP (accelerated parallel processing) SDK y los driver son proporcionados en la misma pagina de AMD En OpenCL los procesos computacionales son llamados devices (dispositivos). Un device puede tener uno o mas unidades de computo. Los programas que corren en paralelo en estos device se llaman kernels, y su invocacin es llamada work item y da una identificacin (ID) al trabajo, las Ids son organizadas den una o 3 dimensiones llamadas N-D range. Un kernel es esencialmente una funcin escrita en OpenCL que permite ser compilada para ser ejecutada en uno de los devices que soporta OpenCL, los kernels son puestos en cola por la ejecucin de la aplicacin escrita en C o C++. El kernel debe ser compilado separadamente para ser configurado para el device donde va a correr. Como se a visto OpenCL es una gran herramienta para el desarrollo de aplicaciones que necesiten correr den varios tipos de dispositivos y provee un medio para aumentar la rapidez de ejecucin de las aplicaciones tan til en mucho campos como es el caso de la computacin cientfica