stringtranslate.com

OpenCL

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

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

Descripción general

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]

Jerarquía de memoria

OpenCL define una jerarquía de memoria de cuatro niveles para el dispositivo informático: [13]

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.

Lenguaje del kernel OpenCL

El lenguaje de programación que se utiliza para escribir núcleos informáticos se llama lenguaje de núcleo. OpenCL adopta lenguajes basados ​​en C / C++ para especificar los cálculos del kernel realizados en el dispositivo con algunas restricciones y adiciones para facilitar el mapeo eficiente de los heterogéneos recursos de hardware de los aceleradores. Tradicionalmente, OpenCL C se usaba para programar los aceleradores en el estándar OpenCL; más tarde se desarrolló C++ para el lenguaje del kernel OpenCL que heredó todas las funciones de OpenCL C pero permitió usar características de C++ en las fuentes del kernel.

Lenguaje OpenCL C

OpenCL C [20] es un dialecto de lenguaje basado en C99 adaptado para adaptarse al modelo de dispositivo en OpenCL. Los buffers 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 como __kernel para indicar que son puntos de entrada al programa que se llamarán desde el programa host. Se omiten los punteros de función , los campos de bits y las matrices de longitud variable y se prohíbe la recursividad . [21] 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 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.

El siguiente es un algoritmo de multiplicación de matrices y vectores en OpenCL C.

// 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 256   clEnqueueNDRangeKernel ( 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 giro                     localShuffle ( 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]

Ejemplo: aritmética de números complejos

El siguiente fragmento de código ilustra cómo se pueden implementar núcleos con aritmética de números complejos en C++ para el lenguaje OpenCL con un uso conveniente de las funciones de C++.

// 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:

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:

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:

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:

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]

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]

Mapa vial

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

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

Dispositivos

A partir de 2016, OpenCL se ejecuta en unidades de procesamiento de gráficos (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 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]

Soporte OpenCL 2.2

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

Soporte OpenCL 2.1

Soporte OpenCL 2.0

Soporte OpenCL 1.2

Soporte OpenCL 1.1

Soporte OpenCL 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]

Ver también

