Articulo de referencia

OpenCL

{{cite web |title=Android Devices With OpenCL support |url=https://docs.google.com/a/arrayfire.com/spreadsheets/d/1Mpzfl2NmLUVSAjIph77-FOsJeuyD9Xjha89r5iHw1hI/edit?pli=1#gid=0 |...

OpenCL ( Open Computing Language ) es un marco de trabajo para escribir programas que se ejecutan en plataformas heterogéneas compuestas por unidades centrales de procesamiento (CPU), unidades de procesamiento gráfico (GPU), procesadores de señales digitales (DSP), matrices de puertas programables en campo (FPGA) y otros procesadores o aceleradores de hardware . OpenCL especifica un lenguaje de programación (basado en C99 ) para programar estos dispositivos e interfaces de programación de aplicaciones (API) para controlar la plataforma y ejecutar programas en los dispositivos de computación . OpenCL proporciona una interfaz estándar para la computación paralela mediante paralelismo basado en tareas y datos .

OpenCL es un estándar abierto mantenido por el Grupo Khronos , una organización sin ánimo de lucro dedicada a los estándares abiertos. Existen implementaciones conformes (que han superado la Suite de Pruebas de Conformidad) disponibles de diversas empresas, entre ellas AMD , Arm , Cadence , Google , Imagination , Intel , Nvidia , Qualcomm , Samsung , SPI y Verisilicon . [ 6 ] [ 7 ]

Descripción general

OpenCL considera que un sistema informático consta de varios dispositivos de computación , que pueden ser unidades centrales de procesamiento (CPU) o "aceleradores" como unidades de procesamiento gráfico (GPU), conectados a un procesador anfitrión (una CPU). Define un lenguaje similar a C para escribir programas. Las funciones ejecutadas en un dispositivo OpenCL se denominan " kernels ". [ 8 ] : 17 Un único dispositivo de computación suele constar de varias unidades de computación , que a su vez comprenden múltiples elementos de procesamiento (PE). La ejecución de un único kernel puede ejecutarse en todos o muchos de los PE en paralelo. La forma en que un dispositivo de computación se subdivide en unidades de computación y PE depende del proveedor; una unidad de computación 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"), [ 9 ] : 49–50 y el número de unidades de computación puede no corresponder al número de núcleos que se afirma en la literatura de marketing de los proveedores (que en realidad puede estar contando carriles SIMD ). [ 10 ]

Además de su lenguaje de programación similar a C, OpenCL define una interfaz de programación de aplicaciones (API) que permite a los programas que se ejecutan en el host lanzar kernels en los dispositivos de computación y administrar la memoria del dispositivo, que es (al menos conceptualmente) separada de la memoria del host. Los programas en el lenguaje OpenCL están diseñados para compilarse en tiempo de ejecución , de modo que las aplicaciones que utilizan OpenCL sean portátiles entre implementaciones para varios dispositivos host. [ 11 ] El estándar OpenCL define API de host para C y C++ ; existen API de terceros para otros lenguajes de programación y plataformas como Python , [ 12 ] Java , Perl , [ 13 ] D [ 14 ] y .NET . [ 9 ] : 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 computación 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, se puede utilizar la Representación Intermedia Portátil Estándar (SPIR) [ 15 ] como una forma independiente del destino de enviar kernels entre un compilador de extremo frontal y el extremo posterior de OpenCL.

Más recientemente, Khronos Group ha ratificado SYCL , [ 16 ] un modelo de programación de alto nivel para OpenCL como un 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 de SYCL pueden usar características de C++ con fuentes de kernel de cómputo escritas en el lenguaje "C++ para OpenCL". [ 17 ]

Jerarquía de memoria

OpenCL define una jerarquía de memoria de cuatro niveles para el dispositivo de cómputo: [ 11 ]

  • 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 de cómputo ( __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 flexible y solo se impone mediante construcciones de sincronización explícitas , en particular barreras .

Los dispositivos pueden o no compartir memoria con la CPU del host. [ 11 ] La API del host proporciona identificadores en los búferes de memoria del dispositivo y funciones para transferir datos de ida y vuelta entre el host y los dispositivos.

Lenguaje kernel de OpenCL

El lenguaje de programación que se utiliza para escribir los núcleos de cómputo se denomina lenguaje de núcleo. OpenCL adopta lenguajes basados ​​en C / C++ para especificar los cálculos del núcleo que se realizan en el dispositivo, con algunas restricciones y añadidos para facilitar una asignación eficiente a los recursos de hardware heterogéneos de los aceleradores. Tradicionalmente, OpenCL C se utilizaba para programar los aceleradores en el estándar OpenCL; posteriormente, se desarrolló C++ para el lenguaje de núcleo de OpenCL, que heredaba toda la funcionalidad de OpenCL C, pero permitía utilizar características de C++ en el código fuente del núcleo.

Lenguaje C de OpenCL

OpenCL C [ 18 ] es un dialecto de lenguaje basado en C99 adaptado para ajustarse al modelo de dispositivo en OpenCL. Los búferes de memoria residen en niveles específicos de la jerarquía de memoria , y los punteros están anotados con los calificadores de región __global , __local , __constant y __private , lo que refleja esto. En lugar de que un programa de dispositivo tenga una función principal , las funciones de OpenCL C están marcadas con __kernel para indicar que son puntos de entrada al programa que se llamará desde el programa anfitrión. Se omiten los punteros a funciones , los campos de bits y las matrices de longitud variable , y la recursión está prohibida. [ 19 ] La biblioteca estándar de C se reemplaza por un conjunto personalizado de funciones estándar, orientadas a la programación matemática.

OpenCL C se extiende para facilitar el uso del paralelismo con tipos y operaciones vectoriales, sincronización y funciones para trabajar con elementos y grupos de trabajo. [ 19 ] En particular, además de los tipos escalares como float y double , que se comportan de forma similar a los tipos correspondientes en C, OpenCL proporciona tipos vectoriales de longitud fija como float4 (vector de 4 elementos de precisión simple); estos tipos vectoriales están disponibles en longitudes de dos, tres, cuatro, ocho y dieciséis para varios tipos base. [ 18 ] : § 6.1.2 Las operaciones vectorizadas en estos tipos están diseñadas para mapearse en conjuntos de instrucciones SIMD , por ejemplo, SSE o VMX , cuando se ejecutan programas OpenCL en CPU. [ 11 ] Otros tipos especializados incluyen tipos de imágenes 2D y 3D. [ 18 ] : 10–11

Ejemplo: multiplicación matriz-vector

Cada invocación ( elemento de trabajo ) del núcleo toma una fila de la matriz verde ( A en el código), multiplica esta fila por 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.

A continuación se muestra un algoritmo de multiplicación matriz-vector en OpenCL C.

// Multiplica A*x, dejando el resultado en y.// A es una matriz de orden de filas, 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 filafloat suma = 0.f ; // Acumulador para el producto escalarpara ( size_t j = 0 ; j < ncols ; j ++ ) {suma += a [ j ] * x [ j ];}y [ i ] = suma ;}

La función kernel matvec calcula, en cada invocación, el producto escalar de una sola fila de una matriz A y un vector x :

yi=ai,:incógnita=jai,jincógnitaj.{\displaystyle y_{i}=a_{i,:}\cdot x=\sum _{j}a_{i,j}x_{j}.}

Para extender esto a una multiplicación completa de matriz-vector, el entorno de ejecución de OpenCL asigna el kernel a las filas de la matriz. En el lado del host, la función clEnqueueNDRangeKernel hace esto; toma como argumentos el kernel a ejecutar, sus argumentos y una cantidad de elementos de trabajo, que corresponde a la cantidad de filas en la matriz A.

Ejemplo: cálculo de la FFT

Este ejemplo cargará una implementación de la transformada rápida de Fourier (FFT) y la ejecutará. La implementación se muestra a continuación. [ 20 ] El código solicita a la biblioteca OpenCL la primera tarjeta gráfica disponible, crea búferes de memoria para lectura y escritura (desde la perspectiva de la tarjeta gráfica), compila el kernel de la FFT mediante JIT y, finalmente, lo ejecuta de forma asíncrona. El resultado de la transformada no se lee en este ejemplo. Este código de ejemplo es ilustrativo y no está destinado a un uso serio, por lo que se omite por completo el manejo de errores.

#include <stdio.h>#incluir <time.h>#incluir "CL/opencl.h"#define NUM_ENTRIES 1024int main () // (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 más detalles, consulte el siguiente listado.const char * KernelSource =#include "fft1D_1024_kernel_src.cl";// Buscando las GPU disponiblesconst cl_uint num = 1 ;clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , 0 , NULL , ( cl_uint * ) & num );cl_device_id dispositivos [ 1 ];clGetDeviceIDs ( NULL , CL_DEVICE_TYPE_GPU , num , devices , NULL );// crea un contexto de cómputo con un dispositivo GPUcl_context context = clCreateContextFromType ( NULL , CL_DEVICE_TYPE_GPU , NULL , NULL , NULL );// crear una cola de comandosclGetDeviceIDs ( NULL , CL_DEVICE_TYPE_DEFAULT , 1 , devices , NULL );cola_de_comandos_cl = clCreateCommandQueue ( contexto , dispositivos [ 0 ] , 0 , NULL );// Asignar los objetos de memoria del búfercl_mem memobjs [] = { clCreateBuffer ( context , CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR , sizeof ( float ) * 2 * NUM_ENTRIES , NULL , NULL ),clCreateBuffer ( contexto , CL_MEM_READ_WRITE , sizeof ( float ) * 2 * NUM_ENTRIES , NULL , NULL ) };// crear el programa de cálculo// const char* fft1D_1024_kernel_src[1] = { };cl_program program = clCreateProgramWithSource ( context , 1 , ( const char ** ) & KernelSource , NULL , NULL );// compilar el ejecutable del programa de cálculoclBuildProgram ( programa , 0 , NULL , NULL , NULL , NULL );// crea el kernel de cómputocl_kernel kernel = clCreateKernel ( programa , "fft1D_1024" , NULL );// establecer los valores de los argumentostamaño_t tamaño_trabajo_local [ 1 ] = { 256 };clSetKernelArg ( kernel , 0 , sizeof ( cl_mem ), ( void * ) & memobjs [ 0 ]);clSetKernelArg ( kernel , 1 , sizeof ( cl_mem ), ( void * ) & memobjs [ 1 ]);clSetKernelArg ( kernel , 2 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );clSetKernelArg ( kernel , 3 , sizeof ( float ) * ( local_work_size [ 0 ] + 1 ) * 16 , NULL );// crea un objeto de rango ND con dimensiones de elementos de trabajo y ejecuta el kerneltamaño_t tamaño_trabajo_global [ 1 ] = { 256 };global_work_size [ 0 ] = NUM_ENTRIES ;local_work_size [ 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 "Ajuste de FFT a la arquitectura G80"): [ 21 ]

R "( // Este kernel calcula la 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 * in , __global float2 * out , __local float * sMemx , __local float * sMemy ) { int tid = get_local_id ( 0 ); int blockIdx = get_group_id ( 0 ) * 1024 + tid ; float2 data [ 16 ];// índice inicial de datos hacia/desde la memoria global in = in + blockIdx ; out = out + blockIdx ;globalLoads ( data , in , 64 ); // lecturas globales coalescentes fftRadix16Pass ( data ); // paso radix-16 in situ twiddleFactorMul ( data , 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 de base 4 fftRadix4Pass ( data ); // Función de base 4 número 1 fftRadix4Pass ( data + 4 ); // Función de base 4 número 2 fftRadix4Pass ( data + 8 ); // Función de base 4 número 3 fftRadix4Pass ( data + 12 ); // Función de base 4 número 4// escrituras globales coalescentes globalStores ( datos , salida , 64 ); } ) "

Una implementación completa de código abierto de una FFT de OpenCL se puede encontrar en el sitio web de Apple. [ 22 ]

Lenguaje OpenCL C++

OpenCL C++ es una especificación de corta duración para un lenguaje que combina OpenCL C y C++14. Estaba diseñado para compilarse únicamente en modo en línea , pasando el -cl-std=c++parámetro en clBuildProgram(). No se describe ninguna extensión para detectar la compatibilidad con este lenguaje. Se desconoce si algún controlador llegó a soportar este lenguaje. [ 23 ]

Lenguaje C++ para OpenCL

En 2020, Khronos anunció [ 25 ] la transición al lenguaje de programación C++ para OpenCL impulsado por la comunidad [ 26 ] , que proporciona características de C++17 en combinación con las características tradicionales de OpenCL C. Este lenguaje permite aprovechar una amplia variedad de características del C++ estándar, manteniendo la compatibilidad con versiones anteriores de OpenCL C. Esto facilita una transición fluida a la funcionalidad de C++ para los desarrolladores de código del kernel de OpenCL, ya que pueden seguir utilizando flujos de programación y herramientas familiares, además de 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 el Grupo Khronos, pero actualmente no está ratificada por dicho grupo. 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 de código abierto Clang ha sido compatible con 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 ] Debido a su estrecha integración con OpenCL C y a que no contenía ninguna funcionalidad específica de Clang, su documentación se trasladó al repositorio OpenCL-Docs [ 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 retrocompatible con OpenCL C 2.0. En diciembre de 2021, se publicó una nueva versión provisional de C++ para OpenCL versión 2021, totalmente compatible con el estándar OpenCL 3.0. [ 31 ] Un borrador en desarrollo de la documentación más reciente 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 características (sintáctica y semánticamente) de OpenCL C, excepto el paralelismo anidado y los bloques. [ 33 ] Sin embargo, existen pequeñas diferencias en algunas características admitidas, principalmente relacionadas con las diferencias semánticas entre C++ y C. Por ejemplo, C++ es más estricto con las conversiones de tipo implícitas y no admite el calificador de tipo restrict . [ 33 ] Las siguientes características de C++ no son compatibles con C++ para OpenCL: funciones virtuales, operador dynamic_cast , operadores new / delete sin colocación , excepciones, punteros 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 clase, referencias, funciones lambda y operadores. La mayoría de las características de C++ no están disponibles para las funciones del kernel, por ejemplo, sobrecarga o plantillas, diseño de clase arbitrario en el tipo de parámetro. [ 33 ]

Ejemplo: aritmética de números complejos

El siguiente fragmento de código ilustra cómo se pueden implementar kernels con aritmética de números complejos en C++ para el lenguaje OpenCL, utilizando de forma práctica las características de C++.

// Define una clase Complex, que puede realizar cálculos de números complejos con // varias precisiones cuando se utilizan diferentes tipos para T: double, float, half. template < typename T > class complex_t { T m_re ; // Componente real. T m_im ; // Componente imaginario.public : complex_t ( T re , T im ) : m_re { re }, m_im { im } {}; // Define el operador para la multiplicación de números complejos. complex_t operator * ( const complex_t & other ) const { return { m_re * other . m_re - m_im * other . m_im , m_re * other . m_im + m_im * other . 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. template < typename T > void compute_helper ( __global T * in , __global T * out ) { auto idx = get_global_id ( 0 ); // Cada elemento de trabajo utiliza 4 elementos consecutivos del búfer de entrada // - dos por cada número complejo. auto offset = idx * 4 ; auto num1 = complex_t { in [ offset ], in [ offset + 1 ]}; auto num2 = complex_t { in [ offset + 2 ], in [ offset + 3 ]}; // Realizar la multiplicación de números complejos. auto res = num1 * num2 ; // Cada elemento de trabajo escribe 2 elementos consecutivos en el búfer de salida. out [ idx * 2 ] = res . get_re (); out [ idx * 2 + 1 ] = res . get_im (); }// Este kernel se utiliza para la multiplicación de números complejos en precisión simple. __kernel void compute_sp ( __global float * in , __global float * out ) { compute_helper ( in , out ); }#ifdef cl_khr_fp16 // Este kernel se utiliza para la multiplicación de números complejos en precisión media cuando // el dispositivo lo admite. #pragma OPENCL EXTENSION cl_khr_fp16: enable __kernel void compute_hp ( __global half * in , __global half * out ) { compute_helper ( in , out ); } #endif

Herramientas y entorno de ejecución

El lenguaje C++ para OpenCL se puede utilizar para las mismas aplicaciones o bibliotecas y de la misma manera que el lenguaje C de OpenCL. Gracias a la gran variedad de características del lenguaje C++, las aplicaciones escritas en C++ para OpenCL pueden expresar funcionalidades complejas de forma más sencilla que las escritas en C de OpenCL. En particular, el paradigma de programación genérica de C++ resulta muy atractivo para los desarrolladores de bibliotecas.

Las fuentes de C++ para OpenCL pueden ser compiladas por controladores OpenCL que admiten la extensión cl_ext_cxx_for_opencl , que permite el uso de -cl-std=CLC++en clBuildProgram(). [ 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 kernels de C++ para OpenCL fuera de línea usando compiladores independientes como Clang [ 36 ] en formato binario ejecutable o formato binario portátil, por ejemplo SPIR-V. [ 37 ] Dicho ejecutable puede cargarse durante la ejecución de las aplicaciones OpenCL usando una API OpenCL dedicada. [ 38 ]

Los binarios compilados a partir de código fuente en C++ para OpenCL 1.0 pueden ejecutarse en dispositivos compatibles con OpenCL 2.0. Dependiendo de las características del lenguaje utilizadas en dicho código fuente, también pueden ejecutarse en dispositivos que admitan versiones anteriores de OpenCL o OpenCL 3.0.

Aparte de los controladores OpenCL, los kernels escritos en C++ para OpenCL se pueden compilar para su ejecución en dispositivos Vulkan utilizando el compilador clspv [ 39 ] y la capa de tiempo de ejecución clvk [ 40 ] , de la misma manera que los kernels C de OpenCL.

Contribuciones

C++ para OpenCL es un lenguaje abierto desarrollado por la comunidad de colaboradores 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, siempre que se alineen con la filosofía de diseño principal y sean revisadas y aprobadas por los colaboradores experimentados. [ 17 ]

Historia

OpenCL fue desarrollado inicialmente por Apple Inc. , que posee los derechos de marca registrada , y se perfeccionó 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 Grupo de Trabajo de Computación de Khronos [ 41 ] con representantes de empresas de CPU, GPU, procesadores integrados y software. Este grupo trabajó durante cinco meses para finalizar los detalles técnicos de la especificación de 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 el 8 de diciembre de 2008. [ 43 ]

OpenCL 1.0

OpenCL 1.0 se lanzó 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 la compatibilidad con hardware moderno mediante OpenCL (Open Computing Language), que permite a cualquier aplicación aprovechar la enorme potencia de cálculo de la GPU (en gigaflops), anteriormente disponible solo para aplicaciones gráficas. OpenCL se basa en el lenguaje de programación C y se ha propuesto como un estándar abierto.

AMD decidió dar soporte a OpenCL en lugar del ahora obsoleto Close to Metal en su marco Stream . [ 45 ] [ 46 ] RapidMind anunció su adopción de OpenCL en su plataforma de desarrollo para dar soporte a GPU de varios proveedores con una sola interfaz. [ 47 ] El 9 de diciembre de 2008, Nvidia anunció su intención de añadir 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 de OpenCL como parte de los compiladores XL . [ 49 ]

Es posible acelerar los cálculos con un factor de hasta 1000 mediante OpenCL en tarjetas gráficas en comparación con una CPU normal. Algunas características importantes de la próxima versión de OpenCL son opcionales en la versión 1.0, como las operaciones de doble o media precisión. [ 50 ]

OpenCL 1.1

OpenCL 1.1 fue ratificado por el Grupo Khronos el 14 de junio de 2010, [ 51 ] y agrega una funcionalidad significativa para mejorar la flexibilidad, la funcionalidad y el rendimiento de la programación paralela, incluyendo:

  • Nuevos tipos de datos, incluidos vectores de 3 componentes y formatos de imagen adicionales;
  • Gestionar comandos desde múltiples subprocesos del host y procesar búferes en múltiples dispositivos;
  • Operaciones en regiones de un búfer, incluyendo 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 integradas adicionales de OpenCL, como la limitación de enteros, la mezcla aleatoria y las copias asíncronas con paso;
  • Se ha mejorado la interoperabilidad de OpenGL mediante el intercambio eficiente de imágenes y búferes al vincular los eventos de OpenCL y OpenGL.

OpenCL 1.2

El 15 de noviembre de 2011, el Grupo Khronos anunció la especificación OpenCL 1.2, [ 52 ] que añadió una funcionalidad significativa con respecto a las versiones anteriores en términos de rendimiento y características para la programación paralela. Las características más destacadas incluyen:

  • Particionamiento de dispositivos: la capacidad de dividir un dispositivo en subdispositivos para asignar tareas a unidades de procesamiento individuales. Esto resulta útil para reservar áreas del dispositivo y reducir la latencia en tareas críticas.
  • Compilación y enlace de objetos por separado: la funcionalidad para compilar OpenCL en bibliotecas externas para su inclusión en otros programas.
  • Compatibilidad mejorada con imágenes (opcional): la versión 1.2 añade compatibilidad con imágenes 1D y matrices de imágenes 1D/2D. Además, las extensiones de compartición de OpenGL ahora permiten usar texturas 1D y matrices de texturas 1D/2D de OpenGL para crear imágenes OpenCL.
  • Núcleos integrados: los dispositivos personalizados con funcionalidades específicas y únicas ahora están más integrados en el marco de OpenCL. Se pueden invocar núcleos para utilizar aspectos especializados o no programables del hardware subyacente. Algunos ejemplos son la codificación/decodificación de vídeo y los procesadores de señales digitales.
  • Funcionalidad DirectX: La función de compartir superficies multimedia de DX9 permite compartir de forma eficiente entre OpenCL y superficies multimedia de DX9 o DXVA . Del mismo modo, para DX11, se habilita la compartición sin problemas entre OpenCL y superficies de DX11.
  • La capacidad de forzar el cumplimiento de IEEE 754 para operaciones matemáticas de punto flotante de precisión simple: OpenCL, por defecto, permite que las versiones de precisión simple de las operaciones de división, recíproco y raíz cuadrada sean menos precisas que los valores correctamente redondeados que requiere IEEE 754. [ 53 ] Si el programador pasa el argumento de línea de comandos "-cl-fp32-correctly-rounded-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 fallará la compilación si la implementación de OpenCL no admite el cálculo de estas operaciones a sus valores correctamente redondeados según lo definido por la especificación IEEE 754. [ 53 ] Esta capacidad se complementa con la capacidad de consultar la implementación de OpenCL para determinar si puede realizar estas operaciones con la precisión de IEEE 754. [ 53 ]

OpenCL 2.0

El 18 de noviembre de 2013, el Grupo Khronos anunció la ratificación y publicación de la especificación OpenCL 2.0 finalizada. [ 54 ] Las actualizaciones y adiciones a OpenCL 2.0 incluyen:

  • Memoria virtual compartida
  • paralelismo anidado
  • Espacio de direcciones genérico
  • Imágenes (opcional, incluir imagen 3D)
  • átomos C11
  • Tubería
  • Extensión de controlador de cliente instalable para Android
  • Precisión media extendida con extensión opcional cl_khr_fp16
  • cl_double: precisión doble IEEE 754 (opcional)

OpenCL 2.1

La ratificación y publicación de la especificación provisional de OpenCL 2.1 se anunció el 3 de marzo de 2015 en la Game Developer Conference de San Francisco. Se publicó el 16 de noviembre de 2015. [ 55 ] Introdujo el lenguaje kernel OpenCL C++, basado en un subconjunto de C++14 , manteniendo la compatibilidad con el lenguaje kernel OpenCL C preexistente. Vulkan y OpenCL 2.1 comparten SPIR-V como representación intermedia, lo que permite que los front-ends de lenguajes de alto nivel compartan un objetivo de compilación común. Las actualizaciones de la API de OpenCL incluyen:

  • Funcionalidad de subgrupos adicional
  • Copia de objetos y estados del kernel
  • Consultas de temporizador de dispositivo de baja latencia
  • Ingestión de código SPIR-V por parte del entorno de ejecución.
  • Sugerencias de prioridad de ejecución para colas
  • Despachos de tamaño cero desde el host

AMD, ARM , Intel, HPC y YetiWare han declarado su apoyo a OpenCL 2.1. [ 56 ] [ 57 ]

OpenCL 2.2

OpenCL 2.2 incorpora el lenguaje kernel OpenCL C++ a la especificación principal para una productividad de programación paralela significativamente mejorada. [ 58 ] [ 59 ] [ 60 ] Fue lanzado el 16 de mayo de 2017. [ 61 ] Actualización de mantenimiento lanzada en mayo de 2018 con correcciones de errores. [ 62 ]

  • El lenguaje del núcleo OpenCL C++ es un subconjunto estático del estándar C++14 e incluye clases, plantillas, expresiones lambda, sobrecarga de funciones y muchas otras construcciones para la programación genérica y la 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 proporcionar mayor seguridad y reducir el comportamiento indefinido al acceder a características como operaciones atómicas, iteradores, imágenes, muestreadores, tuberías y tipos integrados de colas de dispositivos y espacios de direcciones.
  • El almacenamiento de tuberías es un nuevo tipo de dispositivo en OpenCL 2.2 que resulta útil para las implementaciones en FPGA, ya que permite conocer el tamaño y el tipo de conectividad en tiempo de compilación, lo que posibilita una comunicación eficiente a nivel de dispositivo entre los núcleos.
  • OpenCL 2.2 también incluye características 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 ámbito del programa, y ​​las funciones de devolución de llamada del usuario se pueden configurar en el momento de la publicación del programa.
  • Funciona 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 publicó el 30 de septiembre de 2020, después de haber estado en vista previa desde abril de 2020. La funcionalidad de OpenCL 1.2 se convirtió 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 desaprueba el lenguaje kernel OpenCL C++, reemplazándolo con el lenguaje C++ para OpenCL [ 17 ] basado en un compilador Clang / LLVM que implementa un subconjunto de C++17 y código intermedio SPIR-V . [ 63 ] [ 64 ] [ 65 ] La versión 3.0.7 de C++ para OpenCL con algunas extensiones de Khronos openCL se presentó en IWOCL 21. [ 66 ] La versión actual es 3.0.11 con algunas extensiones y correcciones nuevas. NVIDIA, trabajando en estrecha colaboración con el Grupo de Trabajo Khronos OpenCL, mejoró la interoperabilidad de Vulkan con semáforos y compartición de memoria. [ 67 ] La última actualización menor fue la 3.0.14 con corrección de errores y una nueva extensión para múltiples dispositivos. [ 68 ]

Hoja de ruta

El Taller Internacional sobre OpenCL (IWOCL) organizado por el Grupo Khronos

Al lanzar OpenCL 2.2, el Grupo Khronos anunció que OpenCL convergería, en la medida de lo posible, con Vulkan para permitir flexibilidad en la implementación de software OpenCL en ambas API. [ 69 ] [ 70 ] Esto ha sido demostrado por Premiere Rush de Adobe, que utiliza el compilador de código abierto clspv [ 39 ] para compilar cantidades significativas de código kernel C de OpenCL para ejecutarlo en un entorno de ejecución Vulkan para su implementación en Android. [ 71 ] OpenCL tiene una hoja de ruta con visión de futuro independiente de Vulkan, con 'OpenCL Next' en desarrollo y con el objetivo de lanzarlo en 2020. OpenCL Next puede integrar extensiones como la interoperabilidad Vulkan/OpenCL, la gestión de memoria Scratch-Pad, subgrupos extendidos, ingesta de SPIR-V 1.4 e información de depuración extendida de SPIR-V. OpenCL también está considerando un cargador y capas similares a Vulkan y un "perfil flexible" para la flexibilidad de implementación en múltiples tipos de aceleradores. [ 72 ]

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 archivos de cabecera 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 entorno de ejecución deba admitir. Es decir, por ejemplo, para admitir dispositivos Nvidia en una plataforma Linux, se debe instalar el ICD de Nvidia para que el entorno de ejecución de OpenCL (el cargador de ICD) pueda localizar el ICD del proveedor y redirigir las llamadas adecuadamente. La aplicación consumidora utiliza el archivo de cabecera estándar de OpenCL; el entorno de ejecución de OpenCL redirige las llamadas a cada función al controlador correspondiente mediante el ICD. Cada proveedor debe implementar cada llamada de OpenCL en su controlador. [ 73 ]

Las implementaciones de OpenCL de Apple, [ 74 ] Nvidia, [ 75 ] ROCm , RapidMind [ 76 ] y Gallium3D [ 77 ] se basan en la tecnología del compilador LLVM y utilizan el compilador Clang como su interfaz.

Computación MESA Galio
Una implementación de OpenCL (actual 1.1 incompleta, principalmente hecha AMD Radeon GCN ) para varias plataformas se mantiene como parte del Gallium Compute Project, [ 78 ] que se basa en el trabajo del proyecto Mesa para admitir múltiples plataformas. Anteriormente esto era conocido como CLOVER., [ 79 ] desarrollo actual: principalmente soporte para ejecutar marco incompleto con LLVM y CLANG actuales, algunas características nuevas como fp16 en 17.3, [ 80 ] Objetivo completo OpenCL 1.0, 1.1 y 1.2 para AMD y Nvidia. El nuevo desarrollo básico lo realiza Red Hat con SPIR-V también para Clover. [ 81 ] [ 82 ] El nuevo objetivo es OpenCL 3.0 modular con soporte completo de OpenCL 1.2. El estado actual está disponible en Mesamatrix. Los soportes de imágenes son aquí el foco del desarrollo.
RustiCL es una nueva implementación para la computación de Gallium con Rust en lugar de C. En Mesa 22.2 está disponible una implementación experimental con soporte para OpenCL 3.0 y una implementación de extensión de imagen para programas como Darktable. [ 83 ] Intel Xe (Arc) y AMD GCN+ son compatibles en Mesa 22.3+. AMD R600 y Nvidia Kepler+ también son objetivo del soporte de hardware. [ 84 ] [ 85 ] [ 86 ] RustiCL supera a AMD ROCM con hardware Radeon RX 6700 XT en Luxmark Benchmark. [ 87 ] Mesa 23.1 es compatible con RustiCL oficial. En Mesa 23.2 el soporte para fp64 importante está en nivel experimental.
Windows 11 de Microsoft en Arm 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 . [ 88 ] [ 89 ] [ 90 ]
BEIGNET
Una implementación de Intel para su hardware Ivy Bridge+ fue lanzada en 2013. [ 91 ] Este software del equipo de Intel en China ha atraído críticas de desarrolladores en AMD y Red Hat , [ 92 ] así como de Michael Larabel de Phoronix . [ 93 ] La versión actual 1.3.2 admite OpenCL 1.2 completo (Ivy Bridge y superior) y OpenCL 2.0 opcional para Skylake y más reciente. [ 94 ] [ 95 ] se ha añadido soporte para Android a Beignet., [ 96 ] objetivos de desarrollo actuales: solo soporte para 1.2 y 2.0, el camino a OpenCL 2.1, 2.2, 3.0 se ha ido a NEO.
NEO
Una implementación de Intel para hardware Gen. 8 Broadwell + Gen. 9 lanzada en 2018. [ 97 ] Este controlador reemplaza la implementación de Beignet para plataformas compatibles (no las más antiguas de 6.gen a Haswell). NEO proporciona soporte para OpenCL 2.1 en plataformas Core y OpenCL 1.2 en plataformas Atom. [ 98 ] En 2020 también se admiten los gráficos Gen 11 Ice Lake y Gen 12 Tiger Lake. El nuevo OpenCL 3.0 está disponible para Alder Lake, Tiger Lake a Broadwell con la versión 20.41+. Ahora incluye OpenCL 2.0 opcional, características completas de 2.1 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 modernas de AMD (actualmente parcialmente GFX 7, GFX 8 y 9), así como con las CPU Intel Gen7.5+ (solo con PCI 3.0). [ 99 ] [ 100 ] Con la versión 1.9, el soporte se extiende en algunos puntos de forma experimental a hardware con PCIe 2.0 y sin operaciones atómicas. Una descripción general del trabajo actual se realiza en XDC2018. [ 101 ] [ 102 ] ROCm Versión 2.0 admite OpenCL 2.0 completo, pero algunos errores y limitaciones están en la lista de tareas pendientes. [ 103 ] [ 104 ] La versión 3.3 está mejorando en los detalles. [ 105 ] La versión 3.5 admite OpenCL 2.2. [ 106 ] La versión 3.10 fue con mejoras y nuevas API. [ 107 ] Se anunció en SC20 ROCm 4.0 con soporte para AMD Compute Card Instinct MI 100. [ 108 ] La documentación actual de 5.5.1 y anteriores está disponible en GitHub. [ 109 ] [ 110 ] [ 111 ] OpenCL 3.0 está disponible. RocM 5.5.x+ solo admite GFX 9 Vega y posteriores, por lo que la alternativa 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 ). Basada en Clang y LLVM . [ 112 ] Con la versión 1.0, OpenCL 1.2 estaba casi completamente implementado junto con algunas características de 2.x. [ 113 ] La versión 1.2 es con LLVM/CLANG 6.0, 7.0 y soporte completo para OpenCL 1.2 con todos los tickets cerrados en el Hito 1.2. [ 113 ] [ 114 ] OpenCL 2.0 está casi completamente implementado. [ 115 ] La versión 1.3 admite Mac OS X. [ 116 ] La versión 1.4 incluye soporte para LLVM 8.0 y 9.0. [ 117 ] La versión 1.5 implementa soporte para LLVM/Clang 10. [ 118 ] La versión 1.6 implementa soporte para LLVM/Clang 11 y aceleración CUDA. [ 119 ] Los objetivos reales son OpenCL 2.x completo, OpenCL 3.0 y mejora del rendimiento. POCL 1.6 está con optimización manual al mismo nivel que Intel Compute Runtime. [ 120 ] La versión 1.7 implementa soporte para LLVM/Clang 12 y algunas características nuevas de OpenCL 3.0. [ 121 ] La versión 1.8 implementa soporte para LLVM/Clang 13. [ 122 ] La versión 3.0 implementa OpenCL 3.0 al nivel mínimo y LLVM/Clang 14. [ 123 ] La versión 3.1 funciona con LLVM/Clang 15 y soporte mejorado para Spir-V. [ 124 ]
Trébol
Un puerto de Mesa Clover para ARM con soporte completo de OpenCL 1.2, [ 125 ] [ 126 ] sin desarrollo real para 2.0.
FreeOCL
Una implementación de OpenCL 1.2 centrada en la CPU que implementa un compilador externo para crear una plataforma más confiable, [ 127 ] sin desarrollo real.
MOCL
En 2018, los investigadores de NUDT publicaron una implementación de OpenCL basada en POCL 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 se basa en LLVM v5.0 y reutiliza fragmentos de código de POCL. Para aprovechar el potencial del hardware, el entorno de ejecución del dispositivo utiliza una estrategia de distribución de tareas basada en empuje, lo que mejora significativamente el rendimiento de las operaciones atómicas del kernel. Este marco se ha implementado en el sistema TH-2A y está disponible públicamente. [ 128 ] Parte del software se adaptará posteriormente para mejorar POCL. [ 113 ]
VC4CL
Una implementación de OpenCL 1.2 para el procesador VideoCore IV (BCM2763) utilizado en la Raspberry Pi antes de su modelo 4. [ 129 ]

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 seis meses antes de que se ratificara la especificación final de la versión 1.0 a finales de 2008. También se mostraron dos demostraciones. Una consistía en una cuadrícula de 8x8 pantallas renderizadas, cada una mostrando la pantalla de una máquina Apple II emulada  : 64 instancias independientes en total, cada una ejecutando un famoso juego de kárate. Esto demostró el paralelismo de tareas en la CPU. La otra demostración fue una simulación de N cuerpos ejecutándose en la GPU de un Mac Pro, una tarea de paralelismo 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 explicaba la escalabilidad de OpenCL en uno o más núcleos, mientras que Nvidia mostró una demostración acelerada por GPU. [ 130 ] [ 131 ]
  • 16 de marzo de 2009: en la 4.ª Multicore Expo, Imagination Technologies anunció la PowerVR SGX543MP, la primera GPU de esta compañía que incluye soporte para OpenCL. [ 132 ]
  • 26 de marzo de 2009: en la GDC 2009 , AMD y Havok demostraron la primera implementación funcional para la aceleración de Havok Cloth mediante OpenCL en la GPU ATI Radeon HD serie 4000. [ 133 ]
  • 20 de abril de 2009: Nvidia anunció el lanzamiento de su controlador OpenCL y SDK para los desarrolladores que participan en su Programa de Acceso Temprano de OpenCL. [ 134 ]
  • 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. [ 135 ]
  • 28 de agosto de 2009: Apple lanzó Mac OS X Snow Leopard , que contiene una implementación completa de OpenCL. [ 136 ]
  • 28 de septiembre de 2009: Nvidia lanzó sus propios controladores OpenCL y su implementación del SDK.
  • 13 de octubre de 2009: AMD lanzó la cuarta versión beta del ATI Stream SDK 2.0, que proporciona una implementación completa de OpenCL tanto en las GPU R700 / HD 5000 como en las CPU compatibles con SSE3 . El SDK está disponible para Linux y Windows. [ 137 ]
  • 26 de noviembre de 2009: Nvidia lanzó los controladores para OpenCL 1.0 (revisión 48).
  • 27 de octubre de 2009: S3 lanzó su primer producto compatible con OpenCL 1.0 nativo: el procesador gráfico integrado Chrome 5400E. [ 138 ]
  • 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. [ 139 ]
  • 21 de diciembre de 2009: AMD lanzó la versión de producción del ATI Stream SDK 2.0, [ 140 ] que proporciona soporte OpenCL 1.0 para las GPU HD 5000 y soporte beta para las GPU R700 .
  • 1 de junio de 2010: ZiiLABS publicó detalles de su primera implementación de OpenCL para el procesador ZMS para productos portátiles, integrados y para el hogar digital. [ 141 ]
  • 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 de OpenCL para la arquitectura de chip Sandy Bridge. Sandy Bridge integrará la tecnología de chip gráfico más reciente de Intel directamente en la unidad central de procesamiento. [ 142 ]
  • 15 de noviembre de 2010: Wolfram Research lanzó Mathematica 8 con el paquete OpenCLLink [ 143 ] .
  • 3 de marzo de 2011: Khronos Group anuncia la formación del grupo de trabajo WebCL para explorar la definición de una vinculación de JavaScript con OpenCL. Esto crea el potencial para aprovechar el procesamiento paralelo de GPU y CPU multinúcleo desde un navegador web . [ 144 ] [ 145 ]
  • 31 de marzo de 2011: IBM lanzó una versión totalmente compatible de OpenCL 1.1. [ 4 ] [ 146 ]
  • 25 de abril de 2011: IBM lanzó OpenCL Common Runtime v0.1 para Linux en arquitectura x86. [ 147 ]
  • 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 JavaScript a OpenCL. [ 148 ]
  • 1 de julio de 2011: Samsung Electronics lanza una implementación prototipo de código abierto de WebCL para WebKit, que proporciona un enlace JavaScript a OpenCL. [ 149 ]
  • 8 de agosto de 2011: AMD lanzó el kit de desarrollo de software (SDK) AMD Accelerated Parallel Processing (APP) v2.5 basado en OpenCL, reemplazando al SDK ATI Stream como tecnología y concepto. [ 150 ]
  • 12 de diciembre de 2011: AMD lanzó AMD APP SDK v2.6 [ 151 ] que contiene una vista previa de OpenCL 1.2.
  • 27 de febrero de 2012: The Portland Group lanzó el compilador PGI OpenCL para CPU ARM multinúcleo . [ 152 ]
  • 17 de abril de 2012: Khronos publicó un borrador de trabajo de WebCL. [ 153 ]
  • 6 de mayo de 2013: Altera lanzó el SDK de Altera para OpenCL, versión 13.0. [ 154 ] Es conforme a OpenCL 1.0. [ 155 ]
  • 18 de noviembre de 2013: Khronos anunció que la especificación para OpenCL 2.0 había sido finalizada. [ 156 ]
  • 19 de marzo de 2014: Khronos publica la especificación WebCL 1.0. [ 157 ] [ 158 ]
  • 29 de agosto de 2014: Intel lanza un controlador HD Graphics 5300 que admite OpenCL 2.0. [ 159 ]
  • 25 de septiembre de 2014: AMD lanza Catalyst 14.41 RC1, que incluye un controlador OpenCL 2.0. [ 160 ]
  • 14 de enero de 2015: Xilinx Inc. anuncia el entorno de desarrollo SDAccel para OpenCL, C y C++, y logra la conformidad con Khronos. [ 161 ]
  • 13 de abril de 2015: Nvidia lanza el controlador WHQL v350.12, que incluye soporte para OpenCL 1.2 para GPU basadas en arquitecturas Kepler o posteriores. [ 162 ] El controlador 340+ admite OpenCL 1.1 para Tesla y Fermi.
  • 26 de agosto de 2015: AMD lanzó AMD APP SDK v3.0 [ 163 ] que contiene soporte completo para OpenCL 2.0 y ejemplos de código.
  • 16 de noviembre de 2015: Khronos anunció que la especificación para OpenCL 2.1 había sido finalizada. [ 164 ]
  • 18 de abril de 2016: Khronos anunció que la especificación para OpenCL 2.2 se había finalizado provisionalmente. [ 59 ]
  • 3 de noviembre de 2016: Soporte de Intel para Gen7+ de OpenCL 2.1 en SDK 2016 r3. [ 165 ]
  • 17 de febrero de 2017: Nvidia comienza el soporte de evaluación de OpenCL 2.0 con el controlador 378.66. [ 166 ] [ 167 ] [ 168 ]
  • 16 de mayo de 2017: Khronos anunció que la especificación para OpenCL 2.2 se había finalizado con SPIR-V 1.2. [ 169 ]
  • 14 de mayo de 2018: Khronos anunció una actualización de mantenimiento para OpenCL 2.2 con corrección de errores y encabezados unificados. [ 62 ]
  • 27 de abril de 2020: Khronos anunció la versión provisional de OpenCL 3.0.
  • 1 de junio de 2020: Entorno de ejecución Intel NEO con OpenCL 3.0 para el nuevo Tiger Lake.
  • 3 de junio de 2020: AMD anunció RocM 3.5 con soporte para OpenCL 2.2. [ 170 ]
  • 30 de septiembre de 2020: Khronos anunció que las especificaciones para OpenCL 3.0 habían sido finalizadas (CTS también disponible).
  • 16 de octubre de 2020: Intel anunció que NEO 20.41 ofrece soporte para OpenCL 3.0 (que incluye principalmente OpenCL 2.x, que es opcional).
  • 6 de abril de 2021: Nvidia admite OpenCL 3.0 para Ampere. Las GPU Maxwell y posteriores también admiten OpenCL 3.0 con el controlador Nvidia 465+. [ 171 ]
  • 20 de agosto de 2022: Las GPU Intel Arc Alchemist (Arc A380, A350M, A370M, A550M, A730M y A770M) cumplen con OpenCL 3.0. [ 172 ]
  • 14 de octubre de 2022: Arm Mali-G615 y Mali-G715-Immortalis son compatibles con OpenCL 3.0. [ 172 ]
  • 11 de noviembre de 2022: La biblioteca Rusticl OpenCL cumple con OpenCL 3.0. [ 172 ] [ 173 ]

Dispositivos

A partir de 2016, OpenCL se ejecuta en unidades de procesamiento gráfico (GPU), CPU con instrucciones SIMD , FPGA , Movidius Myriad 2 , Adapteva Epiphany y DSP .

Conjunto de pruebas de conformidad de Khronos

Para ser oficialmente conforme, una implementación debe pasar el Conjunto de Pruebas de Conformidad de Khronos (CTS), y los resultados se envían al Programa de Adopción de Khronos. [ 174 ] El código CTS de Khronos para todas las versiones de OpenCL ha estado disponible como código abierto desde 2017. [ 175 ]

Productos conformes

El Grupo Khronos mantiene una lista extensa 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). [ 186 ] [ 187 ] [ 188 ]

Compatibilidad con versiones

Los productos y su versión de soporte OpenCL incluyen: [ 189 ]

Compatibilidad con OpenCL 3.0

Todo el hardware con OpenCL 1.2+ es posible, OpenCL 2.x es opcional, Khronos Test Suite está disponible desde 2020-10 [ 190 ] [ 191 ]

  • (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) [ 192 ]
  • (2020) Procesadores Intel de 6.ª, 7.ª, 8.ª, 9.ª, 10.ª y 11.ª generación ( Skylake , Kaby Lake , Coffee Lake , Comet Lake , Ice Lake , Tiger Lake ) con el controlador de gráficos Intel para Windows más reciente.
  • (2021) Procesadores Intel de 11.ª y 12.ª generación ( Rocket Lake , Alder Lake ) con el controlador de gráficos Intel para Windows más reciente.
  • (2021) Arm Mali-G78, Mali-G310, Mali-G510, Mali-G610, Mali-G710 y Mali-G78AE.
  • (2022) Procesadores Intel de 13.ª generación ( Raptor Lake ) con el controlador de gráficos Intel para Windows más reciente.
  • (2022) Gráficos discretos Intel Arc con el controlador de gráficos Intel Arc para Windows más reciente
  • (2021) Nvidia Maxwell , Pascal , Volta , Turing y Ampere con controlador de gráficos Nvidia 465+. [ 171 ]
  • (2022) Nvidia Ada Lovelace con controlador de gráficos Nvidia 525+.
  • (2022) GPU Samsung Xclipse 920 (basada en AMD RDNA2)
  • (2023) Procesadores Intel de 14.ª generación ( Raptor Lake ) Actualizados con el controlador de gráficos Intel para Windows más reciente.
  • (2023) Procesadores Intel Core Ultra Serie 1 ( Meteor Lake ) con el controlador de gráficos Intel para Windows más reciente.

Compatibilidad con OpenCL 2.2

Ninguno todavía : Khronos Test Suite listo, con actualización de controladores para todo el hardware con soporte para 2.0 y 2.1 posible.

  • Intel NEO Compute: Trabajo en progreso para productos reales [ 193 ]
  • ROCm: Versión 3.5+ en su mayoría

Compatibilidad con OpenCL 2.1

  • (2018+) Compatibilidad con versiones anteriores para procesadores Intel de 5.ª y 6.ª generación ( Broadwell , Skylake )
  • (2017+) Procesadores Intel de 7.ª, 8.ª, 9.ª y 10.ª generación ( Kaby Lake , Coffee Lake , Comet Lake , Ice Lake )
  • (2017+) Procesadores Intel Xeon Phi (Knights Landing) (tiempo de ejecución experimental)
  • Khronos: con la actualización del controlador, es posible la compatibilidad con todo el hardware 2.0.

Compatibilidad con OpenCL 2.0

  • (2011+) GPU AMD GCN (HD 7700+/HD 8000/Rx 200/Rx 300/Rx 400/Rx 500/Rx 5000-Series), algunas GCN de 1.ª generación solo 1.2 con algunas extensiones
  • (2013+) APU AMD GCN ( Jaguar , Steamroller , Puma , Excavator y basadas en Zen )
  • (2014+) Procesadores Intel de 5.ª y 6.ª generación ( Broadwell , Skylake )
  • Serie Qualcomm Adreno 5xx (2015+)
  • Serie Qualcomm Adreno 6xx (2018+)
  • (2017+) ARM Mali (Bifrost) G51 y G71 en Android 7.1 y Linux
  • (2018+) ARM Mali (Bifrost) G31, G52, G72 y G76
  • (2017+) Compatibilidad con evaluación incompleta: GPU Nvidia Kepler , Maxwell , Pascal , Volta y Turing (GeForce series 600, 700, 800, 900 y 10, Quadro series K, M y P, Tesla series K, M y P) con la versión de controlador 378.66+

Compatibilidad con OpenCL 1.2

  • (2011+) para algunos AMD GCN de primera generación, algunas características 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 las series HD 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, series Tesla K, M y P)
  • (2012+) Procesadores Intel de 3.ª y 4.ª generación ( Ivy Bridge , Haswell )
  • Coprocesadores Intel Xeon Phi (2013+) (Knights Corner)
  • Serie Qualcomm Adreno 4xx (2013+)
  • (2013+) ARM Mali Midgard de tercera generación (T760)
  • (2015+) ARM Mali Midgard de 4ª generación (T8xx)

Compatibilidad con OpenCL 1.1

  • (2008+) Algunas GPU AMD TeraScale 1 (RV7xx en la serie HD4000)
  • (2008+) GPU Nvidia Tesla, Fermi (GeForce series 8, 9, 100, 200, 300, 400, 500, Quadro o Tesla con GPU Tesla o Fermi )
  • Serie Qualcomm Adreno 3xx (2011+)
  • (2012+) ARM Mali Midgard de 1.ª y 2.ª generación (T-6xx, T720)

Compatibilidad con OpenCL 1.0

  • Actualizado principalmente a las versiones 1.1 y 1.2 después del primer controlador para la versión 1.0 solamente.

Portabilidad, rendimiento y alternativas

Una característica clave de OpenCL es la portabilidad, gracias a su modelo abstracto de memoria y ejecución . El programador no puede usar directamente tecnologías específicas de hardware, como la ejecución paralela de subprocesos (PTX) para GPU de Nvidia, a menos que esté dispuesto a renunciar a la portabilidad directa en otras plataformas. Es posible ejecutar cualquier kernel de OpenCL en cualquier implementación compatible.

Sin embargo, el rendimiento del núcleo no es necesariamente portable entre plataformas. Se ha demostrado que las implementaciones existentes son competitivas cuando el código del núcleo se ajusta correctamente, y se ha sugerido el autoajuste como una solución al problema de la portabilidad del rendimiento, [ 194 ] obteniendo "niveles aceptables de rendimiento" en núcleos de álgebra lineal experimentales. [ 195 ] También se estudió la portabilidad de una aplicación completa que contiene múltiples núcleos con comportamientos diferentes, y se demostró que la portabilidad solo requería compensaciones limitadas. [ 196 ]

Un estudio realizado en la Universidad de Delft en 2011, que comparó programas CUDA y su traducción directa a OpenCL C, reveló que CUDA superaba a OpenCL en un máximo del 30 % en la implementación de Nvidia. Los investigadores señalaron que la comparación podría ser más justa aplicando optimizaciones manuales a los programas OpenCL, en cuyo caso «no habría razón para que OpenCL obtuviera un rendimiento inferior al de CUDA». Las diferencias de rendimiento se atribuyeron principalmente a las 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 las de OpenCL. [ 194 ]

Otro estudio realizado en D-Wave Systems Inc. encontró que "el rendimiento del kernel de 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. [ 197 ]

El hecho de que OpenCL permita que las cargas de trabajo sean compartidas por la CPU y la GPU, ejecutando los mismos programas, significa que los programadores pueden aprovechar ambas dividiendo el trabajo entre los dispositivos. [ 198 ] Esto lleva al problema de decidir cómo particionar el trabajo, ya que las velocidades relativas de las 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 con características de tiempo de compilación del programa que puede decidir el problema de partición de dispositivos de forma estática, sin ejecutar realmente los programas para medir su rendimiento. [ 199 ]

En una comparación de tarjetas gráficas reales de AMD RDNA 2 y la serie Nvidia RTX, el resultado de OpenCL-Tests es inconcluso. No se probaron los posibles aumentos de rendimiento derivados del uso de Nvidia CUDA u OptiX. [ 200 ]

Véase también

Referencias

  1. "v3.1.1" . 23 de mayo de 2026. Consultado el 23 de mayo de 2026 .
  2. "Dispositivos Android con soporte OpenCL" . Google Docs . ArrayFire. Archivado del original el 25 de febrero de 2021. Consultado el 28 de abril de 2015 .
  3. "Gráficos/OpenCL de FreeBSD" . FreeBSD. Archivado del original el 8 de febrero de 2021. Recuperado el 23 de diciembre de 2015 .
  4. 1 2 3 4 5 "Productos Conformantes" . Grupo Khronos. Archivado del original el 29 de junio de 2018. Recuperado el 9 de mayo de 2015 .
  5. "La especificación OpenCL™ C" . registry.khronos.org .
  6. "Empresas conformes" . Grupo Khronos. Archivado del original el 19 de febrero de 2021. Consultado el 19 de septiembre de 2024 .
  7. Gianelli, Silvia E. (14 de enero de 2015). "El entorno de desarrollo Xilinx SDAccel para OpenCL, C y C++ logra la conformidad con Khronos" . PR Newswire . Xilinx. Archivado del original el 24 de febrero de 2021. Recuperado el 27 de abril de 2015 .
  8. Howes, Lee (11 de noviembre de 2015). "Especificación OpenCL Versión: 2.1 Revisión del documento: 23" (PDF) . Grupo de trabajo OpenCL de Khronos. Archivado (PDF) del original el 18 de noviembre de 2015. Recuperado el 16 de noviembre de 2015 .
  9. 1 2 Gaster, Benedict; Howes, Lee; Kaeli, David R. ; Mistry, Perhaad; Schaa, Dana (2012). Computación heterogénea con OpenCL: Edición revisada de OpenCL 1.2 . Morgan Kaufmann.
  10. Tompson, Jonathan; Schlachter, Kristofer (2012). "Una introducción al modelo de programación OpenCL" (PDF) . Laboratorio de Investigación de Medios de la Universidad de Nueva York. Archivado del original (PDF) el 6 de julio de 2015. Recuperado el 6 de julio de 2015 .
  11. 1 2 3 4 Stone, John E.; Gohara, David; Shi, Guochin (2010). "OpenCL: un estándar de programación paralela para sistemas informáticos heterogéneos" . Computing in Science & Engineering . 12 (3): 66– 73. Bibcode : 2010CSE....12c..66S . doi : 10.1109/MCSE.2010.69 . PMC 2964860. PMID 21037981 .  
  12. Klöckner, Andreas; Pinto, Nicolas; Lee, Yunsup; Catanzaro, Bryan; Ivanov, Paul; 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 .
  13. "OpenCL - Enlaces de lenguajes de computación abierta" . MetaCPAN . metacpan.org. Archivado del original el 28 de febrero de 2021. Recuperado el 18 de agosto de 2018 .
  14. "Enlace D para OpenCL" . dlang.org. Archivado del original el 28 de julio de 2017. Consultado el 29 de junio de 2021 .
  15. "SPIR: el primer lenguaje intermedio de estándar abierto para computación y gráficos paralelos" . Khronos Group . 21 de enero de 2014. Archivado del original el 4 de octubre de 2022. Consultado el 24 de octubre de 2016 .
  16. "SYCL – Programación heterogénea de código único en C++ para OpenCL" . Khronos Group . 21 de enero de 2014. Archivado del original el 18 de enero de 2021. Consultado el 24 de octubre de 2016 .
  17. 1 2 3 "C++ para OpenCL, Guía de OpenCL" . GitHub . Archivado del original el 8 de enero de 2025. Recuperado el 18 de abril de 2021 .
  18. 1 2 3 Munshi, Aaftab, ed. (2014). "La especificación OpenCL C, versión 2.0" (PDF) . Archivado (PDF) del original el 15 de octubre de 2016. Recuperado el 24 de junio de 2014 .
  19. 1 2 "Introducción a la programación OpenCL 201005" (PDF) . AMD. págs. 89–90 . Archivado del original (PDF) el 16 de mayo de 2011. Recuperado el 8 de agosto de 2017 . 
  20. "OpenCL" (PDF) . SIGGRAPH2008. 14 de agosto de 2008. Archivado del original (PDF) el 16 de febrero de 2012. Consultado el 14 de agosto de 2008 .
  21. "Adaptación de la FFT a la arquitectura G80" (PDF) . Vasily Volkov y Brian Kazian, informe del proyecto CS258 de la UC Berkeley. Mayo de 2008. Archivado (PDF) del original el 4 de marzo de 2012. Consultado el 14 de noviembre de 2008 .
  22. "OpenCL_FFT" . Apple. 26 de junio de 2012. Archivado del original el 18 de febrero de 2019. Consultado el 18 de junio de 2022 .
  23. 1 2 Sochacki, Bartosz (19 de julio de 2019). "Especificación OpenCL C++ 1.0" (PDF) . Grupo de trabajo OpenCL de Khronos. Archivado (PDF) del original el 6 de marzo de 2021. Recuperado el 19 de julio de 2019 .
  24. "Documentación del lenguaje de programación C++ para OpenCL 1.0 y 2021" . Grupo de trabajo de Khronos OpenCL. 20 de diciembre de 2021. Archivado del original el 26 de enero de 2025. Consultado el 2 de diciembre de 2022 .
  25. Trevett, Neil (28 de abril de 2020). "Anuncios y mesa redonda de Khronos" (PDF) . Archivado (PDF) del original el 18 de abril de 2021. Recuperado el 18 de abril de 2021 .
  26. Stulova, Anastasia; Hickey, Neil; Van Haastregt, Sven; Antognini, Marco; Petit, Kevin (2020). «El lenguaje de programación C++ para OpenCL». Actas del Taller Internacional sobre OpenCL . págs. 1–2 . doi : 10.1145/3388333.3388647 . ISBN  978-1-4503-7531-3.
  27. 1 2 KhronosGroup/OpenCL-Docs , The Khronos Group, 16 de abril de 2021 , consultado el 18 de abril de 2021
  28. "Documentación de Clang versión 9, soporte para OpenCL" . releases.llvm.org . Septiembre de 2019. Consultado el 18 de abril de 2021 .
  29. "Clang 9, Extensiones de lenguaje, OpenCL" . releases.llvm.org . Septiembre de 2019. Consultado el 18 de abril de 2021 .
  30. "Publicación de la documentación del lenguaje kernel C++ para OpenCL, versión 1.0, revisión 1 · KhronosGroup/OpenCL-Docs" . GitHub . Diciembre de 2020. Archivado del original el 16 de diciembre de 2024. Consultado el 18 de abril de 2021 .
  31. "Publicación de la documentación del lenguaje kernel C++ para OpenCL, versión 1.0 y 2021 · KhronosGroup/OpenCL-Docs" . GitHub . Diciembre de 2021. Archivado del original el 26 de enero de 2025. Consultado el 2 de diciembre de 2022 .
  32. 1 2 "Documentación del lenguaje de programación C++ para OpenCL 1.0" . www.khronos.org . Consultado el 18 de abril de 2021 .
  33. 1 2 3 4 "Lanzamiento de la documentación del lenguaje del kernel de C++ para OpenCL, versión 1.0, revisión 2 · KhronosGroup/OpenCL-Docs" . GitHub . Marzo de 2021. Recuperado el 18 de abril de 2021 .
  34. "cl_ext_cxx_for_opencl" . www.khronos.org . Septiembre de 2020. Consultado el 18 de abril de 2021 .
  35. "Mali SDK admite la compilación de kernels en C++ para OpenCL" . community.arm.com . Diciembre de 2020. Consultado el 18 de abril de 2021 .
  36. "Manual del usuario del compilador Clang: compatibilidad con C++ para OpenCL" . clang.llvm.org . Consultado el 18 de abril de 2021 .
  37. "Guía de OpenCL, compilación sin conexión de fuentes del kernel de OpenCL" . GitHub . Consultado el 18 de abril de 2021 .
  38. "Guía de OpenCL, Programación de núcleos de OpenCL" . GitHub . Consultado el 18 de abril de 2021 .
  39. 1 2 Clspv es un compilador prototipo para un subconjunto de sombreadores de cómputo OpenCL C a Vulkan: google/clspv , 17 de agosto de 2019, archivado del original el 28 de noviembre de 2020 , recuperado el 20 de agosto de 2019.
  40. Petit, Kévin (17 de abril de 2021), Implementación experimental de OpenCL en Vulkan , consultado el 18 de abril de 2021
  41. "Khronos lanza una iniciativa de computación heterogénea" (Comunicado de prensa). Grupo Khronos. 16 de junio de 2008. Archivado del original el 20 de junio de 2008. Consultado el 18 de junio de 2008 .
  42. "OpenCL se promociona en Texas" . MacWorld. 20 de noviembre de 2008. Archivado del original el 18 de febrero de 2009. Consultado el 12 de junio de 2009 .
  43. «El Grupo Khronos publica la especificación OpenCL 1.0» (Comunicado de prensa). Grupo Khronos. 8 de diciembre de 2008. Archivado del original el 6 de agosto de 2020. Consultado el 4 de diciembre de 2016 .
  44. "Apple presenta una vista previa de Mac OS X Snow Leopard a los desarrolladores" (Comunicado de prensa). Apple Inc. 9 de junio de 2008. Archivado del original el 18 de marzo de 2012. Consultado el 9 de junio de 2008 .
  45. "AMD impulsa la adopción de estándares de la industria en el desarrollo de software GPGPU" (Comunicado de prensa). AMD. 6 de agosto de 2008. Archivado del original el 20 de marzo de 2012. Consultado el 14 de agosto de 2008 .
  46. "AMD respalda OpenCL y Microsoft DirectX 11" . eWeek. 6 de agosto de 2008. Consultado el 14 de agosto de 2008 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  47. "HPCWire: RapidMind adopta proyectos de código abierto y estándares" . HPCWire. 10 de noviembre de 2008. Archivado del original el 18 de diciembre de 2008. Consultado el 11 de noviembre de 2008 .
  48. "Nvidia añade OpenCL a su kit de herramientas de computación GPU líder en la industria" (Comunicado de prensa). Nvidia. 9 de diciembre de 2008. Archivado del original el 2 de julio de 2019. Consultado el 10 de diciembre de 2008 .
  49. "Kit de desarrollo OpenCL para Linux en Power" . alphaWorks. 30 de octubre de 2009. Archivado del original el 9 de agosto de 2011. Consultado el 30 de octubre de 2009 .
  50. "Especificación OpenCL Versión: 1.0 Revisión del documento: 48" (PDF) . Grupo de trabajo OpenCL de Khronos.
  51. "Khronos impulsa el estándar de computación paralela con el lanzamiento de la especificación OpenCL 1.1" . Archivado del original el 2 de marzo de 2016. Consultado el 24 de febrero de 2016 .
  52. "Khronos publica la especificación OpenCL 1.2" . Grupo Khronos. 15 de noviembre de 2011. Archivado del original el 2 de diciembre de 2020. Consultado el 23 de junio de 2015 .
  53. 1 2 3 "Especificación OpenCL 1.2" (PDF) . Khronos Group. Archivado (PDF) del original el 18 de noviembre de 2016. Recuperado el 23 de junio de 2015 .
  54. "Khronos finaliza la especificación OpenCL 2.0 para computación heterogénea" . Grupo Khronos. 18 de noviembre de 2013. Archivado del original el 11 de noviembre de 2020. Consultado el 10 de febrero de 2014 .
  55. "Khronos publica las especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea" . Grupo Khronos. 16 de noviembre de 2015. Archivado del original el 8 de noviembre de 2020. Consultado el 16 de noviembre de 2015 .
  56. "Khronos anuncia OpenCL 2.1: C++ llega a OpenCL" . AnandTech. 3 de marzo de 2015. Archivado del original el 4 de marzo de 2015. Consultado el 8 de abril de 2015 .
  57. "Khronos publica la especificación provisional de OpenCL 2.1 para revisión pública" . Grupo Khronos. 3 de marzo de 2015. Archivado del original el 2 de diciembre de 2020. Consultado el 8 de abril de 2015 .
  58. "Descripción general de OpenCL" . Khronos Group. 21 de julio de 2013. Archivado del original el 9 de agosto de 2011. Consultado el 10 de febrero de 2015 .
  59. 1 2 "Khronos publica la especificación provisional de OpenCL 2.2 con el lenguaje kernel OpenCL C++ para programación paralela" . Grupo Khronos . 18 de abril de 2016. Archivado del original el 8 de noviembre de 2020. Consultado el 2 de mayo de 2016 .
  60. Trevett, Neil (abril de 2016). "OpenCL – Estado de la Unión" (PDF) . IWOCL . Viena : Khronos Group . Archivado (PDF) del original el 25 de febrero de 2021. Recuperado el 2 de enero de 2017 .
  61. "Khronos lanza OpenCL 2.2 con SPIR-V 1.2" . Grupo Khronos . 16 de mayo de 2017. Archivado del original el 18 de enero de 2021. Consultado el 16 de mayo de 2017 .
  62. 1 2 "Actualización de mantenimiento de OpenCL 2.2 publicada" . The Khronos Group . 14 de mayo de 2018. Archivado del original el 2 de diciembre de 2020. Recuperado el 17 de octubre de 2018 .
  63. "OpenCL 3.0 aporta mayor flexibilidad y extensiones DMA asíncronas" . www.phoronix.com . Archivado del original el 6 de mayo de 2024. Consultado el 4 de febrero de 2023 .
  64. "Khronos Group lanza OpenCL 3.0" . 26 de abril de 2020. Archivado del original el 18 de enero de 2021. Consultado el 28 de abril de 2020 .
  65. "Especificación OpenCL" (PDF) . Grupo de trabajo OpenCL de Khronos. Archivado (PDF) del original el 20 de septiembre de 2020. Consultado el 3 de mayo de 2020 .
  66. Trevett, Neil (2021). "Estado de la Unión: Grupo de Trabajo de OpenCL" (PDF) . pág. 9. Archivado (PDF) del original el 16 de julio de 2024. Recuperado el 29 de abril de 2021 . 
  67. "Uso de extensiones de semáforo y compartición de memoria para la interoperabilidad de Vulkan con NVIDIA OpenCL" . 24 de febrero de 2022. Archivado del original el 6 de julio de 2022. Consultado el 24 de febrero de 2022 .
  68. "OpenCL 3.0.14 lanzado con nueva extensión para búfer de comandos multidispositivo" . Archivado del original el 8 de octubre de 2024. Recuperado el 3 de agosto de 2023 .
  69. "Última hora: Hoja de ruta de integración de OpenCL en Vulkan | PC Perspective" . www.pcper.com . Archivado del original el 1 de noviembre de 2017. Consultado el 17 de mayo de 2017 .
  70. "SIGGRAPH 2018: OpenCL-Next toma forma, Vulkan continúa evolucionando – Phoronix" . www.phoronix.com . Archivado del original el 28 de octubre de 2020. Consultado el 17 de octubre de 2018 .
  71. "Actualización de Vulkan SIGGRAPH 2019" (PDF) . Archivado (PDF) del original el 20 de agosto de 2019. Recuperado el 20 de agosto de 2019 .
  72. Trevett, Neil (23 de mayo de 2019). "Descripción general de Khronos y OpenCL Taller EVS mayo 2019" (PDF) . Grupo Khronos . Archivado (PDF) del original el 17 de julio de 2020. Recuperado el 4 de agosto de 2019 .
  73. "Especificación OpenCL ICD" . Archivado del original el 6 de diciembre de 2016. Consultado el 23 de junio de 2015 .
  74. "Entrada de Apple en la página de usuarios de LLVM" . Archivado del original el 23 de febrero de 2021. Consultado el 29 de agosto de 2009 .
  75. "Entrada de Nvidia en la página de usuarios de LLVM" . Archivado del original el 23 de febrero de 2021. Consultado el 6 de agosto de 2009 .
  76. "Entrada de Rapidmind en la página de usuarios de LLVM" . Archivado del original el 23 de febrero de 2021. Consultado el 1 de octubre de 2009 .
  77. "Entrada de blog de Zack Rusin sobre la implementación de OpenCL en Gallium3D" . Febrero de 2009. Consultado el 1 de octubre de 2009 .
  78. "GalliumCompute" . dri.freedesktop.org. Archivado del original el 20 de marzo de 2014. Consultado el 23 de junio de 2015 .
  79. "Actualización de estado de Clover" (PDF) . Archivado (PDF) del original el 16 de enero de 2017. Recuperado el 12 de noviembre de 2016 .
  80. "mesa/mesa – La biblioteca de gráficos 3D Mesa" . cgit.freedesktop.org . Archivado del original el 25 de febrero de 2021. Consultado el 20 de septiembre de 2017 .
  81. "Gallium Clover con SPIR-V y NIR abre nuevas opciones de computación dentro de Mesa – Phoronix" . www.phoronix.com . Archivado del original el 22 de octubre de 2020. Consultado el 13 de diciembre de 2018 .
  82. Clark, Rob; Herbst, Karol (2018). "Soporte de OpenCL dentro de Mesa a través de SPIR-V y NIR" (PDF) . Archivado (PDF) del original el 12 de noviembre de 2020. Recuperado el 13 de diciembre de 2018 .
  83. "La implementación 'Rusticl' de Mesa ahora logra manejar OpenCL de Darktable" . Archivado del original el 25 de mayo de 2022. Consultado el 18 de mayo de 2022 .
  84. "El Rusticl de Mesa logra la conformidad oficial con OpenCL 3.0" .
  85. "Mesa 22.3 lanzada con RDNA3 Vulkan, Rusticl OpenCL, mejores gráficos Intel Arc" . Archivado del original el 19 de febrero de 2023. Recuperado el 4 de marzo de 2023 .
  86. "El controlador OpenCL Rusticl de Mesa está casi listo con soporte para GPU AMD Radeon" .
  87. "La implementación OpenCL Rusticl de Mesa puede superar el rendimiento de la pila de cómputo ROCm de Radeon" .
  88. "Estado de Windows en Arm64: una perspectiva de alto nivel" . Chips and Cheese . 13 de marzo de 2022. Consultado el 23 de octubre de 2023 .
  89. "Introducción a OpenCL y OpenGL en DirectX" . Collabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
  90. "Análisis en profundidad de OpenGL sobre la superposición de DirectX" . Collabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
  91. Larabel, Michael (10 de enero de 2013). "Beignet: OpenCL/GPGPU llega a Ivy Bridge en Linux" . Phoronix . Archivado del original el 12 de noviembre de 2020. Recuperado el 14 de septiembre de 2016 .
  92. Larabel, Michael (16 de abril de 2013). "Más críticas llegan a Beignet OpenCL de Intel" . Phoronix . Archivado del original el 30 de noviembre de 2020. Recuperado el 14 de septiembre de 2016 .
  93. Larabel, Michael (24 de diciembre de 2013). "Intel's Beignet OpenCL Is Still Slowly Baking" . Phoronix . Archivado del original el 30 de noviembre de 2020. Recuperado el 14 de septiembre de 2016 .
  94. "Beignet" . freedesktop.org. Archivado del original el 12 de noviembre de 2020. Consultado el 12 de noviembre de 2016 .
  95. "beignet – Biblioteca OpenCL Beignet para GPU Intel Ivy Bridge y más recientes" . cgit.freedesktop.org . Archivado del original el 27 de febrero de 2021. Consultado el 2 de enero de 2017 .
  96. "Intel lleva Beignet a Android para computación OpenCL – Phoronix" . www.phoronix.com . Archivado del original el 30 de noviembre de 2020. Consultado el 12 de noviembre de 2016 .
  97. "01.org Intel Open Source – Compute Runtime" . 7 de febrero de 2018. Archivado del original el 18 de enero de 2021. Consultado el 10 de abril de 2018 .
  98. "NEO GitHub README" . GitHub . 21 de marzo de 2019. Archivado del original el 26 de febrero de 2021. Consultado el 10 de abril de 2018 .
  99. "ROCm" . GitHub . Archivado del original el 8 de octubre de 2016.
  100. "RadeonOpenCompute/ROCm: ROCm – Plataforma de código abierto para computación de alto rendimiento y GPU a ultraescala" . GitHub. 21 de marzo de 2019. Archivado del original el 18 de febrero de 2021. Consultado el 30 de diciembre de 2016 .
  101. "Una buena descripción general de la pila de computación Linux ROCm – Phoronix" . www.phoronix.com . Archivado del original el 9 de noviembre de 2020. Consultado el 13 de diciembre de 2018 .
  102. "XDC Lightning.pdf" . Google Docs . Archivado del original el 6 de agosto de 2020. Consultado el 21 de marzo de 2019 .
  103. "Radeon ROCm 2.0 oficialmente disponible con soporte para OpenCL 2.0, TensorFlow 1.12, Vega VA de 48 bits – Phoronix" . www.phoronix.com . Archivado del original el 26 de septiembre de 2020. Consultado el 13 de enero de 2019 .
  104. "Poniendo a prueba Radeon ROCm 2.0 OpenCL – Phoronix" . www.phoronix.com . Archivado del original el 20 de septiembre de 2020. Consultado el 13 de enero de 2019 .
  105. https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf
  106. "Radeon ROCm 3.5 lanzada con nuevas características pero aún sin soporte para Navi – Phoronix" . Archivado del original el 4 de diciembre de 2020. Consultado el 1 de diciembre de 2020 .
  107. "Radeon ROCm 3.10 lanzado con mejoras en la herramienta para centros de datos y nuevas API – Phoronix" . Archivado del original el 17 de enero de 2021. Consultado el 3 de diciembre de 2020 .
  108. "AMD lanza Arcturus como Instinct MI100, Radeon ROCm 4.0 – Phoronix" . Archivado del original el 16 de diciembre de 2020. Consultado el 17 de noviembre de 2020 .
  109. "Bienvenido a la plataforma AMD ROCm™ — Documentación de ROCm 1.0.0" . Archivado del original el 24 de abril de 2020. Recuperado el 28 de abril de 2020 .
  110. "Inicio" . docs.amd.com . Archivado del original el 12 de mayo de 2022. Consultado el 18 de mayo de 2022 .
  111. "Documentación de AMD – Portal" .
  112. 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". Programación paralela internacional J. 43 (5): 752– 785. arXiv : 1611.07083 . Código Bib : 2016arXiv161107083J . doi : 10.1007/s10766-014-0320-y .
  113. ^ "página de inicio de pocl " . pocl . Archivado desde el original el 1 de diciembre de 2019 . Consultado el 12 de noviembre de 2016 .
  114. ^ "GitHub – pocl/pocl: pocl: lenguaje informático portátil" . 14 de marzo de 2019. Archivado desde el original el 25 de febrero de 2021 . Consultado el 22 de marzo de 2017 a través de GitHub.
  115. "Estado de implementación del soporte HSA al 17 de mayo de 2016: documentación de Portable Computing Language (pocl) 1.3-pre" . portablecl.org . Archivado del original el 2 de marzo de 2021. Consultado el 26 de septiembre de 2018 .
  116. "Página principal de PoCL" . Archivado del original el 7 de noviembre de 2020. Consultado el 29 de diciembre de 2019 .
  117. "Página principal de PoCL" . Archivado del original el 27 de febrero de 2021. Consultado el 29 de diciembre de 2019 .
  118. "Página principal de PoCL" . Archivado del original el 24 de febrero de 2021. Consultado el 28 de abril de 2020 .
  119. "POCL 1.6-RC1 lanzado con mejor rendimiento CUDA – Phoronix" . Archivado del original el 17 de enero de 2021. Consultado el 3 de diciembre de 2020 .
  120. Baumann, Tobias; Noack, Matthias; Steinke, Thomas (2021). "Evaluación del rendimiento y mejoras de la implementación de OpenCL de código abierto PoCL en CPUs Intel" (PDF) . pág. 51. Archivado (PDF) del original el 29 de abril de 2021. Recuperado el 29 de abril de 2021 . 
  121. "Página principal de PoCL" . Archivado del original el 19 de mayo de 2021. Consultado el 26 de junio de 2021 .
  122. "Página principal de PoCL" . Archivado del original el 12 de octubre de 2021. Consultado el 18 de mayo de 2022 .
  123. "Página principal de PoCL" . Archivado del original el 11 de junio de 2022. Consultado el 17 de junio de 2022 .
  124. "Página principal de PoCL" .
  125. "Acerca de" . Git.Linaro.org . Archivado del original el 25 de febrero de 2021. Consultado el 12 de noviembre de 2016 .
  126. Gall, T.; Pitney, G. (6 de marzo de 2014). "LCA14-412: GPGPU en ARM SoC" (PDF) . Amazon Web Services . Archivado del original (PDF) el 26 de julio de 2020. Recuperado el 22 de enero de 2017 .
  127. "zuzuf/freeocl" . GitHub . Archivado del original el 27 de febrero de 2021. Consultado el 13 de abril de 2017 .
  128. Zhang, Peng; Fang, Jianbin; Yang, Canqun; Tang, Tao; Huang, Chun; Wang, Zheng (2018). MOCL: Una implementación eficiente de OpenCL para la arquitectura Matrix-2000 (PDF) . Actas de la Conferencia Internacional sobre Fronteras de la Computación. doi : 10.1145/3203217.3203244 . Archivado (PDF) del original el 24 de febrero de 2021. Recuperado el 19 de junio de 2018 .
  129. "Estado" . GitHub . 16 de marzo de 2022. Archivado del original el 24 de febrero de 2021. Consultado el 4 de marzo de 2021 .
  130. "Demostración de OpenCL, CPU AMD" . YouTube . 10 de diciembre de 2008. Archivado del original el 7 de julio de 2013. Consultado el 28 de marzo de 2009 .
  131. "Demostración de OpenCL, GPU Nvidia" . YouTube . 10 de diciembre de 2008. Archivado del original el 30 de julio de 2013. Consultado el 28 de marzo de 2009 .
  132. "Imagination Technologies lanza la avanzada y altamente eficiente familia de IP gráficas multiprocesador POWERVR SGX543MP" . Imagination Technologies. 19 de marzo de 2009. Archivado del original el 3 de abril de 2014. Consultado el 30 de enero de 2011 .
  133. "AMD y Havok demuestran la física acelerada por OpenCL" . PC Perspective. 26 de marzo de 2009. Archivado del original el 5 de abril de 2009. Consultado el 28 de marzo de 2009 .
  134. "Nvidia lanza controlador OpenCL para desarrolladores" . Nvidia. 20 de abril de 2009. Archivado del original el 4 de febrero de 2012. Consultado el 27 de abril de 2009 .
  135. "AMD realiza GPGPU inversa y anuncia un SDK de OpenCL para x86" . Ars Technica. 5 de agosto de 2009. Consultado el 6 de agosto de 2009 .
  136. Moren, Dan; Snell, Jason (8 de junio de 2009). "Actualización en vivo: Conferencia magistral de la WWDC 2009" . MacWorld.com . MacWorld. Archivado del original el 4 de marzo de 2012. Recuperado el 12 de junio de 2009 .
  137. "Programa Beta ATI Stream Software Development Kit (SDK) v2.0" . Archivado del original el 9 de agosto de 2009. Consultado el 14 de octubre de 2009 .
  138. "S3 Graphics lanzó el procesador gráfico integrado Chrome 5400E" . Archivado del original el 2 de diciembre de 2009. Consultado el 27 de octubre de 2009 .
  139. "VIA presenta el procesador gráfico VN1000 mejorado" . Archivado del original el 15 de diciembre de 2009. Consultado el 10 de diciembre de 2009 .
  140. "ATI Stream SDK v2.0 con soporte para OpenCL 1.0" . Archivado del original el 1 de noviembre de 2009. Consultado el 23 de octubre de 2009 .
  141. "OpenCL" . ZiiLABS. Archivado del original el 25 de febrero de 2021. Consultado el 23 de junio de 2015 .
  142. "Intel revela nuevos detalles técnicos de Sandy Bridge" . Archivado del original el 31 de octubre de 2013. Consultado el 13 de septiembre de 2010 .
  143. "Descripción general de OpenCLLink: documentación de Wolfram Mathematica 9" . Archivado del original el 31 de octubre de 2013. Consultado el 28 de noviembre de 2010 .
  144. "Historias relacionadas con WebCL" . Grupo Khronos. Archivado del original el 26 de noviembre de 2020. Consultado el 23 de junio de 2015 .
  145. "Khronos publica la especificación final de WebGL 1.0" . Grupo Khronos. Archivado del original el 9 de julio de 2015. Consultado el 23 de junio de 2015 .
  146. "IBM Developer" . developer.ibm.com . Archivado del original el 26 de febrero de 2021. Consultado el 21 de marzo de 2019 .
  147. "Bienvenido a Wikis" . www.ibm.com . 20 de octubre de 2009. Archivado del original el 19 de diciembre de 2019. Consultado el 21 de marzo de 2019 .
  148. "Nokia Research lanza prototipo de WebCL" . Khronos Group. 4 de mayo de 2011. Archivado del original el 5 de diciembre de 2020. Consultado el 23 de junio de 2015 .
  149. KamathK, Sharath. "Prototipo WebCL de Samsung para WebKit" . Github.com. Archivado del original el 18 de febrero de 2015. Recuperado el 23 de junio de 2015 .
  150. "AMD optimiza el rendimiento de la APU con el desarrollo de software OpenCL actualizado" . Amd.com. 8 de agosto de 2011. Archivado del original el 19 de marzo de 2014. Consultado el 16 de junio de 2013 .
  151. "AMD APP SDK v2.6" . Forums.amd.com. 13 de marzo de 2015. Consultado el 23 de junio de 2015 .
  152. "The Portland Group anuncia un compilador OpenCL para los SoC NovaThor basados ​​en ARM de ST-Ericsson" . Archivado del original el 1 de marzo de 2012. Consultado el 4 de mayo de 2012 .
  153. "Última especificación de WebCL" . Khronos Group . 7 de noviembre de 2013. Archivado del original el 1 de agosto de 2014. Consultado el 23 de junio de 2015 .
  154. "Altera abre el mundo de las FPGA a los programadores de software con una amplia disponibilidad de SDK y placas listas para usar para OpenCL" . Altera.com. Archivado del original el 9 de enero de 2014. Consultado el 9 de enero de 2014 .
  155. "Altera SDK para OpenCL es el primero en la industria en lograr la conformidad con Khronos para FPGA" . Altera.com. Archivado del original el 9 de enero de 2014. Consultado el 9 de enero de 2014 .
  156. "Khronos finaliza la especificación OpenCL 2.0 para computación heterogénea" . Grupo Khronos. 18 de noviembre de 2013. Archivado del original el 11 de noviembre de 2020. Consultado el 23 de junio de 2015 .
  157. "Comunicado de prensa de WebCL 1.0" . Khronos Group. 19 de marzo de 2014. Archivado del original el 25 de noviembre de 2020. Consultado el 23 de junio de 2015 .
  158. "Especificación WebCL 1.0" . Khronos Group. 14 de marzo de 2014. Archivado del original el 11 de noviembre de 2020. Consultado el 23 de junio de 2015 .
  159. "Controlador Intel OpenCL 2.0" . Consultado el 14 de octubre de 2014 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  160. "Controlador AMD OpenCL 2.0" . Support.AMD.com . 17 de junio de 2015. Archivado del original el 5 de noviembre de 2018. Consultado el 23 de junio de 2015 .
  161. "El entorno de desarrollo Xilinx SDAccel para OpenCL, C y C++ obtiene la certificación Khronos – noticias de khronos.org" . The Khronos Group . Archivado del original el 6 de agosto de 2020. Consultado el 26 de junio de 2017 .
  162. "Controladores de gráficos Release 349 para Windows, versión 350.12" (PDF) . 13 de abril de 2015. Archivado (PDF) del original el 4 de febrero de 2016. Recuperado el 4 de febrero de 2016 .
  163. "Lanzamiento del SDK de aplicaciones AMD 3.0" . Developer.AMD.com . 26 de agosto de 2015. Archivado del original el 5 de mayo de 2016. Consultado el 11 de septiembre de 2015 .
  164. "Khronos publica las especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea" . Grupo Khronos . 16 de noviembre de 2015. Archivado del original el 8 de noviembre de 2020. Consultado el 16 de noviembre de 2015 .
  165. "¿Qué hay de nuevo? Intel® SDK para aplicaciones OpenCL™ 2016, R3" . Intel Software. Archivado del original el 8 de julio de 2018. Recuperado el 17 de marzo de 2017 .
  166. "Los controladores NVIDIA 378.66 para Windows ofrecen soporte de evaluación para OpenCL 2.0" . Khronos Group . 17 de febrero de 2017. Archivado del original el 6 de agosto de 2020. Consultado el 17 de marzo de 2017 .
  167. Szuppe, Jakub (22 de febrero de 2017). "NVIDIA habilita la compatibilidad beta con OpenCL 2.0" . Archivado del original el 11 de noviembre de 2020. Recuperado el 21 de marzo de 2019 .
  168. Szuppe, Jakub (6 de marzo de 2017). "La compatibilidad beta de NVIDIA con OpenCL 2.0 también funciona en Linux" . Archivado del original el 6 de agosto de 2020. Recuperado el 21 de marzo de 2019 .
  169. "The Khronos Group" . The Khronos Group . 21 de marzo de 2019. Archivado del original el 6 de agosto de 2020. Consultado el 25 de mayo de 2017 .
  170. "GitHub – RadeonOpenCompute/ROCm en roc-3.5.0" . GitHub . Archivado del original el 6 de marzo de 2021. Consultado el 2 de agosto de 2020 .
  171. 1 2 "NVIDIA ahora cumple con OpenCL 3.0" . 12 de abril de 2021.
  172. ^ "El grupo Khronos " . El grupo Khronos . 12 de diciembre de 2022 . Consultado el 12 de diciembre de 2022 .
  173. "El Rusticl de Mesa obtiene la certificación oficial OpenCL 3.0" . www.phoronix.com . Consultado el 12 de diciembre de 2022 .
  174. "The Khronos Group" . The Khronos Group . 20 de agosto de 2019. Archivado del original el 6 de marzo de 2021. Consultado el 20 de agosto de 2019 .
  175. "KhronosGroup/OpenCL-CTL: Las pruebas de conformidad de OpenCL" . GitHub. 21 de marzo de 2019. Archivado del original el 24 de febrero de 2021. Consultado el 18 de julio de 2017 .
  176. "OpenCL y el SDK de aplicaciones de AMD" . AMD Developer Central . developer.amd.com. Archivado del original el 4 de agosto de 2011. Consultado el 11 de agosto de 2011 .
  177. "Acerca de Intel OpenCL SDK 1.1" . software.intel.com . intel.com. Archivado del original el 4 de noviembre de 2011. Consultado el 11 de agosto de 2011 .
  178. "Intel® SDK para aplicaciones OpenCL™ – Notas de la versión" . software.intel.com . 14 de marzo de 2019. Archivado del original el 26 de diciembre de 2019. Consultado el 17 de octubre de 2018 .
  179. "Soporte de producto" . Archivado del original el 23 de junio de 2015. Consultado el 11 de agosto de 2011 .
  180. "Intel OpenCL SDK – Notas de la versión" . Archivado del original el 17 de julio de 2011. Consultado el 11 de agosto de 2011 .
  181. "Anuncio del kit de desarrollo OpenCL para Linux en Power v0.3" . IBM . Archivado del original el 25 de octubre de 2012. Consultado el 11 de agosto de 2011 .
  182. "IBM lanza el kit de desarrollo OpenCL para Linux en Power v0.3: versión compatible con OpenCL 1.1 disponible" . OpenCL Lounge . ibm.com. Archivado del original el 4 de marzo de 2016. Consultado el 11 de agosto de 2011 .
  183. "IBM lanza OpenCL Common Runtime para Linux en arquitectura x86" . IBM . 20 de octubre de 2009. Archivado del original el 4 de marzo de 2016. Consultado el 10 de septiembre de 2011 .
  184. "OpenCL y el SDK de aplicaciones de AMD" . AMD Developer Central . developer.amd.com. Archivado del original el 6 de septiembre de 2011. Consultado el 10 de septiembre de 2011 .
  185. "Nvidia lanza controlador OpenCL" . 22 de abril de 2009. Archivado del original el 6 de marzo de 2021. Consultado el 11 de agosto de 2011 .
  186. "clinfo de Simon Leblanc" . GitHub . Archivado del original el 25 de febrero de 2021. Consultado el 27 de enero de 2017 .
  187. "clinfo by Oblomov" . GitHub . Archivado del original el 24 de febrero de 2021. Consultado el 27 de enero de 2017 .
  188. "clinfo: openCL INFOrmation" . 2 de abril de 2013. Archivado del original el 5 de agosto de 2020. Recuperado el 27 de enero de 2017 .
  189. "Productos Khronos" . El Grupo Khronos . Archivado del original el 28 de enero de 2017. Consultado el 15 de mayo de 2017 .
  190. "OpenCL-CTS/Test_conformance en main · KhronosGroup/OpenCL-CTS" . GitHub . Archivado del original el 24 de febrero de 2021. Recuperado el 30 de abril de 2020 .
  191. "Problemas · KhronosGroup/OpenCL-CTS" . GitHub .
  192. "Intel Compute-Runtime 20.43.18277 trae soporte para Alder Lake" . Archivado del original el 29 de noviembre de 2020. Recuperado el 17 de noviembre de 2020 .
  193. "compute-runtime" . 01.org . 7 de febrero de 2018. Archivado del original el 18 de enero de 2021. Consultado el 10 de abril de 2018 .
  194. 1 2 Fang, Jianbin; Varbanescu, Ana Lucia; Sips, Henk (2011). "Una comparación exhaustiva del rendimiento de CUDA y OpenCL". Conferencia Internacional de Procesamiento Paralelo de 2011. Actas de la Conferencia Internacional de Procesamiento Paralelo. págs. 216–225 . doi : 10.1109/ICPP.2011.45 . ISBN  978-1-4577-1336-1.
  195. Du, Peng; Weber, Rick; Luszczek, Piotr; Tomov, Stanimire; Peterson, Gregory; Dongarra, Jack (agosto de 2012). "De CUDA a OpenCL: hacia una solución de rendimiento portátil para la programación de GPU multiplataforma". Computación paralela . 38 (8): 391– 407. doi : 10.1016/j.parco.2011.10.002 .
  196. Dolbeau, Romain; Bodin, François; de Verdière, Guillaume Colin (7 de septiembre de 2013). "¿Un OpenCL para gobernarlos a todos?". 2013 IEEE 6th International Workshop on Multi-/Many-core Computing Systems (MuCoCoS) . págs. 1–6 . doi : 10.1109/MuCoCoS.2013.6633603 . ISBN  978-1-4799-1010-6.
  197. Karimi, Kamran; Dickson, Neil G.; Hamze, Firas (2011). "Una comparación de rendimiento de CUDA y OpenCL". arXiv : 1005.2581v3 [ cs.PF ].
  198. Un estudio sobre técnicas de computación heterogénea CPU-GPU, ACM Computing Surveys, 2015.
  199. Grewe, Dominik; O'Boyle, Michael FP (2011). "Un enfoque de partición estática de tareas para sistemas heterogéneos usando OpenCL". Construcción de compiladores . Actas de la Conferencia Internacional sobre Construcción de Compiladores. Notas de clase en Ciencias de la Computación. Vol. 6601. págs. 286–305 . doi : 10.1007/978-3-642-19861-8_16 . ISBN   978-3-642-19860-1.
  200. "La serie Radeon RX 6800 ofrece un excelente rendimiento OpenCL basado en ROCm en Linux" . www.phoronix.com . Archivado del original el 4 de febrero de 2023. Consultado el 4 de febrero de 2023 .
  • Sitio web oficial
  • Sitio web oficial deWebCL
  • Taller internacional sobre OpenCL archivado el 26 de enero de 2021 en Wayback Machine ( IWOCL ), patrocinado por The Khronos Group.