De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

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

OpenCL es un estándar abierto mantenido por el consorcio tecnológico sin fines de lucro Khronos Group . Las implementaciones compatibles están disponibles en Altera , AMD , Apple (OpenCL junto con OpenGL está obsoleto para el hardware de Apple, a favor de Metal 2 [8] ), ARM , Creative , IBM , Imagination , Intel , Nvidia , Qualcomm , Samsung , Vivante , Xilinx y ZiiLABS. [9] [10]

Resumen [ editar ]

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

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

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

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

Jerarquía de la memoria [ editar ]

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

  • memoria global: compartida por todos los elementos de procesamiento, pero tiene una latencia de acceso alta ( __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 se relaja y solo se refuerza mediante construcciones de sincronización explícitas , en particular barreras .

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

Lenguaje del kernel de OpenCL [ editar ]

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 a los recursos de hardware heterogéneos 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ó toda la funcionalidad de OpenCL C pero permitió usar las características de C ++ en las fuentes del kernel.

Lenguaje OpenCL C [ editar ]

OpenCL C [20] 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 se anotan 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á desde el programa anfitrión. Punteros de función , campos de bits ySe omiten 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 de vectores y operaciones, 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); dichos tipos de vectores están disponibles en longitudes de 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 correlacionarse con conjuntos de instrucciones SIMD , por ejemplo, SSE o VMX , cuando se ejecutan programas OpenCL en CPU. [14] Otros tipos especializados incluyen tipos de imágenes 2-d y 3-d. [20] : 10–11

Ejemplo: multiplicación matriz-vector [ editar ]

Cada invocación ( elemento de trabajo ) del kernel toma una fila de la matriz verde ( A en el código), multiplica esta fila con el vector rojo ( x ) y coloca el resultado en una entrada del vector azul ( y ). El número de columnas n se pasa al kernel como ncols ; el número de filas está implícito en el número de elementos de trabajo producidos por el programa anfitrión.

El siguiente es un algoritmo de multiplicación matriz-vector 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  float  sum  =  0.f ;  // Acumulador de producto  escalar para  ( 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 mapea el kernel sobre las filas de la matriz. En el lado del host, la función clEnqueueNDRangeKernel hace esto; que toma como argumentos al kernel para ejecutar, sus argumentos, y una serie de elementos de trabajo, correspondiente al número de filas de la matriz A .

Ejemplo: calcular la FFT [ editar ]

Este ejemplo cargará una implementación rápida de la transformada 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 búferes de memoria para lectura y escritura (desde la perspectiva de la tarjeta gráfica), JIT-compila el kernel FFT y finalmente ejecuta el kernel de forma asíncrona. El resultado de la transformación no se lee en este ejemplo.

#include  <stdio.h>#include  <time.h># include  "CL / opencl.h"#define NUM_ENTRIES 1024int  main ()  // (int argc, const char * argv []) { // CONSTANTS // El código fuente del kernel se representa como una cadena // ubicada dentro del archivo: "fft1D_1024_kernel_src.cl". Para obtener más detalles, consulte la siguiente lista. const  char  * KernelSource  = #include  "fft1D_1024_kernel_src.cl";// Buscando las GPU disponibles const  cl_uint  num  =  1 ; clGetDeviceIDs ( NULL ,  CL_DEVICE_TYPE_GPU ,  0 ,  NULL ,  ( cl_uint * ) & num ); dispositivos cl_device_id [ 1 ]; clGetDeviceIDs ( NULL ,  CL_DEVICE_TYPE_GPU ,  num ,  dispositivos ,  NULL );// crea un contexto de cálculo con el dispositivo GPU cl_context  context  =  clCreateContextFromType ( NULL ,  CL_DEVICE_TYPE_GPU ,  NULL ,  NULL ,  NULL );// crea una cola de comandos clGetDeviceIDs ( NULL ,  CL_DEVICE_TYPE_DEFAULT ,  1 ,  devices ,  NULL ); cl_command_queue  queue  =  clCreateCommandQueue ( contexto ,  dispositivos [ 0 ],  0 ,  NULL );// asignar objetos la memoria intermedia cl_mem  memobjs []  =  {  clCreateBuffer ( contexto ,  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 )  };// cl_mem memobjs [0] = // CORREGIDO, VER ARRIBA // cl_mem memobjs [1] = // CORREGIDO, VER ARRIBA// crea el programa de cálculo // const char * fft1D_1024_kernel_src [1] = {}; programa cl_program  = clCreateProgramWithSource ( contexto , 1 , ( const char ** ) & KernelSource , NULL , NULL );         // construye el programa de cálculo ejecutable clBuildProgram ( programa ,  0 ,  NULL ,  NULL ,  NULL ,  NULL );// crea el kernel de cálculo cl_kernel  kernel  =  clCreateKernel ( programa ,  "fft1D_1024" ,  NULL );// establecer los valores de los argumentossize_t  tamaño_trabajo_local [ 1 ]  =  {  256  };clSetKernelArg ( kernel ,  0 ,  sizeof ( cl_mem ),  ( void  * ) y memobjs [ 0 ]); clSetKernelArg ( kernel ,  1 ,  sizeof ( cl_mem ),  ( void  * ) y memobjs [ 1 ]); clSetKernelArg ( kernel ,  2 ,  sizeof ( float ) * ( local_work_size [0 ]  +  1 )  *  16 ,  NULO ); clSetKernelArg ( kernel ,  3 ,  sizeof ( float ) * ( local_work_size [ 0 ]  +  1 )  *  16 ,  NULL );// crea un objeto de rango ND con dimensiones de elemento de trabajo y ejecuta kernel size_t  global_work_size [ 1 ]  =  {  256  };tamaño_trabajo_global [ 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 Fitting FFT into the G80 Architecture ): [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  * in ,  __global  float2  * out ,  __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 ;  out  =  out  +  blockIdx ; globalLoads ( datos ,  en ,  64 );  // lecturas globales fusionadas  fftRadix16Pass ( data );  // en el lugar radix-16 pass  twiddleFactorMul ( data ,  tid ,  1024 ,  0 ); //  Mezcla local usando la memoria local localShuffle ( data ,  sMemx ,  sMemy ,  tid ,  ((( tid  &  15 )  *  65 )  +  ( tid  >>  4 )));  fftRadix16Pass ( datos );  // en el lugar radix-16 pass  twiddleFactorMul ( data ,  tid ,  64 ,  4 );  // multiplicación de factores twiddle localShuffle ( datos ,  sMemx ,  sMemy ,  tid ,  ((( tid  >>  4 )  *  64 )  +  ( tid  &  15 ))); // cuatro llamadas de función radix-4  fftRadix4Pass ( data );  // número de función radix-4 1  fftRadix4Pass ( data  +  4 );  // número de función radix-4 2  fftRadix4Pass ( data  +  8 );  // número de función radix-4 3  fftRadix4Pass ( data  +  12 );  // radix-4 función número 4 // escrituras globales fusionadas  globalStores ( data ,  out ,  64 );  } ) "

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

C ++ para lenguaje OpenCL [ editar ]

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 gran variedad de características del lenguaje de C ++ estándar mientras preserva la compatibilidad con versiones anteriores a OpenCL C. Esto abre una ruta de transición sin problemas a la funcionalidad de C ++ para los desarrolladores de código del kernel de OpenCL, ya que pueden continuar usando un 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á ratificado 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 de código abierto Clang ha admitido C ++ para OpenCL desde la versión 9. [28]

C ++ para OpenCL se desarrolló originalmente como una extensión del compilador de 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 ha vuelto 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 retrocompatible con OpenCL C 2.0. En el sitio web de Khronos se puede encontrar un borrador de trabajo en progreso de su documentación. [31]

Funciones [ editar ]

