OpenCL


OpenCL ( Open Computing Language ) es un marco para escribir programas que se ejecutan en plataformas heterogéneas que consisten en unidades de procesamiento central (CPU), unidades de procesamiento de gráficos (GPU), procesadores de señales digitales (DSP), arreglos de puertas programables en campo (FPGA) y otros procesadores o aceleradores de hardware . OpenCL especifica lenguajes de programación (basados ​​en C99 , C ++ 14 y C ++ 17 ) para programar estos dispositivos e interfaces de programación de aplicaciones(API) para controlar la plataforma y ejecutar programas en los dispositivos informáticos . OpenCL proporciona una interfaz estándar para la computación paralela utilizando el paralelismo basado en tareas y datos .

OpenCL es un estándar abierto mantenido por el consorcio tecnológico sin fines de lucro Khronos Group . Las implementaciones compatibles están disponibles en Altera , AMD , ARM , Creative , IBM , Imagination , Intel , Nvidia , Qualcomm , Samsung , Vivante , Xilinx y ZiiLABS . [8] [9]

OpenCL considera que un sistema informático consta de varios dispositivos informáticos , que pueden ser unidades de procesamiento central (CPU) o "aceleradores", como unidades de procesamiento de gráficos (GPU), conectados a un procesador host (una CPU). Define un lenguaje similar a C para escribir programas. Las funciones que se ejecutan en un dispositivo OpenCL se denominan " núcleos ". [10] : 17  Un solo dispositivo informático generalmente consta de varias unidades informáticas , que a su vez comprenden varios elementos de procesamiento(PE). Una única ejecución de kernel puede ejecutarse en todos o en muchos de los PE en paralelo. Cómo se subdivide un dispositivo informático en unidades informáticas y PE depende del proveedor; una unidad de cómputo puede considerarse como un " núcleo ", pero la noción de núcleo es difícil de definir en todos los tipos de dispositivos admitidos por OpenCL (o incluso dentro de la categoría de "CPU"), [11] : 49–50  y el número de unidades de cómputo puede no corresponder con el número de núcleos reclamados en la literatura de marketing de los proveedores (que en realidad puede estar contando carriles SIMD ). [12]

Además de su lenguaje de programación similar a C, OpenCL define una interfaz de programación de aplicaciones (API) que permite que los programas que se ejecutan en el host inicien kernels en los dispositivos informáticos y administren la memoria del dispositivo, que está (al menos conceptualmente) separada de la memoria del host. Los programas en el lenguaje OpenCL están pensados ​​para ser compilados en tiempo de ejecución , de modo que las aplicaciones que usan OpenCL sean portables entre implementaciones para varios dispositivos host. [13] El estándar OpenCL define las API de host para C y C ++ ; Existen API de terceros para otros lenguajes de programación y plataformas como Python , [14] Java , Perl , [15] D [16] y .NET . [11] : 15  Una implementación del estándar OpenCL consiste en una biblioteca que implementa la API para C y C ++, y un compilador OpenCL C para los dispositivos de cómputo objetivo.

Para abrir el modelo de programación OpenCL a otros lenguajes o para proteger la fuente del kernel de la inspección, la Representación Intermedia Portátil Estándar (SPIR) [17] se puede utilizar como una forma independiente de destino para enviar kernels entre un compilador de front-end y el back-end de OpenCL.

Más recientemente , Khronos Group ha ratificado SYCL , [18] un modelo de programación de nivel superior para OpenCL como un DSEL de fuente única basado en C ++ 17 puro para mejorar la productividad de la programación . Además de eso, las características de C ++ también se pueden usar al implementar fuentes de kernel de cómputo en C ++ para el lenguaje OpenCL. [19]


Cada invocación ( elemento de trabajo ) del kernel toma una fila de la matriz verde ( A en el código), multiplica esta fila con el vector rojo ( x ) y coloca el resultado en una entrada del vector azul ( y ). El número de columnas n se pasa al kernel como ncols ; el número de filas está implícito en el número de elementos de trabajo producidos por el programa anfitrión.
El Taller Internacional sobre OpenCL (IWOCL) realizado por el Grupo Khronos
clinfo, una herramienta de línea de comandos para ver información de OpenCL