La computación de propósito general en unidades de procesamiento gráfico ( GPGPU , o con menos frecuencia GPGP ) es el uso de una unidad de procesamiento gráfico (GPU), que normalmente maneja el cálculo solo para gráficos de computadora , para realizar cálculos en aplicaciones tradicionalmente manejadas por la unidad central de procesamiento (CPU). [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 gráfico. [5]
Básicamente, una canalización GPGPU es un tipo de procesamiento paralelo entre una o más GPU y CPU que analiza los datos como si estuvieran en forma de imagen u otro formato gráfico. Si bien las GPU operan a frecuencias más bajas, normalmente tienen muchas veces más núcleos . Por lo tanto, las GPU pueden procesar muchas más imágenes y datos gráficos por segundo que una CPU tradicional. Migrar los datos a formato gráfico 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 mejorar los sombreadores ). Se descubrió que estos pipelines se adaptaban bien a las necesidades de computación científica y, desde entonces, se han desarrollado en esa dirección.
Las GPGPU más conocidas son Nvidia Tesla , que se utilizan para Nvidia DGX , junto con AMD Instinct e Intel Gaudi.
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, el Juego de la vida de Conway se convirtió en uno de los primeros ejemplos de computación de propósito general que utilizaba un procesador de flujo temprano llamado blitter para invocar una secuencia especial de operaciones lógicas en vectores de bits. [6]
La computación de propósito general en GPU se volvió más práctica y popular después de aproximadamente 2001, con la llegada de los sombreadores programables y el soporte de punto flotante en los procesadores gráficos. En particular, los problemas que involucraban matrices y/o vectores , especialmente vectores bidimensionales, tridimensionales o cuatridimensionales, eran fáciles de traducir a una GPU, que actúa con velocidad nativa y soporte en esos tipos. Un hito significativo 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 se ejecutaban 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, como lo respaldan las dos principales API 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 a favor de conceptos de computación 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 las canalizaciones GPGPU modernas pueden aprovechar la velocidad de una GPU sin requerir una conversión completa y explícita de los datos a una forma gráfica.
Mark Harris, el 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 para obtener 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 [actualizar], OpenCL es el lenguaje de computación GPU de propósito general abierto dominante, y es un estándar abierto definido por el Grupo Khronos . [ cita requerida ] OpenCL proporciona una plataforma GPGPU multiplataforma que además admite el cálculo paralelo de datos en CPU. OpenCL es compatible activamente con las plataformas Intel, AMD, Nvidia y ARM. El Grupo Khronos 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 usar el lenguaje de programación C para codificar algoritmos para su ejecución en las 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 para consumidores.
OpenVIDIA se desarrolló en la Universidad de Toronto entre 2003 y 2005, [14] en colaboración con Nvidia.
Altimesh Hybridizer, creado por Altimesh, compila binarios de Common Intermediate Language en 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 de computación de GPU DirectCompute , lanzada con la API DirectX 11 .
Alea GPU ,[19]creada por QuantAlea,[20]presenta capacidades nativas de computación de GPU para los lenguajesF#[21]yC#. Alea GPU también proporciona un modelo de programación de GPU simplificado basado en GPU en paralelo y en agregado paralelo utilizando 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 , ambos utilizados normalmente para juegos de computadora y videojuegos .
C++ Accelerated Massive Parallelism ( C++ AMP ) es una biblioteca que acelera la ejecución de código C++ aprovechando el hardware de datos paralelos en las GPU.
Debido a la tendencia de aumento de 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] Desde entonces, Renderscript ha quedado obsoleto en favor de los primeros sombreadores de cómputo OpenGL [26] y más tarde Vulkan Compute. [27] OpenCL está disponible en muchos dispositivos Android, pero Android no lo soporta oficialmente [ cita requerida ] . Apple presentó la API patentada Metal para aplicaciones iOS , capaz de ejecutar código arbitrario a través de los sombreadores de cómputo de la GPU de Apple [ cita requerida ] .
Las tarjetas de video para computadoras son producidas por varios proveedores, como Nvidia y AMD . Las tarjetas de estos proveedores difieren en la implementación de compatibilidad con formatos de datos, como formatos enteros y de punto flotante (32 bits y 64 bits). Microsoft introdujo un estándar Shader Model para ayudar a clasificar las diversas características de las tarjetas gráficas en un número de versión Shader Model simple (1.0, 2.0, 3.0, etc.).
Las tarjetas de video anteriores a DirectX 9 solo admitían tipos de colores con paleta o enteros. A veces se agrega otro valor alfa para usarlo con transparencia. Los formatos comunes son:
Para los primeros gráficos de función fija o de programabilidad limitada (es decir, hasta las GPU compatibles con DirectX 8.1 inclusive), esto era suficiente porque también es la representación utilizada en las pantallas. Esta representación tiene ciertas limitaciones. Si se cuenta 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 venía con las tarjetas de video que cumplen con la especificación DirectX 9.
DirectX 9 Shader Model 2.x sugería la compatibilidad con dos tipos de precisión: precisión completa y parcial. La compatibilidad con precisión completa podía ser FP32 o FP24 (coma flotante de 32 o 24 bits por componente) o superior, mientras que la precisión parcial era FP16. La serie de GPU Radeon R300 de ATI admitía precisión FP24 solo en la línea 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 mezcla 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 así en todos los proveedores. [28] 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 (float de doble precisión) están comúnmente disponibles en las CPU, estos no son universalmente compatibles en 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 punto flotante de doble precisión en GPU; sin embargo, la compensación de velocidad niega cualquier beneficio de descargar la computación en la GPU en primer lugar. [29]
La mayoría de las operaciones en la GPU funcionan de forma vectorizada: una operación puede realizarse en hasta cuatro valores a la vez. Por ejemplo, si un color ⟨R1, G1, B1⟩ debe modularse con otro color ⟨R2, G2, B2⟩ , la GPU puede producir el color resultante ⟨R1*R2, G1*G2, B1*B2⟩ en una sola operación. Esta funcionalidad es útil en gráficos porque casi todos los tipos de datos básicos son vectores (ya sean bidimensionales, tridimensionales o tetradimensionales). [ cita requerida ] Algunos ejemplos son los vértices, los colores, los vectores normales y las 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 desde hace mucho tiempo en las CPU. [ cita requerida ]
Originalmente, los datos se pasaban simplemente de una unidad central de procesamiento (CPU) a una unidad de procesamiento gráfico (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 simples y luego complejas de datos para ser pasadas de vuelta a la CPU que analizaba una imagen o un conjunto de datos científicos representados como un formato 2D o 3D que una tarjeta de video puede entender. Debido a que la GPU tiene acceso a cada operación de dibujo, 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, ya que la velocidad de acceso entre una CPU y su grupo más grande de memoria de acceso aleatorio (o en un caso aún peor, un disco duro ) es más lenta que las GPU y las tarjetas de video, que generalmente contienen cantidades más pequeñas de memoria más cara a la que se accede mucho más rápido. Transferir la parte del conjunto de datos que se analizará activamente a esa 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 de forma bidireccional desde la GPU a la CPU; generalmente, el rendimiento de datos en ambas direcciones es idealmente alto, lo que resulta en un efecto multiplicador en la velocidad de un algoritmo específico de alto uso .
Las canalizaciones GPGPU pueden mejorar la eficiencia en conjuntos de datos especialmente grandes y/o datos que contienen imágenes 2D o 3D. Se utilizan en canalizaciones de gráficos complejos, así como en computación científica ; más aún en campos con grandes conjuntos de datos como el mapeo genómico , o donde el análisis bidimensional o tridimensional es útil, especialmente en el análisis actual de biomoléculas , el estudio de proteínas y otros procesos complejos de química orgánica . Un ejemplo de tales aplicaciones es la suite de software NVIDIA para análisis genómico .
Estas secuencias de comandos también pueden mejorar enormemente la eficiencia en el procesamiento de imágenes y la visión artificial , entre otros campos, así como el procesamiento paralelo en general. Algunas secuencias de comandos muy optimizadas han producido aumentos de velocidad de varios cientos de veces en comparación con la secuencia de comandos original basada en CPU en una tarea de alto uso.
Un ejemplo sencillo sería un programa de GPU que recopila datos sobre los valores de iluminación promedio mientras reproduce una vista de una cámara o un programa de gráficos de computadora en el programa principal de la CPU, de modo que la CPU pueda realizar ajustes en la vista general de la pantalla. Un ejemplo más avanzado podría utilizar la detección de bordes para devolver tanto información numérica como 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 local y rápido por hardware a cada píxel u otro elemento de la imagen, puede analizarlo y promediarlo (para el primer ejemplo) o aplicar un filtro de bordes Sobel u otro filtro de convolución (para el segundo) con mucha 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 de hardware; es un tipo de algoritmo , no un equipo. Sin embargo, los diseños de equipos especializados pueden mejorar aún más la eficiencia de las tuberías GPGPU, que tradicionalmente realizan relativamente pocos algoritmos en cantidades muy grandes de datos. Por lo tanto, las tareas masivamente paralelizadas y a nivel de datos gigantescos pueden paralelizarse aún más mediante configuraciones especializadas como la computación en rack (muchas máquinas similares y altamente personalizadas integradas en un rack ), que agrega una tercera capa: muchas unidades de computación, cada una de las cuales usa muchas CPU para corresponderse con muchas GPU. Algunos "mineros" de Bitcoin usaban tales configuraciones para el procesamiento de grandes cantidades.
Históricamente, las CPU han utilizado cachés administrados por hardware , pero las GPU anteriores solo proporcionaban memorias locales administradas por software. Sin embargo, como las GPU se utilizan cada vez más para aplicaciones de propósito general, las GPU de última generación se están diseñando con cachés multinivel administrados por hardware que han ayudado a las GPU a avanzar hacia la informática convencional. Por ejemplo, las GPU de arquitectura GT200 de la serie GeForce 200 no presentaban un caché L2, la GPU Fermi tiene un caché de último nivel de 768 KiB, la GPU Kepler tiene un caché de último nivel de 1,5 MiB, [30] la GPU Maxwell tiene un caché de último nivel de 2 MiB y la GPU Pascal tiene un caché de último nivel de 4 MiB.
Las GPU tienen archivos de registro muy grandes , lo que les permite reducir la latencia de cambio de contexto. El tamaño del archivo de registro también aumenta en las diferentes generaciones de GPU, por ejemplo, el tamaño total del archivo de registro en las GPU Maxwell (GM200), Pascal y Volta son 6 MiB, 14 MiB y 20 MiB, respectivamente. [31] [32] 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 se produce a costa de un alto consumo de energía, que a plena carga es de hecho tanta energía como el resto del sistema de PC combinado. [33] El consumo máximo de energía de la GPU de la serie Pascal (Tesla P100) se especificó en 250 W. [34]
Las GPU están diseñadas específicamente para gráficos y, por lo tanto, son muy restrictivas en cuanto a operaciones y programación. Debido a su diseño, las GPU solo son efectivas para problemas que se pueden resolver mediante el procesamiento de flujo y el hardware solo se puede usar de ciertas maneras.
La siguiente discusión referente a vértices, fragmentos y texturas concierne principalmente al modelo heredado de programación GPGPU, donde se utilizaban API de gráficos ( OpenGL o DirectX ) para realizar cálculos de propósito general. Con la introducción de las API de computación de propósito general CUDA (Nvidia, 2007) y OpenCL (vendor-independent, 2008), en los nuevos códigos GPGPU ya no es necesario mapear el cálculo a primitivas gráficas. La naturaleza de procesamiento de flujo de las GPU sigue siendo válida independientemente de las API utilizadas. (Véase, por ejemplo, [35] )
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 desea procesar muchos vértices o fragmentos de la misma manera. En este sentido, las GPU son procesadores de flujo: procesadores que pueden operar en paralelo ejecutando un núcleo en muchos registros de un flujo a la vez.
Un flujo es simplemente un conjunto de registros que requieren un cálculo similar. Los flujos proporcionan paralelismo de datos. Los núcleos son las funciones que se aplican a cada elemento del flujo. En las GPU, los vértices y fragmentos son los elementos de los flujos y los sombreadores de vértices y fragmentos son los núcleos que se ejecutan en ellos. [ dudoso – discutir ] Para cada elemento solo podemos leer desde la entrada, realizar operaciones en él y escribir en la salida. Es permisible tener múltiples entradas y múltiples salidas, pero nunca una pieza de memoria que sea legible y escribible. [ vago ]
La intensidad aritmética se define como la cantidad 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. [36]
Las aplicaciones GPGPU ideales tienen grandes conjuntos de datos, alto paralelismo y mínima dependencia entre los elementos de datos.
Hay una variedad de recursos computacionales disponibles en la GPU:
De hecho, un programa puede sustituir una textura de solo escritura para la salida en lugar del búfer de cuadros. Esto se hace mediante Render to Texture (RTT), Render-To-Backbuffer-Copy-To-Texture (RTBCTT) o la salida de flujo más reciente.
La forma más común que puede adoptar un flujo en GPGPU es una cuadrícula 2D, ya que se adapta de forma natural al modelo de renderizado integrado en las GPU. Muchos cálculos se asignan de forma natural a cuadrículas: álgebra matricial, procesamiento de imágenes, simulación basada en la física, etc.
Dado que las texturas se utilizan como memoria, las búsquedas de texturas se utilizan como lecturas de memoria. Gracias a esto, la GPU puede realizar ciertas operaciones automáticamente.
Los núcleos de cómputo pueden considerarse como el cuerpo de los bucles . Por ejemplo, un programador que opera en una cuadrícula en la CPU podría tener un código que se parece a esto:
// Las cuadrículas de entrada y salida tienen 10000 x 10000 o 100 millones de elementos.void transform_10k_by_10k_grid ( float in [ 10000 ][ 10000 ], float out [ 10000 ][ 10000 ]) { for ( int x = 0 ; x < 10000 ; x ++ ) { for ( int y = 0 ; y < 10000 ; y ++ ) { // La siguiente línea se ejecuta 100 millones de veces out [ 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 de geometría.
En el código secuencial es posible controlar el flujo del programa mediante instrucciones if-then-else y diversas formas de bucles. Estas estructuras de control de flujo se han añadido recientemente a las GPU. [37] Las escrituras condicionales se podían realizar mediante una serie de operaciones aritméticas/de bits diseñadas adecuadamente, pero los bucles y las ramificaciones condicionales no eran posibles.
Las GPU recientes [ ¿cuándo? ] permiten la ramificación, pero generalmente con una penalización de rendimiento. En general, se debe evitar la ramificación en bucles internos, ya sea en el código de la CPU o de la GPU, y se pueden usar varios métodos, como la resolución de ramificación estática, el precomputado, la predicción, la división de bucles [38] y la eliminación Z [39] para lograr la ramificación cuando no existe soporte de hardware.
La operación de mapeo simplemente aplica la función dada (el núcleo) a cada elemento del flujo. Un ejemplo simple es multiplicar cada valor del flujo por una constante (lo que aumenta el brillo de una imagen). La operación de mapeo es fácil 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 resultante del mismo tamaño se almacena en el búfer de salida.
Algunos cálculos requieren calcular un flujo más pequeño (posiblemente un flujo de un solo elemento) a partir de un flujo más grande. Esto se denomina reducción del flujo. 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 sobre el que se aplica la operación se reduce hasta que solo quede un elemento del flujo.
El filtrado de flujo es básicamente una reducción no uniforme. El filtrado implica eliminar elementos del flujo en función de ciertos criterios.
La operación de escaneo, también denominada suma de prefijos en 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 que exista una identidad. Si bien a primera vista la operación puede parecer inherentemente serial, son posibles algoritmos de escaneo paralelo eficientes y se han implementado en unidades de procesamiento gráfico. La operación de escaneo tiene usos en, por ejemplo, la ordenación rápida y la multiplicación de matriz-vector dispersa. [35] [40] [41] [42]
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 es fija en el momento de la creación del fragmento y el programador no puede modificarla. Sin embargo, a veces es posible reformular o implementar una operación de dispersión lógica con otro paso de recopilación. Una implementación de dispersión emitiría primero un valor de salida y 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 núcleos de cómputo dedicados , la dispersión se puede realizar mediante escrituras indexadas.
Gather es lo opuesto a scatter. Después de que scatter reordena los elementos según un mapa, Gather puede restaurar el orden de los elementos según el mapa de dispersión utilizado. En núcleos de cómputo dedicados, Gather puede realizarse mediante lecturas indexadas. En otros sombreadores, se realiza con búsquedas de texturas.
La operación de ordenación transforma un conjunto desordenado de elementos en un conjunto ordenado de elementos. La implementación más común en GPU es la ordenación por radix para datos enteros y de punto flotante, y la ordenación por combinación de grano grueso y las redes de ordenación de grano fino para datos comparables generales. [43] [44]
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. El método de búsqueda que se utiliza generalmente es la búsqueda binaria en elementos ordenados.
Se pueden representar diversas estructuras de datos en la GPU:
Las siguientes son algunas de las áreas en las que se han utilizado GPU para informática de propósito general:
Uso de GPGPU en bioinformática: [59] [83]
† Las aceleraciones esperadas dependen en gran medida de la configuración del sistema. Rendimiento de la GPU comparado con el socket de CPU x86 de múltiples núcleos. Rendimiento de la GPU evaluado en función de las características admitidas por la GPU y puede ser una comparación de rendimiento de núcleo a núcleo. 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 sobre la certificación.
Lowry está utilizando GPU (unidades de procesamiento gráfico) Tesla de Nvidia programadas en la CUDA (Compute Unified Device Architecture) de la empresa 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 señal en estaciones de trabajo que tienen unidades de procesamiento gráfico (GPU) basadas en la arquitectura de dispositivo unificado de cómputo de Nvidia (CUDA)
Durante las pruebas internas, el Tesla S1070 demostró un aumento de 360 veces en la velocidad del algoritmo de definición de similitud en comparación con el popular procesador central Intel Core 2 Duo que funciona a una velocidad de reloj de 2,6 GHz.