C ++ para OpenCL es compatible con la mayoría de las funciones (sintáctica y semánticamente) de OpenCL C, excepto el paralelismo y los bloques anidados. [32] Sin embargo, existen pequeñas diferencias en algunas características soportadas principalmente relacionadas con diferencias semánticas entre C ++ y C. Por ejemplo, C ++ es más estricto con las conversiones de tipo implícitas y no soporta el calificador de tipo restrictivo . [32] Las siguientes características de C ++ no son compatibles con C ++ para OpenCL: funciones virtuales, operador dynamic_cast , operadores nuevos / eliminados sin ubicación , excepciones, puntero a funciones miembro, referencias a funciones, bibliotecas estándar de C ++. [32]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, 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. [32]

Ejemplo: aritmética de números complejos [ editar ]

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

// Defina una clase Complex, que pueda realizar cálculos de números complejos con // precisión diversa cuando se utilizan diferentes tipos de T: double, float, half. plantilla < 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 }  {}; // Definir 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  *  otro . m_im ,  m_re  *  otro .m_im  +  m_im  *  otro . m_re }; } int  get_re ()  const  {  return  m_re ;  } int  get_im ()  const  {  return  m_im ;  } };// Una función auxiliar para calcular la multiplicación sobre números complejos leídos desde // el búfer de entrada y para almacenar el resultado calculado en el búfer de salida. plantilla < 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 para cada número complejo.  desplazamiento automático  = idx * 4 ; auto      num1  =  complex_t { en [ desplazamiento ],  en [ desplazamiento  +  1 ]};  auto  num2  =  complex_t { en [ desplazamiento  +  2 ],  en [ desplazamiento  +  3 ]};  // Realiza multiplicaciones de números complejos.  auto  res  =  num1  *  num2 ;  // 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  * in ,  __global  float  * out )  {  compute_helper ( in ,  out ); }#ifdef cl_khr_fp16 // Este kernel se utiliza para la multiplicación de números complejos con la mitad de precisión cuando // es compatible con el dispositivo. #pragma OPENCL EXTENSION cl_khr_fp16: habilitar __kernel  void  compute_hp ( __global  half  * in ,  __global  half  * out )  {  compute_helper ( in ,  out );  } #endif

Entorno de ejecución y herramientas [ editar ]

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 gran 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 puede ser compilado por controladores OpenCL que admiten la extensión cl_ext_cxx_for_opencl . [33] Arm ha anunciado el soporte para esta extensión en diciembre de 2020. [34] 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 fuera de línea utilizando compiladores independientes como Clang [35] en formato binario ejecutable o formato binario portátil, por ejemplo, SPIR-V. [36] Un ejecutable de este tipo se puede cargar durante la ejecución de aplicaciones OpenCL utilizando una API OpenCL dedicada. [37]

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 utilizando el compilador clspv [38] y la capa de tiempo de ejecución clvk [39] de la misma manera que los núcleos OpenCL C.

Contribuciones [ editar ]

C ++ para OpenCL es un lenguaje abierto desarrollado por la comunidad de colaboradores enumerados en su documentación [31] . Las nuevas contribuciones a la definición semántica del lenguaje o al soporte de herramientas de código abierto son aceptadas por cualquier persona interesada tan pronto como estén alineadas con la filosofía de diseño principal y sean revisadas y aprobadas por los colaboradores experimentados. [19]

Historia [ editar ]

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 los 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 [40] 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. [41]Esta especificación técnica fue revisada por los miembros de Khronos y aprobada para su publicación el 8 de diciembre de 2008. [42]

OpenCL 1.0 [ editar ]

OpenCL 1.0 lanzado con Mac OS X Snow Leopard el 28 de agosto de 2009. Según un comunicado de prensa de Apple: [43]

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 de gráficos. OpenCL se basa en el lenguaje de programación C y se ha propuesto como estándar abierto.

AMD decidió admitir OpenCL en lugar del ahora obsoleto Close to Metal en su marco Stream . [44] [45] RapidMind anunció su adopción de OpenCL debajo de su plataforma de desarrollo para soportar GPU de múltiples proveedores con una sola interfaz. [46] 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. [47] El 30 de octubre de 2009, IBM lanzó su primera implementación OpenCL como parte de los compiladores XL . [48]

La aceleración de los cálculos con factor de 1000 es posible con OpenCL en tarjetas gráficas contra CPU normal.[49] Algunas características importantes de la próxima versión de OpenCL son opcionales en 1.0 como operaciones de precisión doble o precisión media. [50]

OpenCL 1.1 [ editar ]

OpenCL 1.1 fue ratificado por Khronos Group 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, que incluyen:

  • Nuevos tipos de datos, incluidos vectores de 3 componentes y formatos de imagen adicionales;
  • Manejo de comandos de múltiples subprocesos de host y búferes de procesamiento en múltiples dispositivos;
  • Operaciones en regiones de un búfer que incluyen lectura, escritura y copia de regiones rectangulares 1D, 2D o 3D;
  • Uso mejorado de eventos para impulsar y controlar la ejecución de comandos;
  • Funciones adicionales de C incorporadas de OpenCL, como la sujeción de enteros, la reproducción aleatoria y las copias escalonadas asíncronas;
  • Interoperabilidad OpenGL mejorada mediante el uso compartido eficiente de imágenes y búferes mediante la vinculación de eventos OpenCL y OpenGL.

OpenCL 1.2 [ editar ]

El 15 de noviembre de 2011, Khronos Group anunció la especificación OpenCL 1.2, [52] que agregó una funcionalidad significativa sobre las versiones anteriores en términos de rendimiento y características para la programación paralela. Las características más notables incluyen:

  • Partición de dispositivos: la capacidad de dividir un dispositivo en subdispositivos para que las asignaciones de trabajo se puedan asignar a unidades de cálculo individuales. Esto es útil para reservar áreas del dispositivo para reducir la latencia para tareas de tiempo crítico.
  • Compilación separada y vinculación de objetos: la funcionalidad para compilar OpenCL en bibliotecas externas para su inclusión en otros programas.
  • Soporte de imagen mejorado: 1.2 agrega soporte para imágenes 1D y matrices de imágenes 1D / 2D. Además, las extensiones para compartir de OpenGL ahora permiten utilizar texturas OpenGL 1D y matrices de texturas 1D / 2D para crear imágenes OpenCL.
  • Núcleos integrados: los dispositivos personalizados que contienen una funcionalidad única específica ahora se integran más de cerca en el marco OpenCL. Se puede llamar a los núcleos para utilizar aspectos especializados o no programables del hardware subyacente. Los ejemplos incluyen codificación / decodificación de video y procesadores de señales digitales.
  • Funcionalidad DirectX: el uso compartido de superficies multimedia DX9 permite compartir de manera eficiente entre superficies multimedia OpenCL y DX9 o DXVA . Del mismo modo, para DX11, se habilita el uso compartido transparente entre superficies OpenCL y DX11.
  • La capacidad de forzar el cumplimiento de IEEE 754 para matemáticas de punto flotante de precisión simple: OpenCL por defecto permite que las versiones de precisión simple de la operación 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 comando "-cl-fp32-correctamente-redondeado-dividir-sqrt" al compilador, estas tres operaciones se calcularán según los requisitos de IEEE 754 si la implementación de OpenCL lo admite, y no compilar 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 [ editar ]

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. [54] Las actualizaciones y adiciones a OpenCL 2.0 incluyen:

  • Memoria virtual compartida
  • Paralelismo anidado
  • Espacio de direcciones genérico
  • Imagenes
  • Atomics C11
  • Tubería
  • Extensión de controlador de cliente instalable de Android

OpenCL 2.1 [ editar ]

