¿Cuándo debo descargar el trabajo en una GPU en lugar de la CPU?

14

Se están creando sistemas más nuevos como OpenCL para que podamos ejecutar cada vez más código en nuestros procesadores gráficos, que tiene sentido, porque deberíamos poder utilizar la mayor cantidad de energía posible en nuestros sistemas.

Sin embargo, con todos estos nuevos sistemas, parece que las GPU son mejores que las CPU en todos los sentidos . Debido a que las GPU pueden realizar cálculos paralelos, las GPU de múltiples núcleos realmente parecen ser mucho mejores que las CPU de múltiples núcleos; Podrías hacer muchos cálculos a la vez y realmente mejorar la velocidad. ¿Existen todavía ciertos casos en los que el procesamiento en serie es aún mejor, más rápido y / o más eficiente que el paralelo?

    
pregunta RétroX 11.09.2011 - 16:45
fuente

7 respuestas

26
  

Sin embargo, con todos estos nuevos sistemas, parece que las GPU son mejores   que las CPU en todos los sentidos.

Este es un malentendido fundamental. Los núcleos de GPU actuales todavía son limitados en comparación con las CPU de primera línea actuales. Creo que la arquitectura Fermi de NVIDIA es la GPU más potente actualmente disponible. Solo tiene registros de 32 bits para aritmética de enteros, y menos capacidad para la predicción de bifurcaciones y la ejecución especulativa que un procesador Intel de productos básicos actual. Los chips Intel i7 proporcionan tres niveles de almacenamiento en caché, los núcleos Fermi solo tienen dos, y cada caché en el Fermi es más pequeño que el caché correspondiente en el i7. La comunicación entre procesos entre los núcleos de GPU es bastante limitada, y sus cálculos deben ser estructurados para adaptarse a esa limitación (los núcleos se agrupan en bloques y la comunicación entre núcleos en un bloque es relativamente rápida, pero la comunicación entre bloques es lenta). p>

Una limitación importante de las GPU actuales es que todos los núcleos tienen que estar ejecutando el mismo código. A diferencia de los núcleos en su CPU, no puede decirle a un núcleo de GPU que ejecute su cliente de correo electrónico, y otro núcleo que ejecute su servidor web. Le da a la GPU la función de invertir una matriz, y todos los núcleos ejecutan esa función en diferentes bits de datos.

Los procesadores de la GPU viven en un mundo aislado. Pueden controlar la pantalla, pero no tienen acceso al disco, a la red ni al teclado.

El acceso al sistema de GPU tiene costos generales sustanciales. La GPU tiene su propia memoria, por lo que sus cálculos se limitarán a la cantidad de memoria en la tarjeta GPU. La transferencia de datos entre la memoria de la GPU y la memoria principal es relativamente costosa. Pragmáticamente, esto significa que no hay ningún beneficio en el manejo de unos pocos cálculos cortos desde la CPU a la GPU, ya que los costos de instalación y desmontaje abarrotarán el tiempo requerido para realizar el cálculo.

La conclusión es que las GPU son útiles cuando tiene muchas (como en cientos o miles) de copias de un cálculo largo que se pueden calcular en paralelo. Las tareas típicas para las que esto es común son la computación científica, la codificación de video y el procesamiento de imágenes. Para una aplicación como un editor de texto, la única función en la que una GPU podría ser útil es en la visualización del tipo en la pantalla.

    
respondido por el Charles E. Grant 11.09.2011 - 21:38
fuente
11

Las GPU no son procesadores generalistas como lo son las CPU. Se especializan en hacer una cosa muy específica: aplicar el mismo código a una gran cantidad de datos, y lo hacen muy, muy bien, mucho mejor que una CPU. Pero la mayoría de las aplicaciones no se trata de aplicar el mismo código a una gran cantidad de datos; se trata de un bucle de eventos: esperar una entrada, leer la entrada, actuar sobre ella y luego esperar más entradas. Es un proceso bastante serial, y las GPU apestan a "serial".

Cuando tiene una gran cantidad de datos que necesita procesar, y cada elemento puede procesarse en paralelo, independientemente de los otros, luego continúe y envíelo a la GPU. Pero no piense en esto como "el nuevo paradigma" en el que todo debe ser comprimido.

Esta pregunta está etiquetada como "optimización", así que recuerde tratarla como una. Aplique la optimización de GPU donde las pruebas y los perfiles revelan que la optimización es necesaria y que la naturaleza de la tarea es tal que la optimización de GPU se puede aplicar. De lo contrario, no te preocupes por eso, ya que sería una optimización prematura o incorrecta, lo que causa más problemas de los que soluciona.

    
respondido por el Mason Wheeler 11.09.2011 - 21:17
fuente
8

