La computación de propósito general en unidades de procesamiento de gráficos ( GPGPU , o con menos frecuencia GPGP ) es el uso de una unidad de procesamiento de gráficos (GPU), que generalmente maneja el cálculo solo para gráficos de computadora , para realizar cálculos en aplicaciones tradicionalmente manejadas por la unidad central de procesamiento ( UPC). [1] [2] [3] [4] El uso de múltiples tarjetas de video en una computadora, o una gran cantidad de chips gráficos, paraleliza aún más la naturaleza ya paralela del procesamiento de gráficos. [5]
Básicamente, una canalización GPGPU es un tipo de procesamiento paralelo entre una o más GPU y CPU que analiza datos como si estuvieran en imágenes u otra forma gráfica. Si bien las GPU funcionan a frecuencias más bajas, normalmente tienen muchas veces más núcleos . Por tanto, las GPU pueden procesar muchas más imágenes y datos gráficos por segundo que una CPU tradicional. Migrar datos a forma gráfica y luego usar la GPU para escanearlos y analizarlos puede generar una gran aceleración .
Los pipelines GPGPU se desarrollaron a principios del siglo XXI para el procesamiento de gráficos (por ejemplo, para mejores sombreadores ). Se descubrió que estos canales se adaptaban bien a las necesidades informáticas científicas y desde entonces se han desarrollado en esta dirección.
En principio, cualquier función booleana arbitraria , incluidas la suma, la multiplicación y otras funciones matemáticas, se puede construir a partir de un conjunto funcionalmente completo de operadores lógicos. En 1987, Game of Life de Conway se convirtió en uno de los primeros ejemplos de computación de propósito general que utilizaba uno de los primeros procesadores de flujo llamado blitter para invocar una secuencia especial de operaciones lógicas en vectores de bits. [6]
La informática de propósito general en GPU se volvió más práctica y popular aproximadamente después de 2001, con la llegada de sombreadores programables y soporte de punto flotante en los procesadores gráficos. En particular, los problemas que involucran matrices y/o vectores (especialmente vectores de dos, tres o cuatro dimensiones) fueron fáciles de traducir a una GPU, que actúa con velocidad nativa y soporte en esos tipos. Un hito importante para GPGPU fue el año 2003, cuando dos grupos de investigación descubrieron de forma independiente enfoques basados en GPU para la solución de problemas generales de álgebra lineal en GPU que corrían más rápido que en CPU. [7] [8] Estos primeros esfuerzos por utilizar GPU como procesadores de propósito general requirieron reformular los problemas computacionales en términos de primitivas gráficas, según lo respaldado por las dos API principales para procesadores gráficos, OpenGL y DirectX . Esta engorrosa traducción se evitó con la llegada de lenguajes de programación de propósito general y API como Sh / RapidMind , Brook y Accelerator. [9] [10] [11]
A estos les siguió CUDA de Nvidia , que permitió a los programadores ignorar los conceptos gráficos subyacentes en favor de conceptos informáticos de alto rendimiento más comunes . [12] Las ofertas más nuevas, independientes del proveedor de hardware, incluyen DirectCompute de Microsoft y OpenCL de Apple/Khronos Group . [12] Esto significa que los canales GPGPU modernos pueden aprovechar la velocidad de una GPU sin requerir una conversión completa y explícita de los datos a un formato gráfico.
Mark Harris, fundador de GPGPU.org, acuñó el término GPGPU .
Cualquier lenguaje que permita que el código que se ejecuta en la CPU sondee un sombreador de GPU en busca de valores de retorno puede crear un marco GPGPU. Los estándares de programación para computación paralela incluyen OpenCL (independiente del proveedor), OpenACC , OpenMP y OpenHMPP .
A partir de 2016 [update], OpenCL es el lenguaje informático de GPU abierto de uso general dominante y es un estándar abierto definido por Khronos Group . [ cita necesaria ] OpenCL proporciona una plataforma GPGPU multiplataforma que además admite computación paralela de datos en CPU. OpenCL es compatible activamente con las plataformas Intel, AMD, Nvidia y ARM. Khronos Group también ha estandarizado e implementado SYCL , un modelo de programación de nivel superior para OpenCL como un lenguaje integrado específico de dominio de fuente única basado en C++11 puro.
El marco propietario dominante es Nvidia CUDA . [13] Nvidia lanzó CUDA en 2006, un kit de desarrollo de software (SDK) y una interfaz de programación de aplicaciones (API) que permite utilizar el lenguaje de programación C para codificar algoritmos para su ejecución en GPU de la serie GeForce 8 y posteriores.
ROCm , lanzado en 2016, es la respuesta de código abierto de AMD a CUDA. A partir de 2022, está a la par de CUDA en cuanto a características y aún carece de soporte al consumidor.
OpenVIDIA se desarrolló en la Universidad de Toronto entre 2003 y 2005, [14] en colaboración con Nvidia.
Altimesh Hybridizer creado por Altimesh compila el lenguaje intermedio común en archivos binarios CUDA. [15] [16] Admite funciones genéricas y virtuales. [17] La depuración y la creación de perfiles están integradas con Visual Studio y Nsight. [18] Está disponible como una extensión de Visual Studio en Visual Studio Marketplace.
Microsoft presentó la API informática DirectCompute GPU, lanzada con la API DirectX 11 .
Alea GPU ,[19]creada por QuantAlea,[20]presenta capacidades informáticas GPU nativas para los lenguajes Microsoft .NETF#[21]yC#. Alea GPU también proporciona un modelo de programación de GPU simplificado basado en GPU paralelo y agregado paralelo mediante delegados y administración automática de memoria.[22]
MATLAB admite la aceleración GPGPU utilizando Parallel Computing Toolbox y MATLAB Distributed Computing Server , [23] y paquetes de terceros como Jacket .
El procesamiento GPGPU también se utiliza para simular la física newtoniana mediante motores de física , [24] y las implementaciones comerciales incluyen Havok Physics, FX y PhysX , los cuales se usan típicamente para juegos de computadora y videojuegos .
C++ Accelerated Massive Parallelism ( C++ AMP ) es una biblioteca que acelera la ejecución de código C++ explotando el hardware de datos paralelos en las GPU.
Debido a la tendencia al aumento de la potencia de las GPU móviles, la programación de propósito general estuvo disponible también en los dispositivos móviles que ejecutan los principales sistemas operativos móviles .
Google Android 4.2 habilitó la ejecución de código RenderScript en la GPU del dispositivo móvil. [25] Apple introdujo la API Metal patentada para aplicaciones iOS , capaz de ejecutar código arbitrario a través de los sombreadores de cálculo GPU de Apple.
Las tarjetas de video para computadora son producidas por varios proveedores, como Nvidia , AMD . Las tarjetas de dichos proveedores difieren en la implementación de soporte de formatos de datos, como formatos de números enteros y de punto flotante (32 bits y 64 bits). Microsoft introdujo un estándar de Shader Model para ayudar a clasificar las diversas características de las tarjetas gráficas en un número de versión simple de Shader Model (1.0, 2.0, 3.0, etc.).
Las tarjetas de video anteriores a DirectX 9 solo admitían tipos de colores enteros o con paleta . Hay varios formatos disponibles, cada uno de los cuales contiene un elemento rojo, un elemento verde y un elemento azul. [ cita necesaria ] A veces se agrega otro valor alfa, que se utilizará para mayor transparencia. Los formatos comunes son:
Para los primeros gráficos de función fija o programabilidad limitada (es decir, hasta GPU compatibles con DirectX 8.1 inclusive), esto fue suficiente porque esta es también la representación utilizada en las pantallas. Esta representación tiene ciertas limitaciones. Con suficiente potencia de procesamiento de gráficos, incluso a los programadores de gráficos les gustaría utilizar mejores formatos, como formatos de datos de punto flotante , para obtener efectos como imágenes de alto rango dinámico . Muchas aplicaciones GPGPU requieren precisión de punto flotante, que viene con tarjetas de video que cumplen con la especificación DirectX 9.
DirectX 9 Shader Model 2.x sugirió la compatibilidad con dos tipos de precisión: precisión total y parcial. El soporte de precisión total podría ser FP32 o FP24 (coma flotante de 32 o 24 bits por componente) o mayor, mientras que la precisión parcial era FP16. La serie de GPU Radeon R300 de ATI admitía la precisión FP24 solo en la canalización de fragmentos programables (aunque FP32 era compatible con los procesadores vertex), mientras que la serie NV30 de Nvidia admitía tanto FP16 como FP32; otros proveedores, como S3 Graphics y XGI, admitían una combinación de formatos hasta FP24.
Las implementaciones de punto flotante en las GPU de Nvidia son en su mayoría compatibles con IEEE ; sin embargo, esto no es cierto para todos los proveedores. [26] Esto tiene implicaciones para la corrección que se consideran importantes para algunas aplicaciones científicas. Si bien los valores de punto flotante de 64 bits (flotante de doble precisión) están comúnmente disponibles en las CPU, no son universalmente compatibles con las GPU. Algunas arquitecturas de GPU sacrifican el cumplimiento de IEEE, mientras que otras carecen de doble precisión. Se han realizado esfuerzos para emular valores de coma flotante de doble precisión en GPU; sin embargo, la compensación de velocidad anula cualquier beneficio de descargar la informática en la GPU en primer lugar. [27]
La mayoría de las operaciones en la GPU funcionan de forma vectorizada: una operación se puede realizar con hasta cuatro valores a la vez. Por ejemplo, si un color ⟨R1, G1, B1⟩ va a ser modulado por otro color ⟨R2, G2, B2⟩ , la GPU puede producir el color resultante ⟨R1*R2, G1*G2, B1*B2⟩ en uno operación. Esta funcionalidad es útil en gráficos porque casi todos los tipos de datos básicos son un vector (ya sea de 2, 3 o 4 dimensiones). [ cita necesaria ] Los ejemplos incluyen vértices, colores, vectores normales y coordenadas de textura. Muchas otras aplicaciones pueden hacer un buen uso de esto y, debido a su mayor rendimiento, las instrucciones vectoriales, denominadas instrucción única, datos múltiples ( SIMD ), han estado disponibles durante mucho tiempo en las CPU. [ cita necesaria ]
Originalmente, los datos simplemente se pasaban en un sentido desde una unidad central de procesamiento (CPU) a una unidad de procesamiento de gráficos (GPU) y luego a un dispositivo de visualización . Sin embargo, a medida que pasó el tiempo, se volvió valioso para las GPU almacenar primero estructuras de datos simples y luego complejas para pasarlas de vuelta a la CPU que analizaba una imagen, o un conjunto de datos científicos representados en formato 2D o 3D que un La tarjeta de video puede entender. Debido a que la GPU tiene acceso a cada operación de extracción, puede analizar datos en estas formas rápidamente, mientras que una CPU debe sondear cada píxel o elemento de datos mucho más lentamente, a medida que aumenta la velocidad de acceso entre una CPU y su conjunto más grande de memoria de acceso aleatorio. (o en el peor de los casos, un disco duro ) es más lento que las GPU y las tarjetas de vídeo, que normalmente contienen cantidades más pequeñas de memoria más cara y de acceso mucho más rápido. Transferir la parte del conjunto de datos que se analizará activamente a la memoria de la GPU en forma de texturas u otras formas de GPU fácilmente legibles da como resultado un aumento de la velocidad. La característica distintiva de un diseño GPGPU es la capacidad de transferir información bidireccionalmente desde la GPU a la CPU; generalmente, el rendimiento de datos en ambas direcciones es idealmente alto, lo que genera un efecto multiplicador en la velocidad de un algoritmo específico de alto uso . Los canales GPGPU pueden mejorar la eficiencia en conjuntos de datos especialmente grandes y/o datos que contienen imágenes 2D o 3D. Se utiliza en procesos de gráficos complejos, así como en informática científica ; más aún en campos con grandes conjuntos de datos como el mapeo del genoma , o donde el análisis bidimensional o tridimensional es útil, especialmente en la actualidad el análisis de biomoléculas , el estudio de proteínas y otros tipos de química orgánica compleja . Estos canales también pueden mejorar enormemente la eficiencia en el procesamiento de imágenes y la visión por computadora , entre otros campos; así como el procesamiento paralelo en general. Algunas canalizaciones muy optimizadas han producido aumentos de velocidad de varios cientos de veces la canalización original basada en CPU en una tarea de alto uso.
Un ejemplo simple sería un programa de GPU que recopila datos sobre los valores de iluminación promedio a medida que presenta alguna vista desde una cámara o un programa de gráficos de computadora al programa principal de la CPU, de modo que la CPU luego pueda realizar ajustes en la pantalla general. vista. Un ejemplo más avanzado podría utilizar la detección de bordes para devolver información numérica y una imagen procesada que represente contornos a un programa de visión por computadora que controle, por ejemplo, un robot móvil. Debido a que la GPU tiene acceso de hardware rápido y local a cada píxel u otro elemento de imagen en una imagen, puede analizarlo y promediarlo (para el primer ejemplo) o aplicar un filtro de borde Sobel u otro filtro de convolución (para el segundo) con mucho mayor velocidad que una CPU, que normalmente debe acceder a copias de memoria de acceso aleatorio más lentas del gráfico en cuestión.
GPGPU es fundamentalmente un concepto de software, no un concepto de hardware; es un tipo de algoritmo , no una pieza de equipo. Sin embargo, los diseños de equipos especializados pueden mejorar aún más la eficiencia de los canales GPGPU, que tradicionalmente realizan relativamente pocos algoritmos en cantidades muy grandes de datos. Por lo tanto, las tareas masivamente paralelizadas y con niveles de datos gigantescos pueden paralelizarse aún más a través de configuraciones especializadas como la computación en rack (muchas máquinas similares, altamente adaptadas, integradas en un rack ), que agrega una tercera capa: muchas unidades informáticas, cada una de las cuales utiliza muchas CPU para corresponder. a muchas GPU. Algunos "mineros" de Bitcoin utilizaron este tipo de configuraciones para el procesamiento de grandes cantidades.
Históricamente, las CPU han utilizado cachés administradas por hardware , pero las GPU anteriores solo proporcionaban memorias locales administradas por software. Sin embargo, a medida que las GPU se utilizan cada vez más para aplicaciones de propósito general, se están diseñando GPU de última generación con cachés multinivel administrados por hardware que han ayudado a las GPU a avanzar hacia la informática convencional. Por ejemplo, las GPU con arquitectura GT200 de la serie GeForce 200 no incluían una caché L2, la GPU Fermi tiene una caché de último nivel de 768 KiB, la GPU Kepler tiene una caché de último nivel de 1,5 MiB, [28] la GPU Maxwell tiene una caché de último nivel de 2 MiB caché, y la GPU Pascal tiene caché de último nivel de 4 MiB.
Las GPU tienen archivos de registro muy grandes , lo que les permite reducir la latencia del cambio de contexto. El tamaño del archivo de registro también está aumentando en las diferentes generaciones de GPU; por ejemplo, el tamaño total del archivo de registro en las GPU Maxwell (GM200), Pascal y Volta es de 6 MiB, 14 MiB y 20 MiB, respectivamente. [29] [30] En comparación, el tamaño de un archivo de registro en las CPU es pequeño, normalmente decenas o cientos de kilobytes.
El alto rendimiento de las GPU tiene el costo de un alto consumo de energía, que bajo carga completa es, de hecho, tanta energía como el resto del sistema de PC combinado. [31] Se especificó que el consumo máximo de energía de la GPU de la serie Pascal (Tesla P100) era de 250 W. [32]
Las GPU están diseñadas específicamente para gráficos y, por lo tanto, son muy restrictivas en operaciones y programación. Debido a su diseño, las GPU solo son efectivas para problemas que pueden resolverse mediante el procesamiento de flujo y el hardware solo se puede utilizar de determinadas maneras.
La siguiente discusión que se refiere a vértices, fragmentos y texturas se refiere principalmente al modelo heredado de programación GPGPU, donde se usaban API de gráficos ( OpenGL o DirectX ) para realizar cálculos de propósito general. Con la introducción de las API informáticas de propósito general CUDA (Nvidia, 2007) y OpenCL (independiente del proveedor, 2008), en los nuevos códigos GPGPU ya no es necesario asignar el cálculo a primitivas gráficas. La naturaleza del procesamiento de flujo de las GPU sigue siendo válida independientemente de las API utilizadas. (Ver, por ejemplo, [33] )
Las GPU solo pueden procesar vértices y fragmentos independientes, pero pueden procesar muchos de ellos en paralelo. Esto es especialmente efectivo cuando el programador quiere procesar muchos vértices o fragmentos de la misma forma. En este sentido, las GPU son procesadores de flujo: procesadores que pueden funcionar en paralelo ejecutando un núcleo en muchos registros en un flujo a la vez.
Una secuencia es simplemente un conjunto de registros que requieren un cálculo similar. Las transmisiones proporcionan paralelismo de datos. Los núcleos son las funciones que se aplican a cada elemento de la secuencia. En las GPU, los vértices y fragmentos son los elementos de las secuencias y los sombreadores de vértices y fragmentos son los núcleos que se ejecutarán en ellos. [ dudoso ] Para cada elemento solo podemos leer desde la entrada, realizar operaciones en ella y escribir en la salida. Está permitido tener múltiples entradas y múltiples salidas, pero nunca una parte de la memoria que sea a la vez legible y escribible. [ impreciso ]
La intensidad aritmética se define como el número de operaciones realizadas por palabra de memoria transferida. Es importante que las aplicaciones GPGPU tengan una alta intensidad aritmética, de lo contrario la latencia de acceso a la memoria limitará la velocidad computacional. [34]
Las aplicaciones GPGPU ideales tienen grandes conjuntos de datos, alto paralelismo y dependencia mínima entre elementos de datos.
Hay una variedad de recursos computacionales disponibles en la GPU:
De hecho, un programa puede sustituir la salida por una textura de sólo escritura en lugar del framebuffer. Esto se hace a través de Render to Texture (RTT), Render-To-Backbuffer-Copy-To-Texture (RTBCTT) o la transmisión más reciente.
La forma más común para una transmisión en GPGPU es una cuadrícula 2D porque encaja naturalmente con el modelo de renderizado integrado en las GPU. Muchos cálculos se asignan naturalmente a cuadrículas: álgebra matricial, procesamiento de imágenes, simulación basada físicamente, etc.
Dado que las texturas se utilizan como memoria, las búsquedas de texturas se utilizan como lecturas de memoria. Debido a esto, la GPU puede realizar ciertas operaciones automáticamente.
Los núcleos informáticos pueden considerarse como el cuerpo de bucles . Por ejemplo, un programador que opera en una grilla en la CPU podría tener un código similar a este:
// Las cuadrículas de entrada y salida tienen 10000 x 10000 o 100 millones de elementos.void transform_10k_by_10k_grid ( flotar en [ 10000 ][ 10000 ], flotar fuera [ 10000 ][ 10000 ]) { para ( int x = 0 ; x < 10000 ; x ++ ) { para ( int y = 0 ; y < 10000 ; y ++ ) { // La siguiente línea se ejecuta 100 millones de veces [ x ] [ y ] = do_some_hard_work ( in [ x ][ y ]); } } }
En la GPU, el programador solo especifica el cuerpo del bucle como núcleo y qué datos recorrer invocando el procesamiento geométrico.
En código secuencial es posible controlar el flujo del programa utilizando declaraciones if-then-else y varias formas de bucles. Estas estructuras de control de flujo se han agregado recientemente a las GPU. [35] Las escrituras condicionales se podían realizar utilizando una serie de operaciones aritméticas/bits correctamente diseñadas, pero no era posible realizar bucles ni bifurcaciones condicionales.
Las GPU recientes permiten la ramificación, pero normalmente con una penalización en el rendimiento. Por lo general, se debe evitar la bifurcación en bucles internos, ya sea en código de CPU o GPU, y se pueden utilizar varios métodos, como resolución de bifurcación estática, cálculo previo, predicción, división de bucles [36] y Z-cull [37] para lograrlo. bifurcación cuando no existe soporte de hardware.
La operación de mapa simplemente aplica la función dada (el núcleo) a cada elemento de la secuencia. Un ejemplo sencillo es multiplicar cada valor del flujo por una constante (aumentando el brillo de una imagen). La operación del mapa es sencilla de implementar en la GPU. El programador genera un fragmento para cada píxel en la pantalla y aplica un programa de fragmentos a cada uno. El flujo de resultados del mismo tamaño se almacena en el búfer de salida.
Algunos cálculos requieren calcular una secuencia más pequeña (posiblemente una secuencia de un solo elemento) a partir de una secuencia más grande. A esto se le llama reducción de la corriente. Generalmente, una reducción se puede realizar en varios pasos. Los resultados del paso anterior se utilizan como entrada para el paso actual y el rango en el que se aplica la operación se reduce hasta que solo queda un elemento de corriente.
El filtrado de corrientes es esencialmente una reducción no uniforme. El filtrado implica eliminar elementos de la secuencia según algunos criterios.
La operación de escaneo, también denominada suma de prefijo paralelo , toma un vector (flujo) de elementos de datos y una función binaria asociativa (arbitraria) '+' con un elemento de identidad 'i' . Si la entrada es [a0, a1, a2, a3, ...], un escaneo exclusivo produce la salida [i, a0, a0 + a1, a0 + a1 + a2, ...], mientras que un escaneo inclusivo produce la salida [a0, a0 + a1, a0 + a1 + a2, a0 + a1 + a2 + a3, ...] y no requiere una identidad para existir. Si bien a primera vista la operación puede parecer intrínsecamente serial, son posibles algoritmos de escaneo paralelo eficientes y se han implementado en unidades de procesamiento de gráficos. La operación de escaneo tiene usos, por ejemplo, en clasificación rápida y multiplicación de vectores de matriz dispersa. [33] [38] [39] [40]
La operación de dispersión se define de forma más natural en el procesador de vértices. El procesador de vértices puede ajustar la posición del vértice , lo que permite al programador controlar dónde se deposita la información en la cuadrícula. También son posibles otras extensiones, como controlar el tamaño del área afectada por el vértice.
El procesador de fragmentos no puede realizar una operación de dispersión directa porque la ubicación de cada fragmento en la cuadrícula está fija en el momento de la creación del fragmento y el programador no puede modificarla. Sin embargo, a veces una operación de dispersión lógica puede reformularse o implementarse con otro paso de recopilación. Una implementación de dispersión primero emitiría tanto un valor de salida como una dirección de salida. Una operación de recopilación inmediatamente posterior utiliza comparaciones de direcciones para ver si el valor de salida se asigna a la ranura de salida actual.
En los núcleos informáticos dedicados , la dispersión se puede realizar mediante escrituras indexadas.
Reunir es lo contrario de dispersar. Después de que la dispersión reordena los elementos según un mapa, la recopilación puede restaurar el orden de los elementos según la dispersión del mapa utilizada. En los núcleos informáticos dedicados, la recopilación se puede realizar mediante lecturas indexadas. En otros sombreadores, se realiza con búsquedas de texturas.
La operación de clasificación transforma un conjunto desordenado de elementos en un conjunto ordenado de elementos. La implementación más común en las GPU es el uso de clasificación por base para datos enteros y de punto flotante y clasificación de fusión de grano grueso y redes de clasificación de grano fino para datos generales comparables. [41] [42]
La operación de búsqueda permite al programador encontrar un elemento determinado dentro de la secuencia, o posiblemente encontrar vecinos de un elemento específico. La GPU no se utiliza para acelerar la búsqueda de un elemento individual, sino que se utiliza para ejecutar múltiples búsquedas en paralelo. [ cita necesaria ] Principalmente el método de búsqueda utilizado es la búsqueda binaria en elementos ordenados.
Se pueden representar una variedad de estructuras de datos en la GPU:
Las siguientes son algunas de las áreas donde se han utilizado las GPU para informática de propósito general:
Uso de GPGPU en bioinformática: [57] [81]
† Las aceleraciones esperadas dependen en gran medida de la configuración del sistema. Rendimiento de la GPU comparado con el zócalo de CPU x86 de múltiples núcleos . El rendimiento de la GPU se compara con las funciones compatibles con la GPU y puede ser una comparación del rendimiento de kernel a kernel. Para obtener detalles sobre la configuración utilizada, consulte el sitio web de la aplicación. Aceleraciones según las pruebas internas de Nvidia o la documentación del ISV.
‡ Q= GPU Quadro , T= GPU Tesla . GPU recomendadas por Nvidia para esta aplicación. Consulte con el desarrollador o ISV para obtener información de certificación.
Se informa que Lowry está utilizando GPU (unidades de procesamiento de gráficos) Nvidia Tesla programadas en CUDA (Arquitectura de dispositivo unificado de cómputo) de la compañía para implementar los algoritmos. Nvidia afirma que las GPU son aproximadamente dos órdenes de magnitud más rápidas que los cálculos de la CPU, lo que reduce el tiempo de procesamiento a menos de un minuto por cuadro.
acelera las simulaciones de integridad de la señal en estaciones de trabajo que tienen unidades de procesamiento de gráficos (GPU) basadas en Nvidia Compute Unified Device Architecture (CUDA)
Durante las pruebas internas, el Tesla S1070 demostró un aumento de 360 veces en la velocidad del algoritmo que define similitud en comparación con el popular procesador central Intel Core 2 Duo que funciona con un reloj. velocidad de 2,6 GHz.