La ratificación y el lanzamiento de la especificación provisional de 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. [55] Introdujo el lenguaje del kernel OpenCL C ++, basado en un subconjunto de C ++ 14 , al mismo tiempo que mantenía el soporte para el lenguaje del kernel OpenCL C preexistente. Vulkan y OpenCL 2.1 comparten SPIR-V como una representación intermedia que permite que las interfaces de lenguaje de alto nivel compartan un objetivo de compilación común. Las actualizaciones de la API de OpenCL incluyen:

  • Funcionalidad de subgrupo adicional
  • Copia de estados y objetos del kernel
  • Consultas de temporizador de dispositivo de baja latencia
  • Ingestión de código SPIR-V por tiempo 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 compatibilidad con OpenCL 2.1. [56] [57]

OpenCL 2.2 [ editar ]

OpenCL 2.2 trae el lenguaje del kernel OpenCL C ++ a la especificación central 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 kernel OpenCL C ++ es un subconjunto estático del estándar C ++ 14 e incluye clases, plantillas, expresiones lambda, sobrecargas de funciones y muchas otras construcciones para genéricos y metaprogramación.
  • Utiliza el nuevo lenguaje intermedio Khronos SPIR-V 1.1 que es totalmente compatible con el lenguaje del kernel OpenCL C ++.
  • Las funciones de la biblioteca OpenCL ahora pueden usar el lenguaje C ++ para proporcionar una mayor seguridad y un comportamiento indefinido reducido al acceder a funciones como atómicas, iteradores, imágenes, muestreadores, tuberías y tipos integrados de cola de dispositivos y espacios de direcciones.
  • El almacenamiento de tuberías es un nuevo tipo de dispositivo en OpenCL 2.2 que es útil para implementaciones de FPGA al hacer que el tamaño y el tipo de conectividad se conozcan en el momento de la compilación, lo que permite una comunicación eficiente del alcance del dispositivo entre núcleos.
  • OpenCL 2.2 también incluye características para la optimización mejorada del código generado: las aplicaciones pueden proporcionar el valor de la constante de especialización en el momento de la compilación de SPIR-V, una nueva consulta puede detectar constructores y destructores no triviales de objetos globales del alcance del programa y se pueden establecer devoluciones de llamada de usuario en el momento del lanzamiento del programa.
  • Se ejecuta en cualquier hardware compatible con OpenCL 2.0 (solo se requiere una actualización del controlador).

OpenCL 3.0 [ editar ]

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 de OpenCL 1.2 se ha convertido en una línea de base obligatoria, mientras que todas las funciones de OpenCL 2.xy OpenCL 3.0 se hicieron opcionales. La especificación retiene el lenguaje OpenCL C y desaprueba el lenguaje del kernel OpenCL C ++, reemplazándolo con el lenguaje C ++ para OpenCL [19] basado en un compilador Clang / LLVM que implementa un subconjunto de código intermedio C ++ 17 y SPIR-V . [63] [64] [65] La versión 3.0.7 con algunas extensiones se presentó en IWOCL 21. [66]

Hoja de ruta [ editar ]

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. [67] [68] Esto ha sido demostrado ahora por Premiere Rush de Adobe usando el compilador de código abierto clspv [38] para compilar cantidades significativas de código del kernel OpenCL C para ejecutar en un tiempo de ejecución Vulkan para su implementación en Android. [69]OpenCL tiene una hoja de ruta con visión de futuro independiente de Vulkan, con 'OpenCL Next' en desarrollo y lanzamiento de orientación en 2020. OpenCL Next puede integrar extensiones como Vulkan / OpenCL Interop, Scratch-Pad Memory Management, Extended Subgroups, SPIR-V 1.4 ingestion y Información de depuración ampliada 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. [70]

Implementaciones de código abierto [ editar ]

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 para el que el tiempo de ejecución debería ser compatible. 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 apropiada. . La aplicación de consumidor utiliza el encabezado estándar de OpenCL; Las llamadas a cada función son luego transferidas por el tiempo de ejecución de OpenCL al controlador apropiado usando el ICD. Cada proveedor debe implementar cada llamada OpenCL en su controlador. [71]

Las implementaciones de OpenCL de Apple, [72] Nvidia, [73] RapidMind [74] y Gallium3D [75] están todas basadas en la tecnología LLVM Compiler y utilizan el compilador Clang como su interfaz.

Cómputo de galio MESA
Se mantiene una implementación de OpenCL (1.1 real incompleta, en su mayoría AMD Radeon GCN ) para varias plataformas como parte del Gallium Compute Project, [76] que se basa en el trabajo del proyecto Mesa para soportar múltiples plataformas. Anteriormente, esto se conocía como CLOVER., [77] Desarrollo real: principalmente soporte para ejecutar un marco incompleto con LLVM y CLANG reales, algunas características nuevas como fp16 en 17.3, [78] 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. [79] [80]New Target es OpenCL 3.0 modular con soporte completo de OpenCL 1.2. El estado actual está disponible en Mesamatrix. Los soportes de imagen están aquí en el foco del desarrollo.
BEIGNET
Una implementación de Intel para su hardware Ivy Bridge + fue lanzada en 2013. [81] Este software del Equipo de China de Intel, ha atraído críticas de los desarrolladores de AMD y Red Hat , [82] así como de Michael Larabel de Phoronix . [83] La versión actual 1.3.2 admite OpenCL 1.2 completo (Ivy Bridge y superior) y OpenCL 2.0 opcional para Skylake y versiones posteriores. [84] [85] soporte para Android se ha agregado a Beignet., [86] objetivos de desarrollo reales: solo soporte para 1.2 y 2.0, camino a 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 lanzada en 2018. [87] Este controlador reemplaza la implementación de Beignet para plataformas compatibles (no 6.gen anterior a Haswell). NEO proporciona compatibilidad con OpenCL 2.1 en plataformas Core y OpenCL 1.2 en plataformas Atom. [88] Actual 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 y Broadwell con la versión 20.41+. Incluye ahora OpenCL 2.0 opcional, 2.1 Características completas y algunas de 2.2.
ROCm
Creado como parte de GPUOpen de AMD , ROCm (Radeon Open Compute) es un proyecto de Linux de código abierto construido en OpenCL 1.2 con soporte de idiomas para 2.0. El sistema es compatible con todas las CPU y APU modernas de AMD (actualmente en parte GFX 7, GFX 8 y 9), así como con las CPU Intel Gen7.5 + (solo con PCI 3.0). [89] [90] Con la versión 1.9, el soporte se ha extendido en algunos puntos de forma experimental al hardware con PCIe 2.0 y sin atomics. Se realiza una descripción general del trabajo real en XDC2018. [91] [92] ROCm Versión 2.0 es compatible con Full OpenCL 2.0, pero algunos errores y limitaciones están en la lista de tareas pendientes. [93] [94] La versión 3.3 está mejorando en detalles. [95] La versión 3.5 es compatible con OpenCL 2.2. [96]La versión 3.10 fue con mejoras y nuevas API. [97] Anunciado en SC20 es ROCm 4.0 con soporte de AMD Compute Card Instinct MI 100. [98] La documentación real de 4.1.1 está disponible en github. [99] OpenCL 3.0 está en proceso.
POCL
Una implementación portátil que admite CPU y algunas GPU (a través de CUDA y HSA ). Sobre la base de Clang y LLVM . [100] Con la versión 1.0, OpenCL 1.2 se implementó casi por completo junto con algunas características 2.x. [101] 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. [101] [102] OpenCL 2.0 está casi completamente implementado. [103] La versión 1.3 es compatible con Mac OS X. [104] La versión 1.4 incluye compatibilidad con LLVM 8.0 y 9.0. [105] La versión 1.5 implementa la compatibilidad con LLVM / Clang 10. [106]La versión 1.6 implementa compatibilidad con LLVM / Clang 11 y aceleración CUDA. [107] Los objetivos reales son OpenCL 2.x completo, OpenCL 3.0 y mejora del rendimiento. POCL 1.6 tiene optimización manual al mismo nivel de tiempo de ejecución de cómputo de Intel. [108]
Trébol
Un puerto de Mesa Clover para ARM con soporte completo de OpenCL 1.2, [109] [110] 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, [111] sin desarrollo real.
MOCL
En 2018 se lanzó una implementación OpenCL basada en POCL por 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 se basa en LLVM v5.0 y también reutiliza algunas piezas 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 la atomización del kernel se mejora significativamente. Este marco se ha implementado en el sistema TH-2A y está disponible para el público. [112] Parte del software se trasladará a continuación para mejorar POCL. [101]
VC4CL
Una implementación de OpenCL 1.2 para el procesador VideoCore IV (BCM2763) utilizado en la Raspberry Pi antes de su modelo 4. [113]