La respuesta simple es que una GPU funciona mejor cuando necesita realizar un cálculo bastante pequeño y bastante simple en cada uno de un gran número de elementos. Para lograr mucho de esta manera, el cálculo para cada artículo debe ser independiente de los cálculos para los otros artículos. Si hay (normalmente) alguna dependencia entre un elemento y otro, generalmente necesita descubrir alguna forma de romperlo antes de que pueda obtener mucho de la ejecución de ese código en la GPU. Si la dependencia no se puede romper en absoluto, o requiere demasiado trabajo para romper, el código podría ejecutarse más rápido en la CPU.

La mayoría de las CPU actuales también admiten bastantes tipos de operaciones que las GPU actuales simplemente no intentan admitir en absoluto (por ejemplo, protección de memoria para tareas múltiples).

Mirándolo desde una dirección ligeramente diferente, las CPU han sido (en gran medida) diseñadas para ser razonablemente convenientes para los programadores, y la gente de hardware ha hecho todo lo posible (¡y lo mejor es que es!) para crear hardware que mantenga eso Un modelo conveniente para el programador, pero aún se ejecuta lo más rápido posible.

Las GPU vienen en direcciones bastante opuestas: están diseñadas en gran medida para que sean convenientes para el diseñador de hardware, y cosas como OpenCL han intentado proporcionar un modelo de programación lo más razonable posible dadas las limitaciones del hardware. / p>

Escribir el código para ejecutarse en una GPU generalmente toma más tiempo y esfuerzo (por lo que costará más) que hacer lo mismo en la CPU. Como tal, hacerlo principalmente tiene sentido cuando / si:

  1. El problema es tan paralelo que puede esperar una gran ganancia de un esfuerzo mínimo, o
  2. El aumento de velocidad es tan importante que justifica una gran cantidad de trabajo adicional.

Hay algunas posibilidades obvias para cada una, pero una cantidad enorme de aplicaciones claramente no están cerca de ninguna de las dos. Me sorprendería mucho ver (por ejemplo) una aplicación CRUD que se ejecuta en una GPU en el futuro (y si lo hace, probablemente sucederá porque alguien partió con ese objetivo exacto en mente, no necesariamente nada que se aproxime a un óptimo relación costo / beneficio).

La realidad es que para muchas de las aplicaciones (estoy tentado de decir "la mayoría"), una CPU típica es más que lo suficientemente rápida, y la conveniencia de programación (lo que lleva a un desarrollo más sencillo de nuevas funciones) es < em> much más importante que la velocidad de ejecución.

    
respondido por el Jerry Coffin 11.09.2011 - 20:15
fuente
3
  

Podrías hacer muchos cálculos a la vez y realmente mejorar la velocidad.

mejorar la velocidad? ¿Y qué? Hasta el año pasado puedo recordar solo una o dos veces cuando fue necesario. La mayoría de las veces se me pidió que modificara o corrigiera la lógica, que ajustara un origen de datos diferente, que mejorara la interacción del usuario, etc. La única velocidad que los clientes estaban interesados en estos casos era la velocidad de creación. un cambio. "Por favor, lance una nueva característica en un mes, o mejor aún, en dos semanas".

No me malinterpretes: como programador disfruto apretando a fondo los tics de la CPU. Es solo que este arte no suele ser muy solicitado.

  

¿Existen todavía ciertos casos en los que el procesamiento en serie es aún mejor, más rápido y / o más eficiente que el paralelo?

Yo diría que hay muchos casos. El procesamiento en serie es más simple que el paralelo, lo que lo hace más eficiente en todos los casos cuando la velocidad no es un requisito crítico. El procesamiento en serie permite una implementación más sencilla de la lógica complicada y la interfaz de usuario, es más fácil de especificar y probar, mantener y cambiar.

Como regla general, el procesamiento en serie permite una expresión más clara de la intención del programador y una lectura más fácil del código. Yo diría que ahorra el recurso más valioso y escaso: el cerebro del programador.

    
respondido por el gnat 11.09.2011 - 18:42
fuente
2

Las CPU son aún más versátiles. Por ejemplo, las GPU son más eficientes que las CPU en precisión simple, pero no en precisión doble. Hay muchas más bibliotecas para las CPU que para las GPU.

    
respondido por el quant_dev 11.09.2011 - 18:11
fuente
2

La regla simple es que si lo que estás haciendo puede expresarse en términos de construcciones de álgebra lineal y es crítico para el tiempo, hazlo en la GPU, de lo contrario, utiliza la CPU.

Las GPU no son como un gran número de CPU, tienen características de rendimiento muy diferentes.

    
respondido por el dan_waterworth 11.09.2011 - 20:33
fuente
1

Si necesita procesar números en bruto, las GPU son el camino a seguir. Sin embargo, todas esas ALU significan que hay menos transistores dedicados a controlar los circuitos de flujo (ramificación). Por lo tanto, si necesita escribir algo que requiera mucho flujo de control complejo, muchos condicionales, etc., entonces una CPU será más rápida.

    
respondido por el Alex 12.09.2011 - 03:45
fuente

Lea otras preguntas en las etiquetas