OpenCL considera que un sistema informático consta de varios dispositivos informáticos , que pueden ser unidades centrales de procesamiento (CPU) o "aceleradores", como unidades de procesamiento de gráficos (GPU), conectados a un procesador host (una CPU). Define un lenguaje tipo C para escribir programas. Las funciones ejecutadas en un dispositivo OpenCL se denominan " kernels ". [10] : 17 Un único dispositivo informático normalmente consta de varias unidades informáticas , que a su vez comprenden múltiples elementos de procesamiento (PE). Una única ejecución del kernel puede ejecutarse en todos o en muchos de los PE en paralelo. La forma en que 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 compatibles con OpenCL (o incluso dentro de la categoría de "CPU"), [11] : 49–50 y la cantidad de unidades de cómputo puede no corresponderse con la cantidad de núcleos que se afirma en la literatura de marketing de los proveedores (que en realidad pueden estar contando carriles SIMD ). [12]
Además de su lenguaje de programación tipo 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 compilarse en tiempo de ejecución , de modo que las aplicaciones que utilizan OpenCL sean portátiles 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 y plataformas de programación como Python , [14] Java , Perl , [15] D [16] y .NET . [11] : 15 Una implementación del estándar OpenCL consta de una biblioteca que implementa la API para C y C++, y un compilador OpenCL C para los dispositivos informáticos de destino.
Para abrir el modelo de programación OpenCL a otros lenguajes o para proteger el código fuente del kernel de la inspección, la Representación Intermedia Portátil Estándar (SPIR) [17] se puede utilizar como una forma independiente del destino para enviar kernels entre un compilador 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 eDSL de fuente única basado en C++17 puro para mejorar la productividad de la programación . Las personas interesadas en los kernels de C++ pero no en el estilo de programación de fuente única SYCL pueden usar las funciones de C++ con fuentes de kernel de cálculo escritas en el lenguaje "C++ para OpenCL". [19]
memoria global: compartida por todos los elementos de procesamiento, pero tiene una alta latencia de acceso ( __global );
memoria de solo lectura: más pequeña, de baja latencia, escribible por la CPU del host pero no por los dispositivos informáticos ( __constant );
memoria local: compartida por un grupo de elementos de procesamiento ( __local );
Memoria privada por elemento ( registros ; __private ).
No todos los dispositivos necesitan implementar cada nivel de esta jerarquía en el hardware. La coherencia entre los distintos niveles de la jerarquía es relajada y sólo se impone mediante constructos de sincronización explícitos , en particular barreras .
Los dispositivos pueden compartir o no memoria con la CPU del host. [13] La API del host proporciona identificadores de los buffers de memoria del dispositivo y funciones para transferir datos de un lado a otro entre el host y los dispositivos.
OpenCL C se amplía para facilitar el uso del paralelismo con tipos y operaciones de vectores, sincronización y funciones para trabajar con elementos de trabajo y grupos de trabajo. [21] En particular, además de los tipos escalares como float y double , que se comportan de manera similar a los tipos correspondientes en C, OpenCL proporciona tipos vectoriales de longitud fija como float4 (4 vectores de flotantes de precisión simple); Estos tipos de vectores están disponibles en longitudes dos, tres, cuatro, ocho y dieciséis para varios tipos de bases. [20] : § 6.1.2 Las operaciones vectorizadas en estos tipos están destinadas a asignarse a conjuntos de instrucciones SIMD , por ejemplo, SSE o VMX , cuando se ejecutan programas OpenCL en CPU. [13] Otros tipos especializados incluyen tipos de imágenes en 2D y 3D. [20] : 10-11
Ejemplo: multiplicación de matrices y vectores
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 núcleo como ncols ; el número de filas está implícito en el número de elementos de trabajo producidos por el programa anfitrión.
// Multiplica A*x, dejando el resultado en y. // A es una matriz de fila principal, lo que significa que el elemento (i,j) está en A[i*ncols+j]. __kernel void matvec ( __global const float * A , __global const float * x , uint ncols , __global float * y ) { size_t i = get_global_id ( 0 ); // ID global, utilizado como índice de fila __global float const * a = & A [ i * ncols ]; // Puntero a la i-ésima fila suma flotante = 0.f ; // Acumulador para producto escalar for ( size_t j = 0 ; j < ncols ; j ++ ) { sum += a [ j ] * x [ j ]; } y [ i ] = suma ; }
La función del núcleo matvec calcula, en cada invocación, el producto escalar de una sola fila de una matriz A y un vector x :
Para extender esto a una multiplicación completa de matriz-vector, el tiempo de ejecución de OpenCL asigna el núcleo a las filas de la matriz. En el lado del host, la función clEnqueueNDRangeKernel hace esto; toma como argumentos el núcleo a ejecutar, sus argumentos y una cantidad de elementos de trabajo, correspondientes a la cantidad de filas en la matriz A.
Ejemplo: calcular la FFT
Este ejemplo cargará una implementación de transformada rápida de Fourier (FFT) y la ejecutará. La implementación se muestra a continuación. [22] El código solicita a la biblioteca OpenCL la primera tarjeta gráfica disponible, crea buffers de memoria para lectura y escritura (desde la perspectiva de la tarjeta gráfica), compila JIT el kernel FFT y finalmente ejecuta el kernel de forma asincrónica. El resultado de la transformación no se lee en este ejemplo.
#incluir <stdio.h>#incluir <hora.h>#incluir "CL/opencl.h"#definir NUM_ENTRIES 1024int principal () // (int argc, const char* argv[]){// CONSTANTES// El código fuente del kernel se representa como una cadena// ubicado dentro del archivo: "fft1D_1024_kernel_src.cl". Para obtener más detalles, consulte el siguiente listado.carácter constante * Fuente del núcleo =#incluye "fft1D_1024_kernel_src.cl";//Buscando las GPU disponiblesconst cl_uint número = 1 ;clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , 0 , NULL , ( cl_uint * ) y num );cl_device_id dispositivos [ 1 ];clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , núm , dispositivos , NULL );// crear un contexto informático con el dispositivo GPUcontexto cl_context = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL );// crear una cola de comandosclGetDeviceIDs ( NULL , CL_DEVICE_TYPE_DEFAULT , 1 , dispositivos , NULL );cola cl_command_queue = clCreateCommandQueue ( contexto , dispositivos [ 0 ], 0 , NULL );// asigna los objetos de memoria intermediacl_mem memobjs [] = { clCreateBuffer ( contexto , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , tamaño de ( flotante ) * 2 * NUM_ENTRIES , NULL , NULL ),clCreateBuffer ( contexto , CL_MEM_READ_WRITE , tamaño de ( flotante ) * 2 * NUM_ENTRIES , NULL , NULL ) };// crear el programa de computación// const char* fft1D_1024_kernel_src[1] = { };cl_program programa = clCreateProgramWithSource ( contexto , 1 , ( const char ** ) & KernelSource , NULL , NULL );// construye el ejecutable del programa informáticoclBuildProgram ( programa , 0 , NULL , NULL , NULL , NULL );// crear el kernel de cálculokernel cl_kernel = clCreateKernel ( programa , "fft1D_1024" , NULL );// establece los valores de los argumentostamaño_t tamaño_trabajo_local [ 1 ] = { 256 };clSetKernelArg ( núcleo , 0 , tamaño de ( cl_mem ), ( void * ) & memobjs [ 0 ]);clSetKernelArg ( núcleo , 1 , tamaño de ( cl_mem ), ( void * ) y memobjs [ 1 ]);clSetKernelArg ( núcleo , 2 , tamaño de ( flotante ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );clSetKernelArg ( núcleo , 3 , tamaño de ( flotante ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );// crea un objeto de rango ND con dimensiones del elemento de trabajo y ejecuta el kernelsize_t global_work_size [ 1 ] = { 256 };global_work_size [ 0 ] = NUM_ENTRIES ;tamaño_trabajo_local [ 0 ] = 64 ; //Nvidia: 192 o 256clEnqueueNDRangeKernel ( cola , kernel , 1 , NULL , global_work_size , local_work_size , 0 , NULL , NULL );}
El cálculo real dentro del archivo "fft1D_1024_kernel_src.cl" (basado en "Ajustar FFT a la arquitectura G80"): [23]
R "( // Este núcleo calcula FFT de longitud 1024. La FFT de longitud 1024 se descompone en // llamadas a una función de base 16, otra función de base 16 y luego una función de base 4__kernel void fft1D_1024 ( __global float2 * adentro , __global float2 * fuera , __local float * sMemx , __local float * sMemy ) { int tid = get_local_id ( 0 ); int blockIdx = get_group_id ( 0 ) * 1024 + tid ; datos float2 [ 16 ];// índice inicial de datos hacia/desde la memoria global in = in + blockIdx ; salida = salida + blockIdx ;cargas globales ( datos , en , 64 ); // lecturas globales fusionadas fftRadix16Pass ( datos ); // pase radix-16 in situ twiddleFactorMul ( datos , tid , 1024 , 0 );// reproducción aleatoria local usando la memoria local localShuffle ( datos , sMemx , sMemy , tid , ((( tid & 15 ) * 65 ) + ( tid >> 4 ))); fftRadix16Pass ( datos ); // pase radix-16 in situ twiddleFactorMul ( datos , tid , 64 , 4 ); // multiplicación de factores de girolocalShuffle ( datos , sMemx , sMemy , tid , ((( tid >> 4 ) * 64 ) + ( tid & 15 )));// cuatro llamadas a funciones radix-4 fftRadix4Pass ( datos ); // función radix-4 número 1 fftRadix4Pass ( datos + 4 ); // función radix-4 número 2 fftRadix4Pass ( datos + 8 ); // función radix-4 número 3 fftRadix4Pass ( datos + 12 ); // función radix-4 número 4// escrituras globales fusionadas globalStores ( datos , salida , 64 ); } ) "
Puede encontrar una implementación completa de código abierto de OpenCL FFT en el sitio web de Apple. [24]
C++ para lenguaje OpenCL
En 2020, Khronos anunció [25] la transición al lenguaje de programación C++ impulsado por la comunidad para OpenCL [26] que proporciona características de C++ 17 en combinación con las características tradicionales de OpenCL C. Este lenguaje permite aprovechar una rica variedad de características del lenguaje C++ estándar y al mismo tiempo preservar la compatibilidad con OpenCL C. Esto abre un camino de transición sin problemas a la funcionalidad C++ para los desarrolladores de código del kernel de OpenCL, ya que pueden continuar usando el flujo de programación familiar e incluso herramientas como así como aprovechar las extensiones y bibliotecas existentes disponibles para OpenCL C.
La semántica del lenguaje se describe en la documentación publicada en las versiones del repositorio OpenCL-Docs [27] alojado por Khronos Group, pero actualmente no está ratificada por Khronos Group. El lenguaje C++ para OpenCL no está documentado en un documento independiente y se basa en la especificación de C++ y OpenCL C. El compilador Clang de código abierto admite C++ para OpenCL desde la versión 9. [28]
C++ para OpenCL se desarrolló originalmente como una extensión del compilador Clang y apareció en la versión 9. [29] Como estaba estrechamente acoplado con OpenCL C y no contenía ninguna funcionalidad específica de Clang, su documentación se volvió a alojar en OpenCL-Docs. repositorio [27] del Grupo Khronos junto con las fuentes de otras especificaciones y tarjetas de referencia. La primera versión oficial de este documento que describe C++ para OpenCL versión 1.0 se publicó en diciembre de 2020. [30] C++ para OpenCL 1.0 contiene características de C++ 17 y es compatible con versiones anteriores de OpenCL C 2.0. En diciembre de 2021, se lanzó un nuevo C++ provisional para OpenCL versión 2021 que es totalmente compatible con el estándar OpenCL 3.0. [31] Un borrador en progreso de la última documentación de C++ para OpenCL se puede encontrar en el sitio web de Khronos. [32]
Características
C++ para OpenCL admite la mayoría de las funciones (sintáctica y semántica) de OpenCL C, excepto el paralelismo y los bloques anidados. [33] Sin embargo, existen diferencias menores en algunas características admitidas relacionadas principalmente con diferencias en la semántica entre C++ y C. Por ejemplo, C++ es más estricto con las conversiones de tipos implícitas y no admite el calificador de tipo restringido . [33] Las siguientes características de C++ no son compatibles con C++ para OpenCL: funciones virtuales, operador de transmisión dinámica , operadores nuevos / eliminados sin ubicación , excepciones, puntero a funciones miembro, referencias a funciones, bibliotecas estándar de C++. [33] C++ para OpenCL extiende el concepto de regiones de memoria separadas ( espacios de direcciones ) de OpenCL C a características de C++: conversiones funcionales, plantillas, miembros de clases, referencias, funciones lambda y operadores. La mayoría de las funciones de C++ no están disponibles para las funciones del kernel, por ejemplo, sobrecarga o creación de plantillas, diseño de clase arbitrario en el tipo de parámetro. [33]
// Defina una clase Complex, que pueda realizar cálculos de números complejos con // diversa precisión cuando se utilizan diferentes tipos para T: doble, flotante, mitad. plantilla < nombre de tipo T > clase complex_t { T m_re ; // Componente real. Tm_im ; _ // Componente imaginario.público : complex_t ( T re , T im ) : m_re { re }, m_im { im } {}; // Definir operador para multiplicación de números complejos. operador complex_t * ( const complex_t y otro ) const { return { m_re * otro . m_re - m_im * otro . m_im , m_re * otro . m_im + m_im * otro . m_re }; } T get_re () const { return m_re ; } T get_im () const { return m_im ; } };// Una función auxiliar para calcular la multiplicación de números complejos leídos desde // el búfer de entrada y almacenar el resultado calculado en el búfer de salida. plantilla < nombre de tipo T > void Compute_helper ( __global T * entrada , __global T * salida ) { auto idx = get_global_id ( 0 ); // Cada elemento de trabajo utiliza 4 elementos consecutivos del búfer de entrada // - dos para cada número complejo. compensación automática = idx * 4 ; auto num1 = complex_t { en [ desplazamiento ], en [ desplazamiento + 1 ]}; auto num2 = complex_t { en [ desplazamiento + 2 ], en [ desplazamiento + 3 ]}; // Realizar multiplicaciones de números complejos. resolución automática = núm1 * núm2 ; // Cada elemento de trabajo escribe 2 elementos consecutivos en el búfer de salida. fuera [ idx * 2 ] = res . get_re (); fuera [ idx * 2 + 1 ] = res . get_im (); }// Este núcleo se utiliza para la multiplicación de números complejos con precisión simple. __kernel void Compute_sp ( __global float * dentro , __global float * fuera ) { compute_helper ( en , fuera ); }#ifdef cl_khr_fp16 // Este núcleo se utiliza para la multiplicación de números complejos con precisión media cuando // es compatible con el dispositivo. #pragma EXTENSIÓN OPENCL cl_khr_fp16: habilitar __kernel void compute_hp ( __global half * in , __global half * out ) { computer_helper ( in , out ); } #terminara si
Entorno de herramientas y ejecución.
C++ para el lenguaje OpenCL se puede usar para las mismas aplicaciones o bibliotecas y de la misma manera que se usa el lenguaje OpenCL C. Debido a la rica variedad de características del lenguaje C++, las aplicaciones escritas en C++ para OpenCL pueden expresar funcionalidades complejas de manera más conveniente que las aplicaciones escritas en OpenCL C y, en particular, el paradigma de programación genérico de C++ es muy atractivo para los desarrolladores de bibliotecas.
C++ para fuentes OpenCL se puede compilar mediante controladores OpenCL que admitan la extensión cl_ext_cxx_for_opencl . [34] Arm anunció soporte para esta extensión en diciembre de 2020. [35] Sin embargo, debido a la creciente complejidad de los algoritmos acelerados en dispositivos OpenCL, se espera que más aplicaciones compilen C++ para kernels OpenCL sin conexión utilizando compiladores independientes como Clang [36] en formato binario ejecutable o formato binario portátil, por ejemplo, SPIR-V. [37] Un ejecutable de este tipo se puede cargar durante la ejecución de las aplicaciones OpenCL utilizando una API OpenCL dedicada. [38]
Los binarios compilados a partir de fuentes en C++ para OpenCL 1.0 se pueden ejecutar en dispositivos compatibles con OpenCL 2.0. Dependiendo de las características del lenguaje utilizadas en dichas fuentes del kernel, también se puede ejecutar en dispositivos que admitan versiones anteriores de OpenCL u OpenCL 3.0.
Aparte de los controladores OpenCL, los núcleos escritos en C++ para OpenCL se pueden compilar para su ejecución en dispositivos Vulkan usando el compilador clspv [39] y la capa de tiempo de ejecución clvk [40] de la misma manera que los núcleos OpenCL C.
Contribuciones
C++ para OpenCL es un lenguaje abierto desarrollado por la comunidad de contribuyentes que figuran en su documentación. [32] Se aceptan nuevas contribuciones a la definición semántica del lenguaje o al soporte de herramientas de código abierto de cualquier persona interesada tan pronto como estén alineadas con la filosofía de diseño principal y sean revisadas y aprobadas por los contribuyentes experimentados. [19]
Historia
OpenCL fue desarrollado inicialmente por Apple Inc. , que posee los derechos de marca , y se perfeccionó hasta convertirse en una propuesta inicial en colaboración con equipos técnicos de AMD , IBM , Qualcomm , Intel y Nvidia . Apple presentó esta propuesta inicial al Grupo Khronos . El 16 de junio de 2008, se formó el Khronos Compute Working Group [41] con representantes de empresas de CPU, GPU, procesadores integrados y software. Este grupo trabajó durante cinco meses para terminar los detalles técnicos de la especificación para OpenCL 1.0 antes del 18 de noviembre de 2008. [42] Esta especificación técnica fue revisada por los miembros de Khronos y aprobada para su publicación pública el 8 de diciembre de 2008. [43]
OpenCL 1.0
OpenCL 1.0 lanzado con Mac OS X Snow Leopard el 28 de agosto de 2009. Según un comunicado de prensa de Apple: [44]
Snow Leopard amplía aún más el soporte para hardware moderno con Open Computing Language (OpenCL), que permite que cualquier aplicación aproveche los vastos gigaflops de potencia informática de GPU que antes solo estaban disponibles para aplicaciones gráficas. OpenCL se basa en el lenguaje de programación C y ha sido propuesto como un estándar abierto.
AMD decidió admitir OpenCL en lugar del ahora obsoleto Close to Metal en su marco Stream . [45] [46] RapidMind anunció la adopción de OpenCL debajo de su plataforma de desarrollo para admitir GPU de múltiples proveedores con una sola interfaz. [47] El 9 de diciembre de 2008, Nvidia anunció su intención de agregar soporte completo para la especificación OpenCL 1.0 a su GPU Computing Toolkit. [48] El 30 de octubre de 2009, IBM lanzó su primera implementación OpenCL como parte de los compiladores XL. [49]
La aceleración de los cálculos con un factor de hasta 1000 es posible con OpenCL en tarjetas gráficas frente a una CPU normal. [50]
Algunas características importantes de la próxima versión de OpenCL son opcionales en 1.0, como operaciones de doble o media precisión. [51]
OpenCL 1.1
OpenCL 1.1 fue ratificado por Khronos Group el 14 de junio de 2010, [52] y agrega una funcionalidad significativa para mejorar la flexibilidad, la funcionalidad y el rendimiento de la programación paralela, que incluyen:
Nuevos tipos de datos que incluyen vectores de 3 componentes y formatos de imagen adicionales;
Manejar comandos de múltiples subprocesos de host y procesar búferes en múltiples dispositivos;
Operaciones en regiones de un búfer que incluyen lectura, escritura y copia de regiones rectangulares 1D, 2D o 3D;
Uso mejorado de eventos para impulsar y controlar la ejecución de comandos;
Funciones C adicionales integradas en OpenCL, como sujeción de números enteros, reproducción aleatoria y copias asincrónicas;
Interoperabilidad de OpenGL mejorada mediante el intercambio eficiente de imágenes y buffers mediante la vinculación de eventos OpenCL y OpenGL.
OpenCL 1.2
El 15 de noviembre de 2011, Khronos Group anunció la especificación OpenCL 1.2, [53] que agregó una funcionalidad significativa sobre las versiones anteriores en términos de rendimiento y características para programación paralela. Las características más notables incluyen:
Partición de dispositivos: la capacidad de dividir un dispositivo en subdispositivos para que las asignaciones de trabajo se puedan asignar a unidades informáticas individuales. Esto es útil para reservar áreas del dispositivo para reducir la latencia para tareas en las que el tiempo es crítico.
Compilación separada y vinculación de objetos: la funcionalidad para compilar OpenCL en bibliotecas externas para incluirlas en otros programas.
Compatibilidad con imágenes mejorada (opcional): 1.2 agrega compatibilidad con imágenes 1D y matrices de imágenes 1D/2D. Además, las extensiones para compartir OpenGL ahora permiten utilizar texturas OpenGL 1D y matrices de texturas 1D/2D para crear imágenes OpenCL.
Kernels integrados: los dispositivos personalizados que contienen una funcionalidad única y específica ahora se integran más estrechamente en el marco OpenCL. Se puede llamar a los kernels para que utilicen aspectos especializados o no programables del hardware subyacente. Los ejemplos incluyen codificación/decodificación de vídeo y procesadores de señales digitales.
Funcionalidad DirectX: el uso compartido de superficies multimedia DX9 permite compartir de manera eficiente entre OpenCL y superficies multimedia DX9 o DXVA . Del mismo modo, para DX11, se permite compartir sin problemas entre las superficies OpenCL y DX11.
La capacidad de forzar el cumplimiento de IEEE 754 para matemáticas de punto flotante de precisión simple: OpenCL de forma predeterminada permite que las versiones de precisión simple de la operación de división, recíproca y raíz cuadrada sean menos precisas que los valores redondeados correctamente que requiere IEEE 754. [54] Si el programador pasa el argumento de línea de comando "-cl-fp32-correctamente-redondeado-divide-sqrt" al compilador, estas tres operaciones se calcularán según los requisitos de IEEE 754 si la implementación de OpenCL lo admite, y no podrán compilar si la implementación de OpenCL no admite el cálculo de estas operaciones a sus valores redondeados correctamente según lo definido por la especificación IEEE 754. [54] Esta capacidad se complementa con la capacidad de consultar la implementación de OpenCL para determinar si puede realizar estas operaciones con precisión IEEE 754. [54]
OpenCL 2.0
El 18 de noviembre de 2013, Khronos Group anunció la ratificación y el lanzamiento público de la especificación OpenCL 2.0 finalizada. [55] Las actualizaciones y adiciones a OpenCL 2.0 incluyen:
Memoria virtual compartida
Paralelismo anidado
Espacio de direcciones genérico
Imágenes (opcional, incluye imagen 3D)
atómicos C11
Tubería
Extensión del controlador del cliente instalable para Android
media precisión extendida con extensión cl_khr_fp16 opcional
cl_double: IEEE 754 de doble precisión (opcional)
OpenCL 2.1
La ratificación y publicación de la especificación provisional OpenCL 2.1 se anunció el 3 de marzo de 2015 en la Game Developer Conference en San Francisco. Fue lanzado el 16 de noviembre de 2015. [56] Introdujo el lenguaje del kernel OpenCL C++, basado en un subconjunto de C++14 , al tiempo que mantuvo el soporte para el lenguaje del kernel OpenCL C preexistente. Vulkan y OpenCL 2.1 comparten SPIR-V como una representación intermedia que permite que las interfaces de lenguaje de alto nivel compartan un objetivo de compilación común. Las actualizaciones de la API de OpenCL incluyen:
Funcionalidad de subgrupo adicional
Copia de objetos y estados del kernel.
Consultas del temporizador del dispositivo de baja latencia
Ingestión de código SPIR-V por tiempo de ejecución
Sugerencias de prioridad de ejecución para colas
Envíos de tamaño cero desde el host
AMD, ARM , Intel, HPC y YetiWare han declarado soporte para OpenCL 2.1. [57] [58]
OpenCL 2.2
OpenCL 2.2 incorpora el lenguaje del kernel OpenCL C++ a la especificación principal para mejorar significativamente la productividad de la programación paralela. [59] [60] [61] Se lanzó el 16 de mayo de 2017. [62] Actualización de mantenimiento publicada en mayo de 2018 con correcciones de errores. [63]
El lenguaje del kernel OpenCL C++ es un subconjunto estático del estándar C++ 14 e incluye clases, plantillas, expresiones lambda, sobrecargas de funciones y muchas otras construcciones para programación genérica y metaprogramación.
Utiliza el nuevo lenguaje intermedio Khronos SPIR-V 1.1 que es totalmente compatible con el lenguaje del kernel OpenCL C++.
Las funciones de la biblioteca OpenCL ahora pueden usar el lenguaje C++ para brindar mayor seguridad y reducir el comportamiento indefinido al acceder a funciones como atómicas, iteradores, imágenes, muestreadores, canalizaciones y espacios de direcciones y tipos integrados de colas de dispositivos.
El almacenamiento de tuberías es un nuevo tipo del lado del dispositivo en OpenCL 2.2 que es útil para implementaciones de FPGA al hacer que el tamaño y el tipo de conectividad se conozcan en el momento de la compilación, lo que permite una comunicación eficiente del alcance del dispositivo entre los núcleos.
OpenCL 2.2 también incluye funciones para una optimización mejorada del código generado: las aplicaciones pueden proporcionar el valor de la constante de especialización en el momento de la compilación de SPIR-V, una nueva consulta puede detectar constructores y destructores no triviales de objetos globales del alcance del programa y se pueden configurar devoluciones de llamadas del usuario. en el momento del lanzamiento del programa.
Se ejecuta en cualquier hardware compatible con OpenCL 2.0 (solo se requiere una actualización del controlador).
OpenCL 3.0
La especificación OpenCL 3.0 se lanzó el 30 de septiembre de 2020, después de estar en versión preliminar desde abril de 2020. La funcionalidad OpenCL 1.2 se ha convertido en una base obligatoria, mientras que todas las características de OpenCL 2.x y OpenCL 3.0 se hicieron opcionales. La especificación conserva el lenguaje OpenCL C y desaproba el lenguaje kernel OpenCL C++, reemplazándolo con C++ para el lenguaje OpenCL [19] basado en un compilador Clang / LLVM que implementa un subconjunto de código intermedio C++17 y SPIR-V . [64] [65] [66]
La versión 3.0.7 de C++ para OpenCL con algunas extensiones de Khronos openCL se presentó en IWOCL 21. [67] La versión actual es 3.0.11 con algunas extensiones y correcciones nuevas. NVIDIA, en estrecha colaboración con el grupo de trabajo Khronos OpenCL, mejoró Vulkan Interop con semáforos y uso compartido de memoria. [68] La última actualización menor fue 3.0.14 con corrección de errores y una nueva extensión para múltiples dispositivos. [69]
Al lanzar OpenCL 2.2, Khronos Group anunció que OpenCL convergería siempre que fuera posible con Vulkan para permitir la flexibilidad de implementación del software OpenCL en ambas API. [70] [71] Esto ha sido demostrado ahora por Premiere Rush de Adobe utilizando el compilador de código abierto clspv [39] para compilar cantidades significativas de código del kernel OpenCL C para ejecutarlo en un tiempo de ejecución Vulkan para su implementación en Android. [72] OpenCL tiene una hoja de ruta prospectiva independiente de Vulkan, con 'OpenCL Next' en desarrollo y cuyo lanzamiento está previsto para 2020. OpenCL Next puede integrar extensiones como Vulkan/OpenCL Interop, Scratch-Pad Memory Management, Extended Subgroups, SPIR-V 1.4 ingesta y SPIR-V Información de depuración extendida. OpenCL también está considerando un cargador y capas similares a Vulkan y un "perfil flexible" para flexibilidad de implementación en múltiples tipos de aceleradores. [73]
Implementaciones de código abierto
clinfo, una herramienta de línea de comandos para ver información de OpenCL
OpenCL consta de un conjunto de encabezados y un objeto compartido que se carga en tiempo de ejecución. Se debe instalar un controlador de cliente instalable (ICD) en la plataforma para cada clase de proveedor que el tiempo de ejecución deba admitir. Es decir, por ejemplo, para admitir dispositivos Nvidia en una plataforma Linux, el ICD de Nvidia debería instalarse de manera que el tiempo de ejecución de OpenCL (el cargador de ICD) pueda ubicar el ICD para el proveedor y redirigir las llamadas de manera adecuada. . La aplicación del consumidor utiliza el encabezado OpenCL estándar; Las llamadas a cada función luego son enviadas por el tiempo de ejecución de OpenCL al controlador apropiado mediante el ICD. Cada proveedor debe implementar cada llamada OpenCL en su controlador. [74]
Las implementaciones de OpenCL de Apple, [75] Nvidia, [76] ROCm , RapidMind [77] y Gallium3D [78] se basan en la tecnología LLVM Compiler y utilizan el compilador Clang como interfaz.
Computación de galio MESA
Se mantiene una implementación de OpenCL (realmente 1.1 incompleta, en su mayoría AMD Radeon GCN ) para varias plataformas como parte del Gallium Compute Project, [79] que se basa en el trabajo del proyecto Mesa para soportar múltiples plataformas. Anteriormente, esto se conocía como CLOVER., [80] desarrollo real: principalmente soporte para ejecutar marcos incompletos con LLVM y CLANG reales, algunas características nuevas como fp16 en 17.3, [81] Target complete OpenCL 1.0, 1.1 y 1.2 para AMD y Nvidia. Red Hat realiza el nuevo desarrollo básico con SPIR-V también para Clover. [82] [83] El nuevo objetivo es OpenCL 3.0 modular con soporte completo de OpenCL 1.2. El estado real está disponible en Mesamatrix. Los soportes de imágenes están aquí en el foco del desarrollo.
RustiCL es una nueva implementación para el cálculo de Gallium con Rust en lugar de C. En Mesa 22.2, la implementación experimental está disponible con soporte para openCL 3.0 e implementación de extensión de imagen para programas como Darktable. [84] Intel Xe (Arc) y AMD GCN+ son compatibles con Mesa 22.3+. AMD R600 y Nvidia Kepler+ también son objeto de soporte de hardware. [85] [86] [87] RustiCL supera a AMD ROCM con hardware Radeon RX 6700 XT en Luxmark Benchmark. [88] Mesa 23.1 es compatible con RustiCL oficial. En Mesa 23.2 el soporte de importantes fp64 está a nivel experimental.
Windows 11 en Arm de Microsoft agregó soporte para OpenCL 1.2 a través de CLon12, una implementación de OpenCL de código abierto sobre DirectX 12 a través de Mesa Gallium . [89] [90] [91]
BEIGNET
En 2013 se lanzó una implementación de Intel para su hardware Ivy Bridge +. [92] Este software del equipo de Intel en China ha atraído críticas de desarrolladores de AMD y Red Hat , [93] así como de Michael Larabel de Phoronix . [94] La versión actual 1.3.2 admite OpenCL 1.2 completo (Ivy Bridge y superiores) y OpenCL 2.0 opcional para Skylake y versiones posteriores. [95] [96] Se ha agregado soporte para Android a Beignet., [97] objetivos de desarrollo reales: solo soporte para 1.2 y 2.0, el camino hacia OpenCL 2.1, 2.2, 3.0 se ha ido a NEO.
NEO
Una implementación de Intel para el hardware Gen. 8 Broadwell + Gen. 9 lanzado en 2018. [98] Este controlador reemplaza la implementación de Beignet para las plataformas compatibles (no las versiones anteriores de 6.gen a Haswell). NEO proporciona soporte para OpenCL 2.1 en plataformas Core y OpenCL 1.2 en plataformas Atom. [99] En 2020, también se admiten Graphic Gen 11 Ice Lake y Gen 12 Tiger Lake. El nuevo OpenCL 3.0 está disponible para Alder Lake, Tiger Lake y Broadwell con la versión 20.41+. Incluye ahora funciones opcionales OpenCL 2.0, 2.1 completas y algunas de 2.2.
ROCm
Creado como parte de GPUOpen de AMD , ROCm (Radeon Open Compute) es un proyecto Linux de código abierto construido sobre OpenCL 1.2 con soporte de lenguaje para 2.0. El sistema es compatible con todas las CPU y APU AMD modernas (en realidad, en parte GFX 7, GFX 8 y 9), así como con las CPU Intel Gen7.5+ (sólo con PCI 3.0). [100] [101] Con la versión 1.9, el soporte se extiende en algunos puntos de forma experimental al hardware con PCIe 2.0 y sin atómica. Se realiza una descripción general del trabajo real en XDC2018. [102] [103] ROCm Versión 2.0 es compatible con OpenCL 2.0 completo, pero algunos errores y limitaciones están en la lista de tareas pendientes. [104] [105] La versión 3.3 está mejorando en detalles. [106] La versión 3.5 es compatible con OpenCL 2.2. [107] La versión 3.10 incluía mejoras y nuevas API. [108] En SC20 se anunció ROCm 4.0 con soporte para AMD Compute Card Instinct MI 100. [109] La documentación real de 5.5.1 y anteriores está disponible en GitHub. [110] [111] [112] OpenCL 3.0 está disponible. RocM 5.5.x+ solo admite GFX 9 Vega y posteriores, por lo que las alternativas son versiones anteriores de RocM o, en el futuro, RustiCL para hardware más antiguo.
POCL
Una implementación portátil que admite CPU y algunas GPU (a través de CUDA y HSA ). Basado en Clang y LLVM . [113] Con la versión 1.0, OpenCL 1.2 se implementó casi por completo junto con algunas características 2.x. [114] La versión 1.2 es compatible con LLVM/CLANG 6.0, 7.0 y Full OpenCL 1.2 con todos los tickets cerrados en Milestone 1.2. [114] [115] OpenCL 2.0 está casi completamente implementado. [116] La versión 1.3 es compatible con Mac OS X. [117] La versión 1.4 incluye soporte para LLVM 8.0 y 9.0. [118] La versión 1.5 implementa soporte LLVM/Clang 10. [119] La versión 1.6 implementa soporte LLVM/Clang 11 y aceleración CUDA. [120] Los objetivos reales son completar OpenCL 2.x, OpenCL 3.0 y mejorar el rendimiento. POCL 1.6 tiene optimización manual al mismo nivel del tiempo de ejecución de cómputo Intel. [121] La versión 1.7 implementa soporte LLVM/Clang 12 y algunas características nuevas de OpenCL 3.0. [122] La versión 1.8 implementa soporte LLVM/Clang 13. [123] La versión 3.0 implementa OpenCL 3.0 en el nivel mínimo y LLVM/Clang 14. [124] La versión 3.1 funciona con LLVM/Clang 15 y soporte mejorado para Spir-V. [125]
Trébol
Un puerto de Mesa Clover para ARM con soporte completo de OpenCL 1.2, [126] [127] sin desarrollo real para 2.0.
GratisOCL
Una implementación centrada en la CPU de OpenCL 1.2 que implementa un compilador externo para crear una plataforma más confiable, [128] sin desarrollo real.
MOCL
En 2018 se lanzó una implementación de OpenCL basada en POCL por parte de los investigadores de NUDT para Matrix-2000. La arquitectura Matrix-2000 está diseñada para reemplazar los aceleradores Intel Xeon Phi de la supercomputadora TianHe-2. Este marco de programación está construido sobre LLVM v5.0 y también reutiliza algunos fragmentos de código de POCL. Para desbloquear el potencial del hardware, el tiempo de ejecución del dispositivo utiliza una estrategia de distribución de tareas basada en push y el rendimiento de los componentes atómicos del kernel mejora significativamente. Este marco se ha implementado en el sistema TH-2A y está disponible para el público. [129] Parte del software se adaptará a continuación para mejorar POCL. [114]
VC4CL
Una implementación de OpenCL 1.2 para el procesador VideoCore IV (BCM2763) utilizado en Raspberry Pi antes de su modelo 4. [130]
Implementaciones de proveedores
Cronograma de implementaciones de proveedores
Junio de 2008: Durante la conferencia WWDC de Apple, se puso a disposición de los participantes una versión beta temprana de Mac OS X Snow Leopard , que incluía la primera implementación beta de OpenCL, aproximadamente 6 meses antes de que se ratificara la especificación de la versión 1.0 final a finales de 2008. También mostraron dos demostraciones. Una era una cuadrícula de pantallas de 8×8 renderizadas, cada una de las cuales mostraba la pantalla de una máquina Apple II emulada: 64 instancias independientes en total, cada una ejecutando un famoso juego de kárate. Esto mostró paralelismo de tareas en la CPU. La otra demostración fue una simulación de N cuerpos ejecutándose en la GPU de una Mac Pro, una tarea paralela de datos.
10 de diciembre de 2008: AMD y Nvidia realizaron la primera demostración pública de OpenCL, una presentación de 75 minutos en SIGGRAPH Asia 2008. AMD mostró una demostración de OpenCL acelerada por CPU que explica la escalabilidad de OpenCL en uno o más núcleos, mientras que Nvidia mostró una demostración de OpenCL acelerada por GPU. manifestación. [131] [132]
16 de marzo de 2009: en la 4ª Multicore Expo, Imagination Technologies anunció la PowerVR SGX543MP, la primera GPU de esta empresa que cuenta con soporte OpenCL. [133]
20 de abril de 2009: Nvidia anunció el lanzamiento de su controlador OpenCL y SDK para los desarrolladores que participan en su programa OpenCL Early Access. [135]
5 de agosto de 2009: AMD presentó las primeras herramientas de desarrollo para su plataforma OpenCL como parte de su programa Beta ATI Stream SDK v2.0. [136]
28 de agosto de 2009: Apple lanzó Mac OS X Snow Leopard , que contiene una implementación completa de OpenCL. [137]
28 de septiembre de 2009: Nvidia lanzó sus propios controladores OpenCL y su implementación de SDK.
13 de octubre de 2009: AMD lanzó la cuarta versión beta de ATI Stream SDK 2.0, que proporciona una implementación completa de OpenCL tanto en GPU R700 / HD 5000 como en CPU con capacidad SSE3 . El SDK está disponible tanto para Linux como para Windows. [138]
26 de noviembre de 2009: Nvidia lanzó los controladores para OpenCL 1.0 (rev 48).
27 de octubre de 2009: S3 lanzó su primer producto compatible con OpenCL 1.0 nativo: el procesador de gráficos integrado Chrome 5400E. [139]
10 de diciembre de 2009: VIA lanzó su primer producto compatible con OpenCL 1.0: el procesador de vídeo ChromotionHD 2.0 incluido en el chipset VN1000. [140]
21 de diciembre de 2009: AMD lanzó la versión de producción de ATI Stream SDK 2.0, [141] que proporciona soporte OpenCL 1.0 para GPU HD 5000 y soporte beta para GPU R700 .
1 de junio de 2010: ZiiLABS publicó detalles de su primera implementación OpenCL para el procesador ZMS para productos domésticos digitales, integrados y portátiles. [142]
30 de junio de 2010: IBM lanzó una versión totalmente compatible de OpenCL 1.0. [4]
13 de septiembre de 2010: Intel publicó detalles de su primera implementación OpenCL para la arquitectura de chip Sandy Bridge. Sandy Bridge integrará la tecnología de chip gráfico más nueva de Intel directamente en la unidad central de procesamiento. [143]
3 de marzo de 2011: Khronos Group anuncia la formación del grupo de trabajo WebCL para explorar la definición de un enlace de JavaScript a OpenCL. Esto crea el potencial para aprovechar el procesamiento paralelo de GPU y CPU multinúcleo desde un navegador web . [145] [146]
31 de marzo de 2011: IBM lanzó una versión totalmente compatible de OpenCL 1.1. [4] [147]
25 de abril de 2011: IBM lanzó OpenCL Common Runtime v0.1 para Linux en arquitectura x86. [148]
4 de mayo de 2011: Nokia Research lanza una extensión WebCL de código abierto para el navegador web Firefox , que proporciona un enlace de JavaScript a OpenCL. [149]
1 de julio de 2011: Samsung Electronics lanza una implementación prototipo de código abierto de WebCL para WebKit, que proporciona un enlace de JavaScript a OpenCL. [150]
8 de agosto de 2011: AMD lanzó el kit de desarrollo de software (SDK) v2.5 de procesamiento paralelo acelerado (APP) AMD impulsado por OpenCL, reemplazando el SDK ATI Stream como tecnología y concepto. [151]
12 de diciembre de 2011: AMD lanzó AMD APP SDK v2.6 [152] que contiene una vista previa de OpenCL 1.2.
17 de abril de 2012: Khronos publicó un borrador de trabajo de WebCL. [154]
6 de mayo de 2013: Altera lanzó Altera SDK para OpenCL, versión 13.0. [155] Es compatible con OpenCL 1.0. [156]
18 de noviembre de 2013: Khronos anunció que se había finalizado la especificación para OpenCL 2.0. [157]
19 de marzo de 2014: Khronos lanza la especificación WebCL 1.0. [158] [159]
29 de agosto de 2014: Intel lanza el controlador HD Graphics 5300 compatible con OpenCL 2.0. [160]
25 de septiembre de 2014: AMD lanza Catalyst 14.41 RC1, que incluye un controlador OpenCL 2.0. [161]
14 de enero de 2015: Xilinx Inc. anuncia el entorno de desarrollo SDAccel para OpenCL, C y C++ y logra la conformidad Khronos. [162]
13 de abril de 2015: Nvidia lanza el controlador WHQL v350.12, que incluye compatibilidad con OpenCL 1.2 para GPU basadas en Kepler o arquitecturas posteriores. [163] El controlador 340+ admite OpenCL 1.1 para Tesla y Fermi.
26 de agosto de 2015: AMD lanzó AMD APP SDK v3.0 [164] que contiene soporte completo de OpenCL 2.0 y codificación de muestra.
16 de noviembre de 2015: Khronos anunció que se había finalizado la especificación para OpenCL 2.1. [165]
18 de abril de 2016: Khronos anunció que la especificación para OpenCL 2.2 se había finalizado provisionalmente. [60]
3 de noviembre de 2016: soporte de Intel para Gen7+ de OpenCL 2.1 en SDK 2016 r3. [166]
17 de febrero de 2017: Nvidia comienza a soportar la evaluación de OpenCL 2.0 con el controlador 378.66. [167] [168] [169]
16 de mayo de 2017: Khronos anunció que la especificación para OpenCL 2.2 se había finalizado con SPIR-V 1.2. [170]
14 de mayo de 2018: Khronos anunció la actualización de mantenimiento para OpenCL 2.2 con corrección de errores y encabezados unificados. [63]
27 de abril de 2020: Khronos anunció la versión provisional de OpenCL 3.0.
1 de junio de 2020: Intel Neo Runtime con OpenCL 3.0 para el nuevo Tiger Lake.
3 de junio de 2020: AMD anunció RocM 3.5 con soporte OpenCL 2.2. [171]
30 de septiembre de 2020: Khronos anunció que se habían finalizado las especificaciones para OpenCL 3.0 (CTS también disponible).
16 de octubre de 2020: Intel anunció la compatibilidad con Neo 20.41 para OpenCL 3.0 (incluye principalmente OpenCL 2.x opcional).
6 de abril de 2021: Nvidia admite OpenCL 3.0 para Ampere. Maxwell y las GPU posteriores también son compatibles con OpenCL 3.0 con el controlador Nvidia 465+. [172]
20 de agosto de 2022: Las GPU Intel Arc Alchemist (Arc A380, A350M, A370M, A550M, A730M y A770M) son compatibles con OpenCL 3.0. [173]
14 de octubre de 2022: Arm Mali-G615 y Mali-G715-Immortalis son compatibles con OpenCL 3.0. [173]
11 de noviembre de 2022: La biblioteca RustiCL OpenCL es compatible con OpenCL 3.0. [173] [174]
Para ser oficialmente conforme, una implementación debe pasar el Khronos Conformance Test Suite (CTS), y los resultados se envían al Khronos Adopters Program. [175] El código Khronos CTS para todas las versiones de OpenCL ha estado disponible en código abierto desde 2017. [176]
Productos conformes
El Grupo Khronos mantiene una lista ampliada de productos compatibles con OpenCL. [4]
Todas las implementaciones que cumplen con los estándares se pueden consultar utilizando una de las herramientas clinfo (hay varias herramientas con el mismo nombre y un conjunto de características similar). [187] [188] [189]
Soporte de versión
Los productos y su versión de soporte OpenCL incluyen: [190]
Soporte OpenCL 3.0
Todo el hardware con OpenCL 1.2+ es posible, OpenCL 2.x solo es opcional, Khronos Test Suite está disponible desde 2020-10 [191] [192]
(2020) Intel NEO Compute: 20.41+ para Gen 12 Tiger Lake a Broadwell (incluye soporte completo para 2.0 y 2.1 y partes de 2.2) [193]
(2020) Procesadores Intel de sexta, séptima, octava, novena, décima y undécima generación ( Skylake , Kaby Lake , Coffee Lake , Comet Lake , Ice Lake , Tiger Lake ) con el último controlador de gráficos Intel para Windows
(2021) Procesadores Intel de 11.a y 12.a generación ( Rocket Lake , Alder Lake ) con el último controlador de gráficos Intel para Windows
(2021) Arm Mali-G78, Mali-G310, Mali-G510, Mali-G610, Mali-G710 y Mali-G78AE.
(2022) Procesadores Intel de 13.a generación ( Raptor Lake ) con el último controlador de gráficos Intel para Windows
(2014+) Procesadores Intel de quinta y sexta generación ( Broadwell , Skylake )
(2015+) Serie Qualcomm Adreno 5xx
(2018+) Serie Qualcomm Adreno 6xx
(2017+) ARM Mali (Bifrost) G51 y G71 en Android 7.1 y Linux
(2018+) ARM Mali (Bifrost) G31, G52, G72 y G76
(2017+) Soporte de evaluación incompleto: GPU Nvidia Kepler , Maxwell , Pascal , Volta y Turing (series GeForce 600, 700, 800, 900 y 10, series Quadro K, M y P, Tesla K-, M- y serie P) con la versión del controlador 378.66+
Soporte OpenCL 1.2
(2011+) para algunos AMD GCN de 1.ª generación, algunas funciones de OpenCL 2.0 no son posibles hoy en día, pero hay muchas más extensiones que Terascale
(2009+) GPU AMD TeraScale 2 y 3 (RV8xx, RV9xx en HD series 5000, 6000 y 7000)
(2011+) APU AMD TeraScale ( basadas en K10 , Bobcat y Piledriver )
(2012+) GPU Nvidia Kepler, Maxwell, Pascal, Volta y Turing (series GeForce 600, 700, 800, 900, 10, 16, 20, series Quadro K, M y P, Tesla K, M y Serie P)
(2012+) Procesadores Intel de tercera y cuarta generación ( Ivy Bridge , Haswell )
(2013+) Serie Qualcomm Adreno 4xx
(2013+) ARM Mali Midgard de tercera generación (T760)
(2008+) algunas GPU AMD TeraScale 1 (RV7xx en la serie HD4000)
(2008+) Nvidia Tesla, GPU Fermi (series GeForce 8, 9, 100, 200, 300, 400, 500, serie Quadro o serie Tesla con GPU Tesla o Fermi )
(2011+) Serie Qualcomm Adreno 3xx
(2012+) ARM Mali Midgard 1.ª y 2.ª generación (T-6xx, T720)
Soporte OpenCL 1.0
actualizado principalmente a 1.1 y 1.2 después del primer controlador solo para 1.0
Portabilidad, rendimiento y alternativas
Una característica clave de OpenCL es la portabilidad, a través de su memoria abstraída y su modelo de ejecución , y el programador no puede utilizar directamente tecnologías específicas de hardware, como la ejecución de subprocesos paralelos (PTX) en línea para las GPU de Nvidia, a menos que esté dispuesto a renunciar a la portabilidad directa. en otras plataformas. Es posible ejecutar cualquier kernel OpenCL en cualquier implementación compatible.
Sin embargo, el rendimiento del kernel no es necesariamente portátil entre plataformas. Sin embargo, se ha demostrado que las implementaciones existentes son competitivas cuando el código del núcleo se ajusta adecuadamente y se ha sugerido el ajuste automático como una solución al problema de portabilidad del rendimiento, [195] produciendo "niveles aceptables de rendimiento" en núcleos de álgebra lineal experimentales. [196] También se estudió la portabilidad de una aplicación completa que contiene múltiples núcleos con diferentes comportamientos, y muestra que la portabilidad solo requería compensaciones limitadas. [197]
Un estudio de la Universidad de Delft de 2011 que comparó los programas CUDA y su traducción sencilla a OpenCL C encontró que CUDA supera a OpenCL en un máximo de un 30 % en la implementación de Nvidia. Los investigadores señalaron que su comparación podría ser más justa aplicando optimizaciones manuales a los programas OpenCL, en cuyo caso no había "ninguna razón para que OpenCL obtuviera un peor rendimiento que CUDA". Las diferencias de rendimiento podrían atribuirse principalmente a diferencias en el modelo de programación (especialmente el modelo de memoria) y a las optimizaciones del compilador de NVIDIA para CUDA en comparación con los de OpenCL. [195]
Otro estudio de D-Wave Systems Inc. encontró que "el rendimiento del kernel OpenCL es entre un 13% y un 63% más lento, y el tiempo de extremo a extremo es entre un 16% y un 67% más lento" que el rendimiento de CUDA. [198]
El hecho de que OpenCL permita compartir cargas de trabajo entre CPU y GPU, ejecutando los mismos programas, significa que los programadores pueden explotar ambos dividiendo el trabajo entre los dispositivos. [199] Esto lleva al problema de decidir cómo dividir el trabajo, porque las velocidades relativas de operaciones difieren entre los dispositivos. Se ha sugerido el aprendizaje automático para resolver este problema: Grewe y O'Boyle describen un sistema de máquinas de vectores de soporte entrenadas en funciones de programa en tiempo de compilación que pueden decidir el problema de partición del dispositivo de forma estática, sin ejecutar realmente los programas para medir su rendimiento. [200]
En una comparación de tarjetas gráficas reales de AMD RDNA 2 y Nvidia RTX Series, OpenCL-Tests arroja un resultado indeciso. No se probaron posibles aumentos de rendimiento mediante el uso de Nvidia CUDA u OptiX. [201]
^ "Dispositivos Android compatibles con OpenCL". Documentos de Google . ArrayFire . Consultado el 28 de abril de 2015 .
^ "Gráficos FreeBSD/OpenCL". FreeBSD . Consultado el 23 de diciembre de 2015 .
^ abcde "Productos conformes". Grupo Khronos . Consultado el 9 de mayo de 2015 .
^ Sochacki, Bartosz (19 de julio de 2019). "La especificación OpenCL C++ 1.0" (PDF) . Grupo de trabajo Khronos OpenCL . Consultado el 19 de julio de 2019 .
^ Munshi, Aaftab; Howes, Lee; Sochaki, Barosz (27 de abril de 2020). "Versión de la especificación OpenCL C: 3.0 Revisión del documento: V3.0.7" (PDF) . Grupo de trabajo Khronos OpenCL. Archivado desde el original (PDF) el 20 de septiembre de 2020 . Consultado el 28 de abril de 2021 .
^ "Documentación del lenguaje de programación C ++ para OpenCL 1.0 y 2021". Grupo de trabajo Khronos OpenCL. 20 de diciembre de 2021 . Consultado el 2 de diciembre de 2022 .
^ "Empresas conformes". Grupo Khronos . Consultado el 8 de abril de 2015 .
^ Gianelli, Silvia E. (14 de enero de 2015). "El entorno de desarrollo Xilinx SDAccel para OpenCL, C y C++ logra la conformidad con Khronos". Cable de noticias de relaciones públicas . Xilinx . Consultado el 27 de abril de 2015 .
^ Howes, Lee (11 de noviembre de 2015). "Versión de la especificación OpenCL: 2.1 Revisión del documento: 23" (PDF) . Grupo de trabajo Khronos OpenCL . Consultado el 16 de noviembre de 2015 .
^ ab Gaster, Benedicto; Howes, Lee; Kaeli, David R .; Mistry, tal vez; Schaa, Dana (2012). Computación heterogénea con OpenCL: edición revisada de OpenCL 1.2 . Morgan Kaufman.
^ Thompson, Jonathan; Schlachter, Kristofer (2012). "Introducción al modelo de programación OpenCL" (PDF) . Laboratorio de investigación de medios de la Universidad de Nueva York. Archivado desde el original (PDF) el 6 de julio de 2015 . Consultado el 6 de julio de 2015 .
^ abcd Piedra, John E.; Gohara, David; Shi, Guochin (2010). "OpenCL: un estándar de programación paralela para sistemas informáticos heterogéneos". Computación en ciencia e ingeniería . 12 (3): 66–73. Código Bib : 2010CSE....12c..66S. doi :10.1109/MCSE.2010.69. PMC 2964860 . PMID 21037981.
^ Klockner, Andreas; Pinto, Nicolás; Lee, Yunsup; Catanzaro, Bryan; Ivanov, Pablo; Fasih, Ahmed (2012). "PyCUDA y PyOpenCL: un enfoque basado en scripts para la generación de código en tiempo de ejecución de GPU". Computación paralela . 38 (3): 157-174. arXiv : 0911.3456 . doi :10.1016/j.parco.2011.09.001. S2CID 18928397.
^ "OpenCL - Enlaces de lenguajes informáticos abiertos". metacpan.org . Consultado el 18 de agosto de 2018 .
^ "Enlace D para OpenCL". dlang.org . Consultado el 29 de junio de 2021 .
^ "SPIR: el primer lenguaje intermedio estándar abierto para gráficos y computación paralela". Grupo Khronos . 21 de enero del 2014.
^ "SYCL: programación heterogénea de fuente única C ++ para OpenCL". Grupo Khronos . 21 de enero de 2014. Archivado desde el original el 18 de enero de 2021 . Consultado el 24 de octubre de 2016 .
^ abc "C ++ para OpenCL, Guía OpenCL". GitHub . Consultado el 18 de abril de 2021 .
^ abc Munshi, Aaftab, ed. (2014). "La especificación OpenCL C, versión 2.0" (PDF) . Consultado el 24 de junio de 2014 .
^ ab "Introducción a la programación OpenCL 201005" (PDF) . AMD. págs. 89–90. Archivado desde el original (PDF) el 16 de mayo de 2011 . Consultado el 8 de agosto de 2017 .
^ "OpenCL" (PDF) . SIGGRAFO2008. 14 de agosto de 2008. Archivado desde el original (PDF) el 16 de febrero de 2012 . Consultado el 14 de agosto de 2008 .
^ "Ajuste de FFT en la arquitectura G80" (PDF) . Vasily Volkov y Brian Kazian, informe del proyecto CS258 de UC Berkeley. Mayo de 2008 . Consultado el 14 de noviembre de 2008 .
^ "AbrirCL_FFT". Manzana. 26 de junio de 2012 . Consultado el 18 de junio de 2022 .
^ Trevett, Neil (28 de abril de 2020). "Anuncios y panel de discusión de Khronos" (PDF) .
^ Stulova, Anastasia; Hickey, Neil; van Haastregt, Sven; Antognini, Marco; Petit, Kevin (27 de abril de 2020). "El lenguaje de programación C ++ para OpenCL". Actas del taller internacional sobre OpenCL . IWOCL '20. Munich, Alemania: Asociación de Maquinaria Informática. págs. 1–2. doi :10.1145/3388333.3388647. ISBN978-1-4503-7531-3. S2CID 216554183.
^ ab KhronosGroup/OpenCL-Docs, The Khronos Group, 16 de abril de 2021 , consultado el 18 de abril de 2021
^ "Documentación de la versión 9 de Clang, compatibilidad con OpenCL". lanzamientos.llvm.org . Septiembre de 2019 . Consultado el 18 de abril de 2021 .
^ "Clang 9, extensiones de idioma, OpenCL". lanzamientos.llvm.org . Septiembre de 2019 . Consultado el 18 de abril de 2021 .
^ "Publicación de documentación de C++ para el lenguaje del kernel OpenCL, versión 1.0, revisión 1 · KhronosGroup/OpenCL-Docs". GitHub . Diciembre 2020 . Consultado el 18 de abril de 2021 .
^ "Publicación de documentación de C++ para el lenguaje del kernel OpenCL, versión 1.0 y 2021 · KhronosGroup/OpenCL-Docs". GitHub . Diciembre 2021 . Consultado el 2 de diciembre de 2022 .
^ ab "Documentación del lenguaje de programación C ++ para OpenCL 1.0". www.khronos.org . Consultado el 18 de abril de 2021 .
^ abcd "Lanzamiento de C++ para la documentación del lenguaje kernel OpenCL, versión 1.0, revisión 2 · KhronosGroup/OpenCL-Docs". GitHub . Marzo 2021 . Consultado el 18 de abril de 2021 .
^ "cl_ext_cxx_for_opencl". www.khronos.org . Septiembre 2020 . Consultado el 18 de abril de 2021 .
^ "Mali SDK admite la compilación de kernels en C++ para OpenCL". comunidad.arm.com . Diciembre 2020 . Consultado el 18 de abril de 2021 .
^ "Manual del usuario del compilador Clang: C ++ para compatibilidad con OpenCL". clang.llvm.org . Consultado el 18 de abril de 2021 .
^ "Guía OpenCL, compilación sin conexión de fuentes del kernel OpenCL". GitHub . Consultado el 18 de abril de 2021 .
^ "Guía OpenCL, programación de kernels OpenCL". GitHub . Consultado el 18 de abril de 2021 .
^ ab Clspv es un compilador prototipo para un subconjunto de sombreadores informáticos de OpenCL C a Vulkan: google/clspv, 17 de agosto de 2019 , consultado el 20 de agosto de 2019
^ Petit, Kévin (17 de abril de 2021), Implementación experimental de OpenCL en Vulkan , consultado el 18 de abril de 2021
^ "Khronos lanza una iniciativa de informática heterogénea" (Presione soltar). Grupo Khronos. 16 de junio de 2008. Archivado desde el original el 20 de junio de 2008 . Consultado el 18 de junio de 2008 .
^ "OpenCL se promociona en Texas". MacWorld. 20 de noviembre de 2008 . Consultado el 12 de junio de 2009 .
^ "El grupo Khronos lanza la especificación OpenCL 1.0" (Presione soltar). Grupo Khronos. 8 de diciembre de 2008 . Consultado el 4 de diciembre de 2016 .
^ "Apple presenta una vista previa de Mac OS X Snow Leopard para los desarrolladores" (Presione soltar). Apple Inc. 9 de junio de 2008. Archivado desde el original el 18 de marzo de 2012 . Consultado el 9 de junio de 2008 .
^ "AMD impulsa la adopción de estándares industriales en el desarrollo de software GPGPU" (Presione soltar). AMD. 6 de agosto de 2008 . Consultado el 14 de agosto de 2008 .
^ "AMD respalda OpenCL y Microsoft DirectX 11". Semana electrónica. 6 de agosto de 2008. Archivado desde el original el 19 de marzo de 2012 . Consultado el 14 de agosto de 2008 .
^ "HPCWire: RapidMind adopta proyectos de estándares y código abierto". Cable HPC. 10 de noviembre de 2008. Archivado desde el original el 18 de diciembre de 2008 . Consultado el 11 de noviembre de 2008 .
^ "Nvidia agrega OpenCL a su kit de herramientas de computación GPU líder en la industria" (Presione soltar). NVIDIA. 9 de diciembre de 2008 . Consultado el 10 de diciembre de 2008 .
^ "Kit de desarrollo OpenCL para Linux on Power". trabajos alfa. 30 de octubre de 2009 . Consultado el 30 de octubre de 2009 .
^ "Estándar Opencl: descripción general | Temas de ScienceDirect". www.sciencedirect.com .
^ "Versión de la especificación OpenCL: 1.0 Revisión del documento: 48" (PDF) . Grupo de trabajo Khronos OpenCL.
^ "Khronos impulsa el impulso del estándar de computación paralela con el lanzamiento de la especificación OpenCL 1.1". Archivado desde el original el 2 de marzo de 2016 . Consultado el 24 de febrero de 2016 .
^ "Khronos lanza la especificación OpenCL 1.2". Grupo Khronos. 15 de noviembre de 2011 . Consultado el 23 de junio de 2015 .
^ a b "Especificación de OpenCL 1.2" (PDF) . Grupo Khronos . Consultado el 23 de junio de 2015 .
^ "Khronos finaliza la especificación OpenCL 2.0 para informática heterogénea". Grupo Khronos. 18 de noviembre de 2013 . Consultado el 10 de febrero de 2014 .
^ "Khronos lanza las especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea". Grupo Khronos. 16 de noviembre de 2015 . Consultado el 16 de noviembre de 2015 .
^ "Khronos anuncia OpenCL 2.1: C ++ llega a OpenCL". AnandTech. 3 de marzo de 2015 . Consultado el 8 de abril de 2015 .
^ "Khronos lanza la especificación provisional OpenCL 2.1 para revisión pública". Grupo Khronos. 3 de marzo de 2015 . Consultado el 8 de abril de 2015 .
^ "Descripción general de OpenCL". Grupo Khronos. 21 de julio de 2013.
^ ab "Khronos lanza la especificación provisional OpenCL 2.2 con el lenguaje kernel OpenCL C++ para programación paralela". Grupo Khronos . 18 de abril de 2016.
^ Trevett, Neil (abril de 2016). "OpenCL: el estado de la Unión" (PDF) . IWOCL . Viena : Grupo Khronos . Consultado el 2 de enero de 2017 .
^ "Khronos lanza OpenCL 2.2 con SPIR-V 1.2". Grupo Khronos . 16 de mayo de 2017.
^ ab "Lanzada la actualización de mantenimiento de OpenCL 2.2". El grupo Khronos . 14 de mayo de 2018.
^ "OpenCL 3.0 ofrece mayor flexibilidad y extensiones Async DMA". www.phoronix.com .
^ "Khronos Group lanza OpenCL 3.0". 26 de abril de 2020.
^ "La especificación OpenCL" (PDF) . Grupo de trabajo Khronos OpenCL.
^ https://www.iwocl.org/wp-content/uploads/k03-iwocl-syclcon-2021-trevett-updated.mp4.pdf [ URL básica PDF ]
^ "Uso de extensiones de memoria compartida y semáforo para Vulkan Interop con NVIDIA OpenCL". 24 de febrero de 2022.
^ "OpenCL 3.0.14 lanzado con una nueva extensión para múltiples dispositivos de búfer de comandos".
^ "Última hora: OpenCL fusionando la hoja de ruta en Vulkan | Perspectiva de PC". www.pcper.com . Archivado desde el original el 1 de noviembre de 2017 . Consultado el 17 de mayo de 2017 .
^ Trevett, Neil (23 de mayo de 2019). "Taller EVS de descripción general de Khronos y OpenCL el 19 de mayo" (PDF) . Grupo Khronos .
^ "Especificación ICD de OpenCL" . Consultado el 23 de junio de 2015 .
^ "Entrada de Apple en la página de usuarios de LLVM" . Consultado el 29 de agosto de 2009 .
^ "Entrada de Nvidia en la página de usuarios de LLVM" . Consultado el 6 de agosto de 2009 .
^ "Entrada de Rapidmind en la página de usuarios de LLVM" . Consultado el 1 de octubre de 2009 .
^ "Publicación del blog de Zack Rusin sobre la implementación de Gallium3D OpenCL". Febrero de 2009 . Consultado el 1 de octubre de 2009 .
^ "Computación de galio". dri.freedesktop.org . Consultado el 23 de junio de 2015 .
^ "Actualización de estado de Clover" (PDF) .
^ "mesa/mesa: biblioteca de gráficos 3D de Mesa". cgit.freedesktop.org .
^ "Gallium Clover con SPIR-V y NIR abren nuevas opciones informáticas dentro de Mesa - Phoronix". www.phoronix.com . Archivado desde el original el 22 de octubre de 2020 . Consultado el 13 de diciembre de 2018 .
^ Clark, Rob; Herbst, Karol (2018). "Soporte de OpenCL dentro de mesa a través de SPIR-V y NIR" (PDF) .
^ "La implementación 'Rusticl' de Mesa ahora logra manejar Darktable OpenCL".
^ "Rusticl de Mesa logra la conformidad oficial con OpenCL 3.0".
^ "Mesa 22.3 lanzada con RDNA3 Vulkan, Rusticl OpenCL y mejores gráficos Intel Arc".
^ "El controlador Rusticl OpenCL de Mesa está casi listo con compatibilidad con GPU AMD Radeon".
^ "La implementación de Rusticl OpenCL de Mesa puede superar a la pila de computación ROCm de Radeon".
^ "Estado de Windows en Arm64: una perspectiva de alto nivel". Patatas fritas y queso . 13 de marzo de 2022 . Consultado el 23 de octubre de 2023 .
^ "Presentación de OpenCL y OpenGL en DirectX". Colabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
^ "Profundización en OpenGL sobre capas DirectX". Colabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
^ Larabel, Michael (10 de enero de 2013). "Beignet: OpenCL/GPGPU viene para Ivy Bridge en Linux". Forónix .
^ Larabel, Michael (16 de abril de 2013). "Más críticas llegan hacia Beignet OpenCL de Intel". Forónix .
^ Larabel, Michael (24 de diciembre de 2013). "Beignet OpenCL de Intel todavía se está horneando lentamente". Forónix .
^ "Beignet". freedesktop.org.
^ "beignet - Biblioteca Beignet OpenCL para Intel Ivy Bridge y GPU más nuevas". cgit.freedesktop.org .
^ "Intel lleva Beignet a Android para OpenCL Compute - Phoronix". www.phoronix.com .
^ "01.org Intel Open Source: tiempo de ejecución de cómputo". 7 de febrero de 2018.
^ "NEO GitHub LÉAME". GitHub . 21 de marzo de 2019.
^ "República de China". GitHub . Archivado desde el original el 8 de octubre de 2016.
^ "RadeonOpenCompute/ROCm: ROCm: plataforma de código abierto para HPC y computación GPU ultraescala". GitHub. 21 de marzo de 2019.
^ "Una buena descripción general de la pila informática ROCm Linux: Phoronix". www.phoronix.com .
^ "XDC Lightning.pdf". Documentos de Google .
^ "Radeon ROCm 2.0 oficialmente disponible con soporte OpenCL 2.0, TensorFlow 1.12, Vega VA de 48 bits - Phoronix". www.phoronix.com .
^ "Tomando Radeon ROCm 2.0 OpenCL para una prueba de evaluación comparativa: Phoronix". www.phoronix.com .
^ https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf [ enlace muerto ]
^ "Radeon ROCm 3.5 lanzado con nuevas funciones pero aún sin soporte Navi - Phoronix".
^ "Lanzamiento de Radeon ROCm 3.10 con mejoras en las herramientas del centro de datos y nuevas API: Phoronix".
^ "Bienvenido a la plataforma AMD ROCm ™: documentación ROCm Documentación 1.0.0".
^ "Inicio". docs.amd.com .
^ "Documentación de AMD: portal".
^ Jääskeläinen, Pekka; Sánchez de La Lama, Carlos; Schnetter, Erik; Raiskila, Kalle; Takala, Jarmo; Berg, Heikki (2016). "pocl: una implementación de OpenCL portátil y de rendimiento". Int'l J. Programación paralela . 43 (5): 752–785. arXiv : 1611.07083 . Código Bib : 2016arXiv161107083J. doi :10.1007/s10766-014-0320-y. S2CID 9905244.
^ abc "página de inicio de pocl". pocl .
^ "GitHub - pocl/pocl: pocl: lenguaje informático portátil". 14 de marzo de 2019 – vía GitHub.
^ "Estado de implementación del soporte de HSA a partir del 17 de mayo de 2016: documentación previa del lenguaje de computación portátil (pocl) 1.3". portablecl.org .
^ "Página de inicio de PoCL".
^ "Página de inicio de PoCL".
^ "Página de inicio de PoCL".
^ "Lanzamiento de POCL 1.6-RC1 con mejor rendimiento CUDA - Phoronix". Archivado desde el original el 17 de enero de 2021 . Consultado el 3 de diciembre de 2020 .
^ https://www.iwocl.org/wp-content/uploads/30-iwocl-syclcon-2021-baumann-slides.pdf [ URL básica PDF ]
^ "Página de inicio de PoCL".
^ "Página de inicio de PoCL".
^ "Página de inicio de PoCL".
^ "Página de inicio de PoCL".
^ "Acerca de". Git.Linaro.org .
^ Gall, T.; Pitney, G. (6 de marzo de 2014). "LCA14-412: GPGPU en ARM SoC" (PDF) . Servicios web de Amazon . Archivado desde el original (PDF) el 26 de julio de 2020 . Consultado el 22 de enero de 2017 .
^ "zuzuf/freeocl". GitHub . Consultado el 13 de abril de 2017 .
^ Zhang, Peng; Colmillo, Jianbin; Yang, Canqun; Tang, Tao; Huang, Chun; Wang, Zheng (2018). MOCL: una implementación eficiente de OpenCL para la arquitectura Matrix-2000 (PDF) . Proc. Conferencia Internacional. sobre las fronteras de la informática. doi :10.1145/3203217.3203244.
^ "Demostración de OpenCL, CPU AMD". YouTube . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
^ "Demostración de OpenCL, GPU Nvidia". YouTube . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
^ "Imagination Technologies lanza la familia IP de gráficos multiprocesador POWERVR SGX543MP avanzada y altamente eficiente". Tecnologías de la imaginación. 19 de marzo de 2009. Archivado desde el original el 3 de abril de 2014 . Consultado el 30 de enero de 2011 .
^ "Demostración de AMD y Havok de física acelerada OpenCL". Perspectiva de la PC. 26 de marzo de 2009. Archivado desde el original el 5 de abril de 2009 . Consultado el 28 de marzo de 2009 .
^ "Nvidia lanza el controlador OpenCL para desarrolladores". NVIDIA. 20 de abril de 2009. Archivado desde el original el 4 de febrero de 2012 . Consultado el 27 de abril de 2009 .
^ "AMD invierte GPGPU, anuncia OpenCL SDK para x86". Ars Técnica. 5 de agosto de 2009 . Consultado el 6 de agosto de 2009 .[ enlace muerto permanente ]
^ Moren, Dan; Snell, Jason (8 de junio de 2009). "Actualización en vivo: discurso de apertura de la WWDC 2009". MacWorld.com . MacWorld . Consultado el 12 de junio de 2009 .
^ "Programa Beta del kit de desarrollo de software (SDK) v2.0 de ATI Stream". Archivado desde el original el 9 de agosto de 2009 . Consultado el 14 de octubre de 2009 .
^ "S3 Graphics lanzó el procesador de gráficos integrado Chrome 5400E". Archivado desde el original el 2 de diciembre de 2009 . Consultado el 27 de octubre de 2009 .
^ "VIA trae el procesador de gráficos VN1000 mejorado". Archivado desde el original el 15 de diciembre de 2009 . Consultado el 10 de diciembre de 2009 .
^ "ATI Stream SDK v2.0 con soporte OpenCL 1.0". Archivado desde el original el 1 de noviembre de 2009 . Consultado el 23 de octubre de 2009 .
^ "OpenCL". ZiiLABS . Consultado el 23 de junio de 2015 .
^ "Intel revela nuevos detalles técnicos de Sandy Bridge". Archivado desde el original el 31 de octubre de 2013 . Consultado el 13 de septiembre de 2010 .
^ "Historias relacionadas con WebCL". Grupo Khronos . Consultado el 23 de junio de 2015 .
^ "Khronos lanza la especificación final WebGL 1.0". Grupo Khronos. Archivado desde el original el 9 de julio de 2015 . Consultado el 23 de junio de 2015 .
^ "Desarrollador de IBM". desarrollador.ibm.com .
^ "Bienvenido a Wikis". www.ibm.com . 20 de octubre de 2009.
^ "Nokia Research lanza el prototipo WebCL". Grupo Khronos. 4 de mayo de 2011. Archivado desde el original el 5 de diciembre de 2020 . Consultado el 23 de junio de 2015 .
^ KamathK, Sharath. "Prototipo WebCL de Samsung para WebKit". Github.com. Archivado desde el original el 18 de febrero de 2015 . Consultado el 23 de junio de 2015 .
^ "AMD acelera el rendimiento de la APU con el desarrollo de software OpenCL actualizado". AMD.com. 8 de agosto de 2011 . Consultado el 16 de junio de 2013 .
^ "SDK de la aplicación AMD v2.6". Foros.amd.com. 13 de marzo de 2015 . Consultado el 23 de junio de 2015 .[ enlace muerto ]
^ "The Portland Group anuncia el compilador OpenCL para SoC NovaThor basados en ARM de ST-Ericsson" . Consultado el 4 de mayo de 2012 .
^ "Últimas especificaciones de WebCL". Grupo Khronos . 7 de noviembre de 2013. Archivado desde el original el 1 de agosto de 2014 . Consultado el 23 de junio de 2015 .
^ "Altera abre el mundo de los FPGA a programadores de software con amplia disponibilidad de SDK y placas disponibles para OpenCL". Altera.com. Archivado desde el original el 9 de enero de 2014 . Consultado el 9 de enero de 2014 .
^ "Altera SDK para OpenCL es el primero en la industria en lograr la conformidad de Khronos para FPGA". Altera.com. Archivado desde el original el 9 de enero de 2014 . Consultado el 9 de enero de 2014 .
^ "Khronos finaliza la especificación OpenCL 2.0 para informática heterogénea". Grupo Khronos. 18 de noviembre de 2013 . Consultado el 23 de junio de 2015 .
^ "Comunicado de prensa de WebCL 1.0". Grupo Khronos. 19 de marzo de 2014 . Consultado el 23 de junio de 2015 .
^ "Especificación WebCL 1.0". Grupo Khronos. 14 de marzo de 2014 . Consultado el 23 de junio de 2015 .
^ "Controlador Intel OpenCL 2.0". Archivado desde el original el 17 de septiembre de 2014 . Consultado el 14 de octubre de 2014 .
^ "Controlador AMD OpenCL 2.0". Soporte.AMD.com . 17 de junio de 2015 . Consultado el 23 de junio de 2015 .
^ "El entorno de desarrollo Xilinx SDAccel para OpenCL, C y C++ logra la conformidad con Khronos - noticias de khronos.org". El grupo Khronos . Consultado el 26 de junio de 2017 .
^ "Lanzamiento de controladores de gráficos 349 para Windows, versión 350.12" (PDF) . 13 de abril de 2015 . Consultado el 4 de febrero de 2016 .
^ "Lanzamiento del SDK 3.0 de la aplicación AMD". Desarrollador.AMD.com . 26 de agosto de 2015 . Consultado el 11 de septiembre de 2015 .
^ "Khronos lanza las especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea". Grupo Khronos . 16 de noviembre de 2015.
^ "¿Qué hay de nuevo? Intel® SDK para aplicaciones OpenCL™ 2016, R3". Software Intel.
^ "Los controladores NVIDIA 378.66 para Windows ofrecen soporte de evaluación OpenCL 2.0". Grupo Khronos . 17 de febrero de 2017. Archivado desde el original el 6 de agosto de 2020 . Consultado el 17 de marzo de 2017 .
^ Szuppe, Jakub (22 de febrero de 2017). "NVIDIA habilita la compatibilidad beta con OpenCL 2.0".
^ Szuppe, Jakub (6 de marzo de 2017). "La compatibilidad beta de NVIDIA para OpenCL 2.0 también funciona en Linux".
^ "El Grupo Khronos". El grupo Khronos . 21 de marzo de 2019.
^ "GitHub: RadeonOpenCompute/ROCm en roc-3.5.0". GitHub .
^ ab "NVIDIA ahora es compatible con OpenCL 3.0". 12 de abril de 2021.
^ a b c "El Grupo Khronos". El grupo Khronos . 12 de diciembre de 2022 . Consultado el 12 de diciembre de 2022 .
^ "Rusticl de Mesa logra la conformidad oficial con OpenCL 3.0". www.phoronix.com . Consultado el 12 de diciembre de 2022 .
^ "El Grupo Khronos". El grupo Khronos . 20 de agosto de 2019 . Consultado el 20 de agosto de 2019 .
^ "KhronosGroup/OpenCL-CTL: las pruebas de conformidad de OpenCL". GitHub. 21 de marzo de 2019.
^ "OpenCL y el SDK de la aplicación AMD". Central de desarrolladores de AMD . desarrollador.amd.com. Archivado desde el original el 4 de agosto de 2011 . Consultado el 11 de agosto de 2011 .
^ "Acerca de Intel OpenCL SDK 1.1". software.intel.com . intel.com . Consultado el 11 de agosto de 2011 .
^ "Intel® SDK para aplicaciones OpenCL™: notas de la versión". software.intel.com . 14 de marzo de 2019.
^ "Soporte de producto" . Consultado el 11 de agosto de 2011 .
^ "Intel OpenCL SDK: notas de la versión". Archivado desde el original el 17 de julio de 2011 . Consultado el 11 de agosto de 2011 .
^ "Anuncio del kit de desarrollo OpenCL para Linux en Power v0.3". IBM . Consultado el 11 de agosto de 2011 .
^ "IBM lanza el kit de desarrollo OpenCL para Linux en Power v0.3: versión compatible con OpenCL 1.1 disponible". Salón OpenCL . ibm.com . Consultado el 11 de agosto de 2011 .
^ "IBM lanza OpenCL Common Runtime para Linux en arquitectura x86". IBM . 20 de octubre de 2009 . Consultado el 10 de septiembre de 2011 .
^ "OpenCL y el SDK de la aplicación AMD". Central de desarrolladores de AMD . desarrollador.amd.com. Archivado desde el original el 6 de septiembre de 2011 . Consultado el 10 de septiembre de 2011 .
^ "Nvidia lanza el controlador OpenCL". 22 de abril de 2009 . Consultado el 11 de agosto de 2011 .
^ "clinfo de Simon Leblanc". GitHub . Consultado el 27 de enero de 2017 .
^ "información de Oblomov". GitHub . Consultado el 27 de enero de 2017 .
^ "clinfo: información openCL". 2 de abril de 2013 . Consultado el 27 de enero de 2017 .
^ "Productos Khronos". El grupo Khronos . Consultado el 15 de mayo de 2017 .
^ "OpenCL-CTS/Test_conformance en principal · KhronosGroup/OpenCL-CTS". GitHub .
^ "Intel Compute-Runtime 20.43.18277 brinda soporte para Alder Lake".
^ "tiempo de ejecución de cálculo". 01.org . 7 de febrero de 2018.
^ ab Colmillo, Jianbin; Varbanescu, Ana Lucía; Sorbos, Henk (2011). "Una comparación integral de rendimiento de CUDA y OpenCL". 2011 Conferencia Internacional sobre Procesamiento Paralelo . Proc. Conferencia Internacional. sobre procesamiento paralelo. págs. 216-225. doi :10.1109/ICPP.2011.45. ISBN978-1-4577-1336-1.
^ Du, Peng; Weber, Rick; Luszczek, Piotr; Tomov, Stanimire; Peterson, Gregorio; Dongarra, Jack (2012). "De CUDA a OpenCL: hacia una solución portátil de rendimiento para la programación de GPU multiplataforma". Computación paralela . 38 (8): 391–407. CiteSeerX 10.1.1.193.7712 . doi :10.1016/j.parco.2011.10.002.
^ Dolbeau, Romain; Bodin, François; de Verdière, Guillaume Colin (7 de septiembre de 2013). "¿Un OpenCL para gobernarlos a todos?". 2013 IEEE 6º Taller internacional sobre sistemas informáticos de múltiples núcleos (MuCoCoS) . págs. 1–6. doi :10.1109/MuCoCoS.2013.6633603. ISBN978-1-4799-1010-6. S2CID 225784.
^ Karimi, Kamran; Dickson, Neil G.; Hamze, Firas (2011). "Una comparación de rendimiento de CUDA y OpenCL". arXiv : 1005.2581v3 [cs.PF].
^ Una encuesta sobre técnicas de computación heterogénea CPU-GPU, ACM Computing Surveys, 2015.
^ Grewe, Dominik; O'Boyle, Michael FP (2011). "Un enfoque de partición de tareas estáticas para sistemas heterogéneos que utilizan OpenCL". Construcción del compilador . Proc. Conferencia Internacional. sobre construcción de compiladores. Apuntes de conferencias sobre informática. vol. 6601, págs. 286–305. doi : 10.1007/978-3-642-19861-8_16 . ISBN978-3-642-19860-1.
^ "La serie Radeon RX 6800 tiene un excelente rendimiento OpenCL basado en ROCm en Linux". www.phoronix.com .
enlaces externos
Wikimedia Commons tiene medios relacionados con OpenCL .