Implementaciones de proveedores [ editar ]

Cronología de las implementaciones de los proveedores [ editar ]

  • 10 de diciembre de 2008: AMD y Nvidia realizaron la primera demostración pública de OpenCL, una presentación de 75 minutos en SIGGRAPH Asia 2008. AMD mostró una demostración de OpenCL acelerada por CPU que explica la escalabilidad de OpenCL en uno o más núcleos, mientras que Nvidia mostró una manifestación. [114] [115]
  • 16 de marzo de 2009: en la 4ª Exposición Multicore, Imagination Technologies anunció la PowerVR SGX543MP, la primera GPU de esta empresa que cuenta con soporte OpenCL. [116]
  • 26 de marzo de 2009: en GDC 2009 , AMD y Havok demostraron la primera implementación de trabajo para la aceleración de OpenCL Havok Cloth en la GPU AMD Radeon HD 4000 series . [117]
  • 20 de abril de 2009: Nvidia anunció el lanzamiento de su controlador OpenCL y SDK a los desarrolladores que participan en su Programa de acceso anticipado OpenCL. [118]
  • 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. [119]
  • 28 de agosto de 2009: Apple lanzó Mac OS X Snow Leopard , que contiene una implementación completa de OpenCL. [120]
  • 28 de septiembre de 2009: Nvidia lanzó sus propios controladores OpenCL e implementación de SDK.
  • 13 de octubre de 2009: AMD lanzó la cuarta versión beta del ATI Stream SDK 2.0, que proporciona una implementación OpenCL completa tanto en las GPU R700 / R800 como en las CPU con capacidad SSE3 . El SDK está disponible para Linux y Windows. [121]
  • 26 de noviembre de 2009: Nvidia lanzó controladores para OpenCL 1.0 (rev 48).
  • 27 de octubre de 2009: S3 lanzó su primer producto compatible con OpenCL 1.0 nativo: el procesador gráfico integrado Chrome 5400E. [122]
  • 10 de diciembre de 2009: VIA lanzó su primer producto compatible con OpenCL 1.0: procesador de video ChromotionHD 2.0 incluido en el chipset VN1000. [123]
  • 21 de diciembre de 2009: AMD lanzó la versión de producción de ATI Stream SDK 2.0, [124] que proporciona soporte OpenCL 1.0 para GPU R800 y soporte beta para GPU R700 .
  • 1 de junio de 2010: ZiiLABS publicó los detalles de su primera implementación de OpenCL para el procesador ZMS para productos domésticos portátiles, integrados y digitales. [125]
  • 30 de junio de 2010: IBM lanzó una versión totalmente compatible de OpenCL 1.0. [4]
  • 13 de septiembre de 2010: Intel publicó los detalles de su primera implementación de OpenCL para la arquitectura del chip Sandy Bridge. Sandy Bridge integrará la tecnología de chip de gráficos más reciente de Intel directamente en la unidad central de procesamiento. [126]
  • 15 de noviembre de 2010: Wolfram Research lanzó Mathematica 8 con el paquete OpenCLLink .
  • 3 de marzo de 2011: Khronos Group anuncia la formación del grupo de trabajo WebCL para explorar la definición de un enlace de JavaScript a OpenCL. Esto crea la posibilidad de aprovechar el procesamiento paralelo de CPU de varios núcleos y GPU desde un navegador web . [127] [128]
  • 31 de marzo de 2011: IBM lanzó una versión totalmente compatible de OpenCL 1.1. [4] [129]
  • 25 de abril de 2011: IBM lanzó OpenCL Common Runtime v0.1 para Linux en arquitectura x86. [130]
  • 4 de mayo de 2011: Nokia Research lanza una extensión WebCL de código abierto para el navegador web Firefox , que proporciona un enlace de JavaScript a OpenCL. [131]
  • 1 de julio de 2011: Samsung Electronics lanza un prototipo de implementación de código abierto de WebCL para WebKit, que proporciona un enlace de JavaScript a OpenCL. [132]
  • 8 de agosto de 2011: AMD lanzó el kit de desarrollo de software (SDK) de procesamiento paralelo acelerado (APP) de AMD v2.5, que reemplaza el SDK ATI Stream como tecnología y concepto. [133]
  • 12 de diciembre de 2011: AMD lanzó AMD APP SDK v2.6 [134] que contiene una vista previa de OpenCL 1.2.
  • 27 de febrero de 2012: Portland Group lanzó el compilador PGI OpenCL para CPU ARM de múltiples núcleos . [135]
  • 17 de abril de 2012: Khronos publicó un borrador de trabajo de WebCL. [136]
  • 6 de mayo de 2013: Altera lanzó Altera SDK para OpenCL, versión 13.0. [137] Cumple con OpenCL 1.0. [138]
  • 18 de noviembre de 2013: Khronos anunció que se había finalizado la especificación para OpenCL 2.0. [139]
  • 19 de marzo de 2014: Khronos publica la especificación WebCL 1.0 [140] [141]
  • 29 de agosto de 2014: Intel lanza el controlador HD Graphics 5300 que admite OpenCL 2.0. [142]
  • 25 de septiembre de 2014: AMD lanza Catalyst 14.41 RC1, que incluye un controlador OpenCL 2.0. [143]
  • 14 de enero de 2015: Xilinx Inc. anuncia el entorno de desarrollo SDAccel para OpenCL, C y C ++, logra la conformidad de Khronos [144]
  • 13 de abril de 2015: Nvidia lanza el controlador WHQL v350.12, que incluye compatibilidad con OpenCL 1.2 para GPU basadas en Kepler o arquitecturas posteriores. [145] El controlador 340+ admite OpenCL 1.1 para Tesla y Fermi.
  • 26 de agosto de 2015: AMD lanzó AMD APP SDK v3.0 [146] que contiene compatibilidad total con OpenCL 2.0 y codificación de muestra.
  • 16 de noviembre de 2015: Khronos anunció que se había finalizado la especificación para OpenCL 2.1. [147]
  • 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 [148]
  • 17 de febrero de 2017: Nvidia comienza el soporte de evaluación de OpenCL 2.0 con el controlador 378.66. [149] [150] [151]
  • 16 de mayo de 2017: Khronos anunció que la especificación para OpenCL 2.2 se había finalizado con SPIR-V 1.2. [152]
  • 14 de mayo de 2018: Khronos anunció la 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: Intel Neo Runtime con OpenCL 3.0 para el nuevo Tiger Lake
  • 3 de junio de 2020: AMD anunció RocM 3.5 con soporte OpenCL 2.2 [153]
  • 30 de septiembre de 2020: Khronos anunció que se habían finalizado las especificaciones para OpenCL 3.0 (CTS también disponible).
  • 16 de octubre de 2020: Intel anunció la compatibilidad con Neo 20.41 para OpenCL 3.0 (incluye principalmente OpenCL 2.x opcional)
  • 6 de abril de 2021: Nvidia es compatible con OpenCL 3.0 para Ampere. Maxwell y las GPU posteriores también admiten OpenCL 3.0 con el controlador Nvidia 465+. [154]

Dispositivos [ editar ]