Referencias

  1. ^ "La especificación OpenCL".
  2. ^ "Dispositivos Android compatibles con OpenCL". Documentos de Google . ArrayFire . Consultado el 28 de abril de 2015 .
  3. ^ "Gráficos FreeBSD/OpenCL". FreeBSD . Consultado el 23 de diciembre de 2015 .
  4. ^ abcde "Productos conformes". Grupo Khronos . Consultado el 9 de mayo de 2015 .
  5. ^ 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 .
  6. ^ 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 .
  7. ^ "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 .
  8. ^ "Empresas conformes". Grupo Khronos . Consultado el 8 de abril de 2015 .
  9. ^ 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 .
  10. ^ 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 .
  11. ^ 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.
  12. ^ 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 .
  13. ^ 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. 
  14. ^ 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.
  15. ^ "OpenCL - Enlaces de lenguajes informáticos abiertos". metacpan.org . Consultado el 18 de agosto de 2018 .
  16. ^ "Enlace D para OpenCL". dlang.org . Consultado el 29 de junio de 2021 .
  17. ^ "SPIR: el primer lenguaje intermedio estándar abierto para gráficos y computación paralela". Grupo Khronos . 21 de enero del 2014.
  18. ^ "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 .
  19. ^ abc "C ++ para OpenCL, Guía OpenCL". GitHub . Consultado el 18 de abril de 2021 .
  20. ^ abc Munshi, Aaftab, ed. (2014). "La especificación OpenCL C, versión 2.0" (PDF) . Consultado el 24 de junio de 2014 .
  21. ^ 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 .
  22. ^ "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 .
  23. ^ "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 .
  24. ^ "AbrirCL_FFT". Manzana. 26 de junio de 2012 . Consultado el 18 de junio de 2022 .
  25. ^ Trevett, Neil (28 de abril de 2020). "Anuncios y panel de discusión de Khronos" (PDF) .
  26. ^ 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. ISBN 978-1-4503-7531-3. S2CID  216554183.
  27. ^ ab KhronosGroup/OpenCL-Docs, The Khronos Group, 16 de abril de 2021 , consultado el 18 de abril de 2021
  28. ^ "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 .
  29. ^ "Clang 9, extensiones de idioma, OpenCL". lanzamientos.llvm.org . Septiembre de 2019 . Consultado el 18 de abril de 2021 .
  30. ^ "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 .
  31. ^ "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 .
  32. ^ ab "Documentación del lenguaje de programación C ++ para OpenCL 1.0". www.khronos.org . Consultado el 18 de abril de 2021 .
  33. ^ 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 .
  34. ^ "cl_ext_cxx_for_opencl". www.khronos.org . Septiembre 2020 . Consultado el 18 de abril de 2021 .
  35. ^ "Mali SDK admite la compilación de kernels en C++ para OpenCL". comunidad.arm.com . Diciembre 2020 . Consultado el 18 de abril de 2021 .
  36. ^ "Manual del usuario del compilador Clang: C ++ para compatibilidad con OpenCL". clang.llvm.org . Consultado el 18 de abril de 2021 .
  37. ^ "Guía OpenCL, compilación sin conexión de fuentes del kernel OpenCL". GitHub . Consultado el 18 de abril de 2021 .
  38. ^ "Guía OpenCL, programación de kernels OpenCL". GitHub . Consultado el 18 de abril de 2021 .
  39. ^ 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
  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 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 .
  42. ^ "OpenCL se promociona en Texas". MacWorld. 20 de noviembre de 2008 . Consultado el 12 de junio de 2009 .
  43. ^ "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 .
  44. ^ "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 .
  45. ^ "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 .
  46. ^ "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 .
  47. ^ "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 .
  48. ^ "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 .
  49. ^ "Kit de desarrollo OpenCL para Linux on Power". trabajos alfa. 30 de octubre de 2009 . Consultado el 30 de octubre de 2009 .
  50. ^ "Estándar Opencl: descripción general | Temas de ScienceDirect". www.sciencedirect.com .
  51. ^ "Versión de la especificación OpenCL: 1.0 Revisión del documento: 48" (PDF) . Grupo de trabajo Khronos OpenCL.
  52. ^ "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 .
  53. ^ "Khronos lanza la especificación OpenCL 1.2". Grupo Khronos. 15 de noviembre de 2011 . Consultado el 23 de junio de 2015 .
  54. ^ a b "Especificación de OpenCL 1.2" (PDF) . Grupo Khronos . Consultado el 23 de junio de 2015 .
  55. ^ "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 .
  56. ^ "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 .
  57. ^ "Khronos anuncia OpenCL 2.1: C ++ llega a OpenCL". AnandTech. 3 de marzo de 2015 . Consultado el 8 de abril de 2015 .
  58. ^ "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 .
  59. ^ "Descripción general de OpenCL". Grupo Khronos. 21 de julio de 2013.
  60. ^ 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.
  61. ^ Trevett, Neil (abril de 2016). "OpenCL: el estado de la Unión" (PDF) . IWOCL . Viena : Grupo Khronos . Consultado el 2 de enero de 2017 .
  62. ^ "Khronos lanza OpenCL 2.2 con SPIR-V 1.2". Grupo Khronos . 16 de mayo de 2017.
  63. ^ ab "Lanzada la actualización de mantenimiento de OpenCL 2.2". El grupo Khronos . 14 de mayo de 2018.
  64. ^ "OpenCL 3.0 ofrece mayor flexibilidad y extensiones Async DMA". www.phoronix.com .
  65. ^ "Khronos Group lanza OpenCL 3.0". 26 de abril de 2020.
  66. ^ "La especificación OpenCL" (PDF) . Grupo de trabajo Khronos OpenCL.
  67. ^ https://www.iwocl.org/wp-content/uploads/k03-iwocl-syclcon-2021-trevett-updated.mp4.pdf [ URL básica PDF ]
  68. ^ "Uso de extensiones de memoria compartida y semáforo para Vulkan Interop con NVIDIA OpenCL". 24 de febrero de 2022.
  69. ^ "OpenCL 3.0.14 lanzado con una nueva extensión para múltiples dispositivos de búfer de comandos".
  70. ^ "Ú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 .
  71. ^ "SIGGRAPH 2018: OpenCL-Next tomando forma, Vulkan continúa evolucionando - Phoronix". www.phoronix.com .
  72. ^ "Actualización de Vulkan SIGGRAPH 2019" (PDF) .
  73. ^ Trevett, Neil (23 de mayo de 2019). "Taller EVS de descripción general de Khronos y OpenCL el 19 de mayo" (PDF) . Grupo Khronos .
  74. ^ "Especificación ICD de OpenCL" . Consultado el 23 de junio de 2015 .
  75. ^ "Entrada de Apple en la página de usuarios de LLVM" . Consultado el 29 de agosto de 2009 .
  76. ^ "Entrada de Nvidia en la página de usuarios de LLVM" . Consultado el 6 de agosto de 2009 .
  77. ^ "Entrada de Rapidmind en la página de usuarios de LLVM" . Consultado el 1 de octubre de 2009 .
  78. ^ "Publicación del blog de Zack Rusin sobre la implementación de Gallium3D OpenCL". Febrero de 2009 . Consultado el 1 de octubre de 2009 .
  79. ^ "Computación de galio". dri.freedesktop.org . Consultado el 23 de junio de 2015 .
  80. ^ "Actualización de estado de Clover" (PDF) .
  81. ^ "mesa/mesa: biblioteca de gráficos 3D de Mesa". cgit.freedesktop.org .
  82. ^ "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 .
  83. ^ Clark, Rob; Herbst, Karol (2018). "Soporte de OpenCL dentro de mesa a través de SPIR-V y NIR" (PDF) .
  84. ^ "La implementación 'Rusticl' de Mesa ahora logra manejar Darktable OpenCL".
  85. ^ "Rusticl de Mesa logra la conformidad oficial con OpenCL 3.0".
  86. ^ "Mesa 22.3 lanzada con RDNA3 Vulkan, Rusticl OpenCL y mejores gráficos Intel Arc".
  87. ^ "El controlador Rusticl OpenCL de Mesa está casi listo con compatibilidad con GPU AMD Radeon".
  88. ^ "La implementación de Rusticl OpenCL de Mesa puede superar a la pila de computación ROCm de Radeon".
  89. ^ "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 .
  90. ^ "Presentación de OpenCL y OpenGL en DirectX". Colabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
  91. ^ "Profundización en OpenGL sobre capas DirectX". Colabora | Consultoría de código abierto . Consultado el 23 de octubre de 2023 .
  92. ^ Larabel, Michael (10 de enero de 2013). "Beignet: OpenCL/GPGPU viene para Ivy Bridge en Linux". Forónix .
  93. ^ Larabel, Michael (16 de abril de 2013). "Más críticas llegan hacia Beignet OpenCL de Intel". Forónix .
  94. ^ Larabel, Michael (24 de diciembre de 2013). "Beignet OpenCL de Intel todavía se está horneando lentamente". Forónix .
  95. ^ "Beignet". freedesktop.org.
  96. ^ "beignet - Biblioteca Beignet OpenCL para Intel Ivy Bridge y GPU más nuevas". cgit.freedesktop.org .
  97. ^ "Intel lleva Beignet a Android para OpenCL Compute - Phoronix". www.phoronix.com .
  98. ^ "01.org Intel Open Source: tiempo de ejecución de cómputo". 7 de febrero de 2018.
  99. ^ "NEO GitHub LÉAME". GitHub . 21 de marzo de 2019.
  100. ^ "República de China". GitHub . Archivado desde el original el 8 de octubre de 2016.
  101. ^ "RadeonOpenCompute/ROCm: ROCm: plataforma de código abierto para HPC y computación GPU ultraescala". GitHub. 21 de marzo de 2019.
  102. ^ "Una buena descripción general de la pila informática ROCm Linux: Phoronix". www.phoronix.com .
  103. ^ "XDC Lightning.pdf". Documentos de Google .
  104. ^ "Radeon ROCm 2.0 oficialmente disponible con soporte OpenCL 2.0, TensorFlow 1.12, Vega VA de 48 bits - Phoronix". www.phoronix.com .
  105. ^ "Tomando Radeon ROCm 2.0 OpenCL para una prueba de evaluación comparativa: Phoronix". www.phoronix.com .
  106. ^ https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf [ enlace muerto ]
  107. ^ "Radeon ROCm 3.5 lanzado con nuevas funciones pero aún sin soporte Navi - Phoronix".
  108. ^ "Lanzamiento de Radeon ROCm 3.10 con mejoras en las herramientas del centro de datos y nuevas API: Phoronix".
  109. ^ "AMD lanza Arcturus como Instinct MI100, Radeon ROCm 4.0 - Phoronix".
  110. ^ "Bienvenido a la plataforma AMD ROCm ™: documentación ROCm Documentación 1.0.0".
  111. ^ "Inicio". docs.amd.com .
  112. ^ "Documentación de AMD: portal".
  113. ^ 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.
  114. ^ abc "página de inicio de pocl". pocl .
  115. ^ "GitHub - pocl/pocl: pocl: lenguaje informático portátil". 14 de marzo de 2019 – vía GitHub.
  116. ^ "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 .
  117. ^ "Página de inicio de PoCL".
  118. ^ "Página de inicio de PoCL".
  119. ^ "Página de inicio de PoCL".
  120. ^ "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 .
  121. ^ https://www.iwocl.org/wp-content/uploads/30-iwocl-syclcon-2021-baumann-slides.pdf [ URL básica PDF ]
  122. ^ "Página de inicio de PoCL".
  123. ^ "Página de inicio de PoCL".
  124. ^ "Página de inicio de PoCL".
  125. ^ "Página de inicio de PoCL".
  126. ^ "Acerca de". Git.Linaro.org .
  127. ^ 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 .
  128. ^ "zuzuf/freeocl". GitHub . Consultado el 13 de abril de 2017 .
  129. ^ 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.
  130. ^ "Estado". GitHub . 16 de marzo de 2022.
  131. ^ "Demostración de OpenCL, CPU AMD". YouTube . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
  132. ^ "Demostración de OpenCL, GPU Nvidia". YouTube . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
  133. ^ "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 .
  134. ^ "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 .
  135. ^ "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 .
  136. ^ "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 ]
  137. ^ 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 .
  138. ^ "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 .
  139. ^ "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 .
  140. ^ "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 .
  141. ^ "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 .
  142. ^ "OpenCL". ZiiLABS . Consultado el 23 de junio de 2015 .
  143. ^ "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 .
  144. ^ http://reference.wolfram.com/mathematica/OpenCLLink/tutorial/Overview.html
  145. ^ "Historias relacionadas con WebCL". Grupo Khronos . Consultado el 23 de junio de 2015 .
  146. ^ "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 .
  147. ^ "Desarrollador de IBM". desarrollador.ibm.com .
  148. ^ "Bienvenido a Wikis". www.ibm.com . 20 de octubre de 2009.
  149. ^ "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 .
  150. ^ 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 .
  151. ^ "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 .
  152. ^ "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 ]
  153. ^ "The Portland Group anuncia el compilador OpenCL para SoC NovaThor basados ​​en ARM de ST-Ericsson" . Consultado el 4 de mayo de 2012 .
  154. ^ "Ú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 .
  155. ^ "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 .
  156. ^ "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 .
  157. ^ "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 .
  158. ^ "Comunicado de prensa de WebCL 1.0". Grupo Khronos. 19 de marzo de 2014 . Consultado el 23 de junio de 2015 .
  159. ^ "Especificación WebCL 1.0". Grupo Khronos. 14 de marzo de 2014 . Consultado el 23 de junio de 2015 .
  160. ^ "Controlador Intel OpenCL 2.0". Archivado desde el original el 17 de septiembre de 2014 . Consultado el 14 de octubre de 2014 .
  161. ^ "Controlador AMD OpenCL 2.0". Soporte.AMD.com . 17 de junio de 2015 . Consultado el 23 de junio de 2015 .
  162. ^ "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 .
  163. ^ "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 .
  164. ^ "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 .
  165. ^ "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.
  166. ^ "¿Qué hay de nuevo? Intel® SDK para aplicaciones OpenCL™ 2016, R3". Software Intel.
  167. ^ "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 .
  168. ^ Szuppe, Jakub (22 de febrero de 2017). "NVIDIA habilita la compatibilidad beta con OpenCL 2.0".
  169. ^ Szuppe, Jakub (6 de marzo de 2017). "La compatibilidad beta de NVIDIA para OpenCL 2.0 también funciona en Linux".
  170. ^ "El Grupo Khronos". El grupo Khronos . 21 de marzo de 2019.
  171. ^ "GitHub: RadeonOpenCompute/ROCm en roc-3.5.0". GitHub .
  172. ^ ab "NVIDIA ahora es compatible con OpenCL 3.0". 12 de abril de 2021.
  173. ^ a b c "El Grupo Khronos". El grupo Khronos . 12 de diciembre de 2022 . Consultado el 12 de diciembre de 2022 .
  174. ^ "Rusticl de Mesa logra la conformidad oficial con OpenCL 3.0". www.phoronix.com . Consultado el 12 de diciembre de 2022 .
  175. ^ "El Grupo Khronos". El grupo Khronos . 20 de agosto de 2019 . Consultado el 20 de agosto de 2019 .
  176. ^ "KhronosGroup/OpenCL-CTL: las pruebas de conformidad de OpenCL". GitHub. 21 de marzo de 2019.
  177. ^ "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 .
  178. ^ "Acerca de Intel OpenCL SDK 1.1". software.intel.com . intel.com . Consultado el 11 de agosto de 2011 .
  179. ^ "Intel® SDK para aplicaciones OpenCL™: notas de la versión". software.intel.com . 14 de marzo de 2019.
  180. ^ "Soporte de producto" . Consultado el 11 de agosto de 2011 .
  181. ^ "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 .
  182. ^ "Anuncio del kit de desarrollo OpenCL para Linux en Power v0.3". IBM . Consultado el 11 de agosto de 2011 .
  183. ^ "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 .
  184. ^ "IBM lanza OpenCL Common Runtime para Linux en arquitectura x86". IBM . 20 de octubre de 2009 . Consultado el 10 de septiembre de 2011 .
  185. ^ "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 .
  186. ^ "Nvidia lanza el controlador OpenCL". 22 de abril de 2009 . Consultado el 11 de agosto de 2011 .
  187. ^ "clinfo de Simon Leblanc". GitHub . Consultado el 27 de enero de 2017 .
  188. ^ "información de Oblomov". GitHub . Consultado el 27 de enero de 2017 .
  189. ^ "clinfo: información openCL". 2 de abril de 2013 . Consultado el 27 de enero de 2017 .
  190. ^ "Productos Khronos". El grupo Khronos . Consultado el 15 de mayo de 2017 .
  191. ^ "OpenCL-CTS/Test_conformance en principal · KhronosGroup/OpenCL-CTS". GitHub .
  192. ^ "Problemas · KhronosGroup/OpenCL-CTS". GitHub .
  193. ^ "Intel Compute-Runtime 20.43.18277 brinda soporte para Alder Lake".
  194. ^ "tiempo de ejecución de cálculo". 01.org . 7 de febrero de 2018.
  195. ^ 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. ISBN 978-1-4577-1336-1.
  196. ^ 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. 
  197. ^ 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. ISBN 978-1-4799-1010-6. S2CID  225784.
  198. ^ Karimi, Kamran; Dickson, Neil G.; Hamze, Firas (2011). "Una comparación de rendimiento de CUDA y OpenCL". arXiv : 1005.2581v3 [cs.PF].
  199. ^ Una encuesta sobre técnicas de computación heterogénea CPU-GPU, ACM Computing Surveys, 2015.
  200. ^ 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 . ISBN 978-3-642-19860-1.
  201. ^ "La serie Radeon RX 6800 tiene un excelente rendimiento OpenCL basado en ROCm en Linux". www.phoronix.com .

enlaces externos