A partir de 2016, OpenCL se ejecuta en unidades de procesamiento de gráficos , CPU con instrucciones SIMD , FPGA , Movidius Myriad 2 , Adapteva epiphany y DSP .

Conjunto de pruebas de conformidad de Khronos [ editar ]

Para ser oficialmente conforme, una implementación debe aprobar el conjunto de pruebas de conformidad de Khronos (CTS), y los resultados se envían al Programa de Adoptadores de Khronos. [155] El código Khronos CTS para todas las versiones de OpenCL ha estado disponible en código abierto desde 2017. [156]

Productos conformes [ editar ]

El Grupo Khronos mantiene una lista ampliada de productos que cumplen con OpenCL. [4]

Todas las implementaciones que cumplen con los estándares se pueden consultar utilizando una de las herramientas de clinfo (hay varias herramientas con el mismo nombre y un conjunto de características similar). [167] [168] [169]

Soporte de versión [ editar ]

Los productos y su versión de compatibilidad con OpenCL incluyen: [170]

Compatibilidad con OpenCL 3.0 [ editar ]

Todo el hardware con OpenCL 1.2+ es posible, OpenCL 2.x solo es opcional, Khronos Test Suite disponible desde 2020-10 [171] [172]

  • (2020) Intel NEO Compute: 20.41+ para Gen 12 Tiger Lake a Broadwell (incluye soporte completo 2.0 y 2.1 y partes de 2.2) [173]
  • (2020) Procesadores Intel de sexta, séptima, octava, novena, décima y undécima generación ( Skylake , Kaby Lake , Coffee Lake , Comet Lake , Ice Lake , Tiger Lake ) con el último controlador de gráficos Intel Windows
  • (2021) Procesadores Intel de 11.a, 12.a generación ( Rocket Lake , Alder Lake ) con el último controlador de gráficos Intel Windows
  • (2021) Nvidia Maxwell , Pascal , Volta , Turing y Ampere con controlador de gráficos Nvidia 465+ [174]

Soporte OpenCL 2.2 [ editar ]

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

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

Soporte OpenCL 2.1 [ editar ]

  • (2018+) Compatible con procesadores Intel de 5.a y 6.a generación ( Broadwell , Skylake )
  • (2017+) Procesadores Intel de séptima, octava, novena y décima generación ( Kaby Lake , Coffee Lake , Comet Lake , Ice Lake )
  • Khronos: con Driver Update todo el hardware con soporte 2.0 es posible

Compatibilidad con OpenCL 2.0 [ editar ]

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

Soporte OpenCL 1.2 [ editar ]

  • (2011+) para algunas AMD GCN 1st Gen, algunas características de OpenCL 2.0 no son posibles hoy en día, pero muchas más extensiones que Terascale
  • (2009+) AMD TeraScale 2 y 3 GPU (RV8xx, RV9xx en HD 5000, 6000 y 7000 Series)
  • (2011+) APU AMD TeraScale (basadas en K10 , Bobcat y Piledriver )
  • (2012+) Nvidia Kepler, Maxwell, Pascal, Volta y Turing GPU (GeForce 600, 700, 800, 900, 10, 16, 20 series, Quadro K-, M- y P-series, Tesla K-, M- y Serie P)
  • (2012+) Procesadores Intel de tercera y cuarta generación ( Ivy Bridge , Haswell )
  • (2013+) Serie Qualcomm Adreno 4xx
  • (2013+) ARM Mali Midgard 3.a generación (T760)
  • (2015+) ARM Mali Midgard 4.a generación (T8xx)

Soporte OpenCL 1.1 [ editar ]

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

Compatibilidad con OpenCL 1.0 [ editar ]

  • principalmente actualizado a 1.1 y 1.2 después del primer controlador solo para 1.0

Portabilidad, rendimiento y alternativas [ editar ]

Una característica clave de OpenCL es la portabilidad, a través de su memoria abstracta y modelo de ejecución , y el programador no puede utilizar directamente tecnologías específicas de hardware como la ejecución de subprocesos paralelos en línea (PTX) para las GPU de Nvidia, a menos que estén dispuestos 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 kernel está correctamente ajustado, y se ha sugerido el autoajuste como una solución al problema de portabilidad del desempeño, [176] produciendo "niveles aceptables de desempeño" en kernels experimentales de álgebra lineal. [177] 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. [178]

Un estudio de la Universidad de Delft de 2011 que comparó los programas CUDA y su sencilla traducción a OpenCL C encontró que CUDA supera a OpenCL en un 30% como máximo en la implementación de Nvidia. Los investigadores notaron que su comparación podría ser más justa aplicando optimizaciones manuales a los programas OpenCL, en cuyo caso "no había razón para que OpenCL obtuviera un rendimiento peor 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 las de OpenCL. [176]

Otro estudio en 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 un extremo a otro es entre un 16% y un 67% más lento" que el rendimiento de CUDA. [179]

El hecho de que OpenCL permita que las cargas de trabajo sean compartidas por CPU y GPU, ejecutando los mismos programas, significa que los programadores pueden explotar ambos dividiendo el trabajo entre los dispositivos. [180] Esto conduce al problema de decidir cómo dividir el trabajo, porque las velocidades relativas de operaciones difieren entre los dispositivos. Se ha sugerido que el aprendizaje automático resuelve 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. [181]

Ver también [ editar ]

  • Biblioteca de simulación avanzada
  • AMD FireStream
  • BrookGPU
  • C ++ AMP
  • Cerca del metal
  • CUDA
  • DirectCompute
  • GPGPU
  • CADERA
  • Larrabee
  • Lib Sh
  • Lista de aplicaciones OpenCL
  • OpenACC
  • OpenGL
  • OpenHMPP
  • OpenMP
  • Metal
  • RenderScript
  • SecuenciaL
  • SIMD
  • SYCL
  • Vulkan
  • WebCL

Referencias [ editar ]

  1. ^ "Registro OpenCL de Khronos" . Grupo Khronos. 27 de abril de 2020 . Consultado el 27 de abril de 2020 .
  2. ^ "Dispositivos Android con soporte 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. ^ a b c d e "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 . Consultado el 28 de abril de 2021 .
  7. ^ "La revisión 2 de la documentación del lenguaje de programación C ++ para OpenCL 1.0" . Grupo de trabajo Khronos OpenCL. 31 de marzo de 2021 . Consultado el 18 de abril de 2021 .
  8. ^ "OpenGL, OpenCL en desuso a favor de Metal 2 en macOS 10.14 Mojave" . AppleInsider . Consultado el 3 de julio de 2018 .
  9. ^ "Empresas conformes" . Grupo Khronos . Consultado el 8 de abril de 2015 .
  10. ^ Gianelli, Silvia E. (14 de enero de 2015). "Entorno de desarrollo Xilinx SDAccel para OpenCL, C y C ++, logra la conformidad de Khronos" . PR Newswire . Xilinx . Consultado el 27 de abril de 2015 .
  11. ^ 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 .
  12. ^ a b 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.
  13. ^ Tompson, 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 .
  14. ^ a b c d Stone, John E .; Gohara, David; Shi, Guochin (2010). "OpenCL: un estándar de programación paralelo para sistemas informáticos heterogéneos" . Computación en ciencia e ingeniería . 12 (3): 66–73. Código bibliográfico : 2010CSE .... 12c..66S . doi : 10.1109 / MCSE.2010.69 . PMC 2964860 . PMID 21037981 .  
  15. ^ Klöckner, Andreas; Pinto, Nicolás; Lee, Yunsup; Catanzaro, Bryan; Ivanov, Paul; Fasih, Ahmed (2012). "PyCUDA y PyOpenCL: un enfoque basado en secuencias de comandos 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 . 
  16. ^ "OpenCL - Enlaces de lenguaje informático abierto" . metacpan.org . Consultado el 18 de agosto de 2018 .
  17. ^ "SPIR - El primer lenguaje intermedio estándar abierto para cómputo y gráficos paralelos" . Grupo Khronos . 21 de enero del 2014.
  18. ^ "SYCL - Programación heterogénea de fuente única C ++ para OpenCL" . Grupo Khronos . 21 de enero del 2014.
  19. ^ a b c "C ++ para OpenCL, OpenCL-Guide" . GitHub . Consultado el 18 de abril de 2021 .
  20. ^ a b c Aaftab Munshi, ed. (2014). "La especificación OpenCL C, versión 2.0" (PDF) . Consultado el 24 de junio de 2014 .
  21. ^ a b "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) . SIGGRAPH2008. 14 de agosto de 2008. Archivado desde el original (PDF) el 19 de marzo de 2012 . Consultado el 14 de agosto de 2008 .
  23. ^ "Montaje de FFT en la arquitectura G80" (PDF) . Vasily Volkov y Brian Kazian, informe del proyecto UC Berkeley CS258. Mayo de 2008 . Consultado el 14 de noviembre de 2008 .
  24. ^ "OpenCL en FFT" . Manzana. 16 de noviembre de 2009 . Consultado el 7 de diciembre de 2009 .
  25. ^ Trevett, Neil (28 de abril de 2020). "Anuncios de Khronos y panel de discusión" (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: 1–2. doi : 10.1145 / 3388333.3388647 . ISBN 978-1-4503-7531-3.
  27. ^ a b 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, soporte OpenCL" . releases.llvm.org . Septiembre de 2019 . Consultado el 18 de abril de 2021 .
  29. ^ "Clang 9, extensiones de idioma, OpenCL" . releases.llvm.org . Septiembre de 2019 . Consultado el 18 de abril de 2021 .
  30. ^ "Publicación de la documentación de C ++ para el lenguaje del kernel OpenCL, versión 1.0, revisión 1 · KhronosGroup / OpenCL-Docs" . GitHub . Diciembre de 2020 . Consultado el 18 de abril de 2021 .
  31. ^ a b "La documentación del lenguaje de programación C ++ para OpenCL 1.0" . www.khronos.org . Consultado el 18 de abril de 2021 .
  32. ^ a b c d "Lanzamiento de C ++ para la documentación del lenguaje del kernel de OpenCL, versión 1.0, revisión 2 · KhronosGroup / OpenCL-Docs" . GitHub . Marzo de 2021 . Consultado el 18 de abril de 2021 .
  33. ^ "cl_ext_cxx_for_opencl" . www.khronos.org . Septiembre de 2020 . Consultado el 18 de abril de 2021 .
  34. ^ "Mali SDK que admite la compilación de núcleos en C ++ para OpenCL" . community.arm.com . Diciembre de 2020 . Consultado el 18 de abril de 2021 .
  35. ^ "Manual del usuario del compilador de Clang - C ++ para compatibilidad con OpenCL" . clang.llvm.org . Consultado el 18 de abril de 2021 .
  36. ^ "Guía de OpenCL, compilación sin conexión de fuentes de kernel OpenCL" . GitHub . Consultado el 18 de abril de 2021 .
  37. ^ "Guía de OpenCL, programación de núcleos de OpenCL" . GitHub . Consultado el 18 de abril de 2021 .
  38. ^ a b Clspv es un compilador prototipo para un subconjunto de sombreadores de cómputo de OpenCL C a Vulkan: google / clspv , 17 de agosto de 2019 , consultado el 20 de agosto de 2019
  39. ^ Petit, Kévin (17 de abril de 2021), Implementación experimental de OpenCL en Vulkan , consultado el 18 de abril de 2021
  40. ^ "Khronos lanza iniciativa de computación heterogénea" (Comunicado de prensa). Grupo Khronos. 16 de junio de 2008. Archivado desde el original el 20 de junio de 2008 . Consultado el 18 de junio de 2008 .
  41. ^ "OpenCL se promociona en Texas" . MacWorld. 20 de noviembre de 2008 . Consultado el 12 de junio de 2009 .
  42. ^ "El Grupo Khronos lanza la especificación OpenCL 1.0" (Comunicado de prensa). Grupo Khronos. 8 de diciembre de 2008 . Consultado el 4 de diciembre de 2016 .
  43. ^ "Apple ofrece una vista previa de Mac OS X Snow Leopard a los desarrolladores" (Comunicado de prensa). Apple Inc. 9 de junio de 2008. Archivado desde el original el 19 de marzo de 2012 . Consultado el 9 de junio de 2008 .
  44. ^ "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 . Consultado el 14 de agosto de 2008 .
  45. ^ "AMD respalda OpenCL, Microsoft DirectX 11" . eWeek. 6 de agosto de 2008 . Consultado el 14 de agosto de 2008 .
  46. ^ "HPCWire: RapidMind adopta proyectos de estándares y código abierto" . HPCWire. 10 de noviembre de 2008. Archivado desde el original el 18 de diciembre de 2008 . Consultado el 11 de noviembre de 2008 .
  47. ^ "Nvidia agrega OpenCL a su kit de herramientas de computación GPU líder en la industria" (Comunicado de prensa). Nvidia. 9 de diciembre de 2008 . Consultado el 10 de diciembre de 2008 .
  48. ^ "Kit de desarrollo OpenCL para Linux on Power" . alphaWorks. 30 de octubre de 2009 . Consultado el 30 de octubre de 2009 .
  49. ^ https://www.sciencedirect.com/topics/computer-science/opencl-standard
  50. ^ http://developer.amd.com/wordpress/media/2012/10/opencl-1.0.48.pdf
  51. ^ "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 .
  52. ^ "Khronos lanza la especificación OpenCL 1.2" . Grupo Khronos. 15 de noviembre de 2011 . Consultado el 23 de junio de 2015 .
  53. ^ a b c "Especificación de OpenCL 1.2" (PDF) . Grupo Khronos . Consultado 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 . Consultado el 10 de febrero de 2014 .
  55. ^ "Khronos lanza 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 .
  56. ^ "Khronos anuncia OpenCL 2.1: C ++ llega a OpenCL" . AnandTech. 3 de marzo de 2015 . Consultado el 8 de abril de 2015 .
  57. ^ "Khronos lanza la especificación provisional de OpenCL 2.1 para revisión pública" . Grupo Khronos. 3 de marzo de 2015 . Consultado el 8 de abril de 2015 .
  58. ^ "Descripción general de OpenCL" . Grupo Khronos. 21 de julio de 2013.
  59. ^ a b "Khronos lanza la especificación provisional de OpenCL 2.2 con lenguaje de kernel OpenCL C ++ para programación paralela" . Grupo Khronos . 18 de abril de 2016.
  60. ^ Trevett, Neil (abril de 2016). "OpenCL - Un estado de la Unión" (PDF) . IWOCL . Viena : Grupo Khronos . Consultado el 2 de enero de 2017 .
  61. ^ "Khronos lanza OpenCL 2.2 con SPIR-V 1.2" . Grupo Khronos . 16 de mayo de 2017.
  62. ^ a b "Lanzamiento de la actualización de mantenimiento OpenCL 2.2" . El Grupo Khronos . 14 de mayo de 2018.
  63. ^ https://www.phoronix.com/scan.php?page=article&item=opencl-30-spec&num=1
  64. ^ https://www.khronos.org/news/press/khronos-group-releases-opencl-3.0
  65. ^ https://www.khronos.org/registry/OpenCL/specs/3.0-unified/pdf/OpenCL_API.pdf
  66. ^ https://www.iwocl.org/wp-content/uploads/k03-iwocl-syclcon-2021-trevett-updated.mp4.pdf
  67. ^ "Rompiendo: Hoja de ruta de fusión de OpenCL 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 .
  68. ^ "SIGGRAPH 2018: OpenCL-Next tomando forma, Vulkan continúa evolucionando - Phoronix" . www.phoronix.com .
  69. ^ "Actualización de Vulkan SIGGRAPH 2019" (PDF) .
  70. ^ Trevett, Neil (23 de mayo de 2019). "Taller de EVS de descripción general de Khronos y OpenCL el 19 de mayo" (PDF) . Grupo Khronos .
  71. ^ "Especificación OpenCL ICD" . Consultado el 23 de junio de 2015 .
  72. ^ "Entrada de Apple en la página de usuarios de LLVM" . Consultado el 29 de agosto de 2009 .
  73. ^ "Entrada de Nvidia en la página de usuarios de LLVM" . Consultado el 6 de agosto de 2009 .
  74. ^ "Entrada de Rapidmind en la página de usuarios de LLVM" . Consultado el 1 de octubre de 2009 .
  75. ^ "Publicación del blog de Zack Rusin sobre la implementación de Gallium3D OpenCL" . Febrero de 2009 . Consultado el 1 de octubre de 2009 .
  76. ^ "GalliumCompute" . dri.freedesktop.org . Consultado el 23 de junio de 2015 .
  77. ^ "Actualización de estado de Clover" (PDF) .
  78. ^ "mesa / mesa - La biblioteca de gráficos 3D de Mesa" . cgit.freedesktop.org .
  79. ^ "Trébol de galio con SPIR-V y NIR abriendo nuevas opciones de cómputo dentro de Mesa - Phoronix" . www.phoronix.com .
  80. ^ https://xdc2018.x.org/slides/clover.pdf
  81. ^ Larabel, Michael (10 de enero de 2013). "Beignet: OpenCL / GPGPU viene para Ivy Bridge en Linux" . Phoronix .
  82. ^ Larabel, Michael (16 de abril de 2013). "Más críticas llegan hacia Beignet OpenCL de Intel" . Phoronix .
  83. ^ Larabel, Michael (24 de diciembre de 2013). "Beignet OpenCL de Intel todavía se está horneando lentamente" . Phoronix .
  84. ^ "Beignet" . freedesktop.org.
  85. ^ "beignet - Biblioteca Beignet OpenCL para Intel Ivy Bridge y GPU más nuevas" . cgit.freedesktop.org .
  86. ^ "Intel trae Beignet a Android para OpenCL Compute - Phoronix" . www.phoronix.com .
  87. ^ "01.org Intel Open Source - Compute Runtime" . 7 de febrero de 2018.
  88. ^ "LÉAME DE NEO GitHub" . 21 de marzo de 2019.
  89. ^ "ROCm" . GitHub . Archivado desde el original el 8 de octubre de 2016.
  90. ^ "RadeonOpenCompute / ROCm: ROCm - Plataforma de código abierto para HPC y computación GPU de ultraescala" . GitHub. 21 de marzo de 2019.
  91. ^ "Una buena descripción general de la pila de cómputo ROCm Linux - Phoronix" . www.phoronix.com .
  92. ^ "XDC Lightning.pdf" . Documentos de Google .
  93. ^ "Radeon ROCm 2.0 oficialmente disponible con soporte OpenCL 2.0, TensorFlow 1.12, Vega 48-bit VA - Phoronix" . www.phoronix.com .
  94. ^ "Tomando Radeon ROCm 2.0 OpenCL para una prueba de evaluación comparativa - Phoronix" . www.phoronix.com .
  95. ^ https://github.com/RadeonOpenCompute/ROCm/blob/master/AMD_ROCm_Release_Notes_v3.3.pdf [ enlace muerto ]
  96. ^ https://www.phoronix.com/scan.php?page=news_item&px=Radeon-ROCm-3.5-Released
  97. ^ https://www.phoronix.com/scan.php?page=news_item&px=Radeon-ROCm-3.10-Released
  98. ^ https://www.phoronix.com/scan.php?page=article&item=amd-mi100-rocm4&num=1
  99. ^ https://rocm-documentation.readthedocs.io/en/latest/
  100. ^ 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 de rendimiento". Int'l J. Programación paralela . 43 (5): 752–785. arXiv : 1611.07083 . Código bibliográfico : 2016arXiv161107083J . doi : 10.1007 / s10766-014-0320-y . S2CID 9905244 . 
  101. ^ a b c "página de inicio de pocl" . pocl .
  102. ^ "GitHub - pocl / pocl: pocl: Lenguaje de computación portátil" . 14 de marzo de 2019 - a través de GitHub.
  103. ^ "Estado de implementación de soporte de HSA a partir del 17 de mayo de 2016 - documentación de Portable Computing Language (pocl) 1.3-pre" . portablecl.org .
  104. ^ http://portablecl.org/pocl-1.3.html
  105. ^ http://portablecl.org/pocl-1.4.html
  106. ^ http://portablecl.org/pocl-1.5.html
  107. ^ https://www.phoronix.com/scan.php?page=news_item&px=POCL-1.6-RC1-Released
  108. ^ https://www.iwocl.org/wp-content/uploads/30-iwocl-syclcon-2021-baumann-slides.pdf
  109. ^ "Acerca de" . Git.Linaro.org .
  110. ^ Gall, T .; Pitney, G. (6 de marzo de 2014). "LCA14-412: GPGPU en ARM SoC" (PDF) . Servicios web de Amazon . Consultado el 22 de enero de 2017 .
  111. ^ "zuzuf / freeocl" . GitHub . Consultado el 13 de abril de 2017 .
  112. ^ 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) . Proc. Conf. Int. sobre fronteras informáticas. doi : 10.1145 / 3203217.3203244 .
  113. ^ https://github.com/doe300/VC4CL
  114. ^ "Demostración de OpenCL, CPU AMD" . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
  115. ^ "Demostración de OpenCL, Nvidia GPU" . 10 de diciembre de 2008 . Consultado el 28 de marzo de 2009 .
  116. ^ "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 . Consultado el 30 de enero de 2011 .
  117. ^ "AMD y Havok demo física acelerada OpenCL" . Perspectiva de PC. 26 de marzo de 2009. Archivado desde el original el 5 de abril de 2009 . Consultado el 28 de marzo de 2009 .
  118. ^ "Nvidia lanza controlador OpenCL para desarrolladores" . Nvidia. 20 de abril de 2009. Archivado desde el original el 19 de marzo de 2012 . Consultado el 27 de abril de 2009 .
  119. ^ "AMD invierte GPGPU, anuncia OpenCL SDK para x86" . Ars Technica. 5 de agosto de 2009 . Consultado el 6 de agosto de 2009 .[ enlace muerto permanente ]
  120. ^ Moren, Dan; Snell, Jason (8 de junio de 2009). "Actualización en vivo: Conferencia magistral de la WWDC 2009" . MacWorld.com . MacWorld . Consultado el 12 de junio de 2009 .
  121. ^ "Programa Beta de ATI Stream Software Development Kit (SDK) v2.0" . Archivado desde el original el 9 de agosto de 2009 . Consultado el 14 de octubre de 2009 .
  122. ^ "S3 Graphics lanzó el procesador gráfico integrado Chrome 5400E" . Archivado desde el original el 2 de diciembre de 2009 . Consultado el 27 de octubre de 2009 .
  123. ^ "VIA trae procesador de gráficos VN1000 mejorado]" . Archivado desde el original el 15 de diciembre de 2009 . Consultado el 10 de diciembre de 2009 .
  124. ^ "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 .
  125. ^ "OpenCL" . ZiiLABS . Consultado el 23 de junio de 2015 .
  126. ^ "Intel revela nuevos detalles técnicos de Sandy Bridge" . Consultado el 13 de septiembre de 2010 .
  127. ^ "Historias relacionadas con WebCL" . Grupo Khronos . Consultado el 23 de junio de 2015 .
  128. ^ "Khronos lanza la especificación final de WebGL 1.0" . Grupo Khronos. Archivado desde el original el 9 de julio de 2015 . Consultado el 23 de junio de 2015 .
  129. ^ "Comunidad" .
  130. ^ "Bienvenido a Wikis" . www.ibm.com . 20 de octubre de 2009.
  131. ^ "Nokia Research lanza prototipo de WebCL" . Grupo Khronos. 4 de mayo de 2011 . Consultado el 23 de junio de 2015 .
  132. ^ 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 .
  133. ^ "AMD abre el acelerador en el rendimiento de APU con el desarrollo de software OpenCL actualizado" . Amd.com. 8 de agosto de 2011 . Consultado el 16 de junio de 2013 .
  134. ^ "AMD APP SDK v2.6" . Forums.amd.com. 13 de marzo de 2015 . Consultado el 23 de junio de 2015 .[ enlace muerto ]
  135. ^ "El grupo de Portland anuncia el compilador OpenCL para los SoC NovaThor basados ​​en ARM de ST-Ericsson" . Consultado el 4 de mayo de 2012 .
  136. ^ "Especificaciones más recientes 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 .
  137. ^ "Altera abre el mundo de FPGA a programadores de software con amplia disponibilidad de SDK y placas listas para usar para OpenCL" . Altera.com. Archivado desde el original el 9 de enero de 2014 . Consultado el 9 de enero de 2014 .
  138. ^ "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 .
  139. ^ "Khronos finaliza la especificación OpenCL 2.0 para computación heterogénea" . Grupo Khronos. 18 de noviembre de 2013 . Consultado el 23 de junio de 2015 .
  140. ^ "Comunicado de prensa de WebCL 1.0" . Grupo Khronos. 19 de marzo de 2014 . Consultado el 23 de junio de 2015 .
  141. ^ "Especificación WebCL 1.0" . Grupo Khronos. 14 de marzo de 2014 . Consultado el 23 de junio de 2015 .
  142. ^ "Controlador Intel OpenCL 2.0" . Archivado desde el original el 17 de septiembre de 2014 . Consultado el 14 de octubre de 2014 .
  143. ^ "Controlador AMD OpenCL 2.0" . Support.AMD.com . 17 de junio de 2015 . Consultado el 23 de junio de 2015 .
  144. ^ "El entorno de desarrollo Xilinx SDAccel para OpenCL, C y C ++, logra la conformidad de Khronos - noticias de khronos.org" . El Grupo Khronos . Consultado el 26 de junio de 2017 .
  145. ^ "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 .
  146. ^ "Lanzamiento de AMD APP SDK 3.0" . Developer.AMD.com . 26 de agosto de 2015 . Consultado el 11 de septiembre de 2015 .
  147. ^ "Khronos lanza especificaciones OpenCL 2.1 y SPIR-V 1.0 para programación paralela heterogénea" . Grupo Khronos . 16 de noviembre de 2015.
  148. ^ "¿Qué hay de nuevo? Intel® SDK para aplicaciones OpenCL ™ 2016, R3" . Software de Intel.
  149. ^ "Los controladores NVIDIA 378.66 para Windows ofrecen soporte de evaluación OpenCL 2.0" . Grupo Khronos . 17 de febrero de 2017.
  150. ^ Szuppe, Jakub (22 de febrero de 2017). "NVIDIA habilita la compatibilidad con OpenCL 2.0 beta" .
  151. ^ Szuppe, Jakub (6 de marzo de 2017). "El soporte beta de NVIDIA para OpenCL 2.0 también funciona en Linux" .
  152. ^ "El grupo Khronos" . El Grupo Khronos . 21 de marzo de 2019.
  153. ^ https://github.com/RadeonOpenCompute/ROCm/tree/roc-3.5.0
  154. ^ https://developer.nvidia.com/blog/nvidia-is-now-opencl-3-0-conformant/
  155. ^ "El grupo Khronos" . El Grupo Khronos . 20 de agosto de 2019 . Consultado el 20 de agosto de 2019 .
  156. ^ "KhronosGroup / OpenCL-CTL: las pruebas de conformidad de OpenCL" . GitHub. 21 de marzo de 2019.
  157. ^ "OpenCL y AMD APP SDK" . Central de desarrolladores de AMD . developer.amd.com. Archivado desde el original el 4 de agosto de 2011 . Consultado el 11 de agosto de 2011 .
  158. ^ "Acerca de Intel OpenCL SDK 1.1" . software.intel.com . intel.com . Consultado el 11 de agosto de 2011 .
  159. ^ "Intel® SDK para aplicaciones OpenCL ™ - Notas de la versión" . software.intel.com . 14 de marzo de 2019.
  160. ^ "Soporte de producto" . Consultado el 11 de agosto de 2011 .
  161. ^ "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 .
  162. ^ "Anuncio del kit de desarrollo OpenCL para Linux en Power v0.3" . Consultado el 11 de agosto de 2011 .
  163. ^ "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 .
  164. ^ "IBM lanza OpenCL Common Runtime para Linux en arquitectura x86" . 20 de octubre de 2009 . Consultado el 10 de septiembre de 2011 .
  165. ^ "OpenCL y AMD APP SDK" . Central de desarrolladores de AMD . developer.amd.com. Archivado desde el original el 6 de septiembre de 2011 . Consultado el 10 de septiembre de 2011 .
  166. ^ "Nvidia lanza controlador OpenCL" . 22 de abril de 2009 . Consultado el 11 de agosto de 2011 .
  167. ^ "clinfo de Simon Leblanc" . Consultado el 27 de enero de 2017 .
  168. ^ "clinfo por Oblomov" . Consultado el 27 de enero de 2017 .
  169. ^ "clinfo: openCL INFOrmation" . Consultado el 27 de enero de 2017 .
  170. ^ "Productos Khronos" . El Grupo Khronos . Consultado el 15 de mayo de 2017 .
  171. ^ https://github.com/KhronosGroup/OpenCL-CTS/tree/master/test_conformance
  172. ^ https://github.com/KhronosGroup/OpenCL-CTS/issues?q=label%3Amust_fix_3.0+is%3Aclosed
  173. ^ https://www.phoronix.com/scan.php?page=news_item&px=Intel-Compute-20.43.18277
  174. ^ https://developer.nvidia.com/blog/nvidia-is-now-opencl-3-0-conformant/
  175. ^ "compute-runtime" . 01.org . 7 de febrero de 2018.
  176. ^ a b Fang, Jianbin; Varbanescu, Ana Lucia; Sips, Henk (2011). Una comparación de rendimiento integral de CUDA y OpenCL . Proc. Conf. Int. sobre procesamiento paralelo. doi : 10.1109 / ICPP.2011.45 .
  177. ^ Du, Peng; Weber, Rick; Luszczek, Piotr; Tomov, Stanimire; Peterson, Gregory; Dongarra, Jack (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. CiteSeerX 10.1.1.193.7712 . doi : 10.1016 / j.parco.2011.10.002 . 
  178. ^ 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. S2CID  225784 .
  179. ^ Karimi, Kamran; Dickson, Neil G .; Hamze, Firas (2011). "Una comparación de rendimiento de CUDA y OpenCL". arXiv : 1005.2581v3 [ cs.PF ].
  180. ^ Una encuesta sobre técnicas de computación heterogénea CPU-GPU, Encuestas de computación ACM, 2015.
  181. ^ Grewe, Dominik; O'Boyle, Michael FP (2011). Un enfoque de particionamiento de tareas estáticas para sistemas heterogéneos que utilizan OpenCL . Proc. Conf. Int. sobre la construcción del compilador. doi : 10.1007 / 978-3-642-19861-8_16 .

Enlaces externos [ editar ]

  • Página web oficial
  • Sitio web oficial deWebCL
  • Taller internacional sobre OpenCL ( IWOCL ) patrocinado por The Khronos Group