Pregunta ¿Por qué seguimos usando CPU en lugar de GPU?


Me parece que en estos días se hacen muchos cálculos en la GPU. Obviamente, los gráficos se hacen allí, pero usando CUDA y similares, AI, los algoritmos hash (think bitcoins) y otros también se hacen en la GPU. ¿Por qué no podemos simplemente deshacernos de la CPU y usar la GPU por sí misma? ¿Qué hace que la GPU sea mucho más rápida que la CPU?


352


origen


¿cómo sé qué respuestas contienen información correcta? ¿Debo esperar hasta que otros arriba / abajo voten las respuestas? Creo que fui demasiado apresurado para aceptar una respuesta: O - ell
Hay algunas respuestas recientes, ahora, que no contienen "información errónea". Están subiendo gradualmente a la cima con votos al alza debido al eficiente mecanismo de mercado del maravillosamente diseñado StackExchange ;-) Sugiero esperar un poco más antes de aceptar una respuesta. Parece que con mucha prudencia estás haciendo exactamente eso. Esta es una buena pregunta, por cierto. Puede parecer obvio, pero no lo es en absoluto. ¡Gracias por preguntar! - Ellie Kesselman
Algo así como preguntar "Si Boeing 747 es más rápido y más eficiente en el consumo de combustible, ¿por qué todavía manejamos automóviles?" - vartec
No, porque no es RISC versus CISC. Es uno de los otros fundamentos de la informática, ligeramente disfrazado. Sus "¿Por qué descargamos el trabajo del procesador central a los procesadores de E / S?". - JdeBP
@vartec: Creo que una analogía ligeramente mejor podría ser entre autobuses y taxis. Si hay cuarenta personas que quieren ir del mismo lugar al mismo lugar, un autobús será mucho más eficiente. Si hay cuarenta personas cuyos orígenes y destinos deseados están muy dispersos, incluso un solo taxi puede ser tan bueno como un autobús, y por el costo del autobús uno podría tener múltiples taxis. - supercat


Respuestas:


Respuesta de TL; DR: Las GPU tienen muchos más núcleos de procesador que las CPU, pero debido a que cada núcleo GPU funciona significativamente más lento que un núcleo de CPU y no tienen las características necesarias para los sistemas operativos modernos, no son apropiados para realizar la mayoría del procesamiento en la informática cotidiana. Son los más adecuados para operaciones de cómputo intensivo, como procesamiento de video y simulaciones de física.


GPGPU sigue siendo un concepto relativamente nuevo. Las GPU se usaron inicialmente para renderizar gráficos solamente; a medida que avanzó la tecnología, se explotó la gran cantidad de núcleos en las GPU en relación con las CPU mediante el desarrollo de capacidades computacionales para las GPU para que puedan procesar muchas secuencias paralelas de datos simultáneamente, sin importar cuáles sean esos datos. Mientras que las GPU pueden tener cientos o incluso miles de procesadores de flujo, cada uno funciona más lento que un núcleo de CPU y tiene menos funciones (incluso si son Turing completo y puede programarse para ejecutar cualquier programa que pueda ejecutar una CPU). Las características que faltan en las GPU incluyen interrupciones y memoria virtual, que son necesarias para implementar un sistema operativo moderno.

En otras palabras, las CPU y GPU tienen arquitecturas significativamente diferentes que las hacen más adecuadas para diferentes tareas. Una GPU puede manejar grandes cantidades de datos en muchas secuencias, realizando operaciones relativamente simples en ellas, pero no es adecuada para procesos pesados ​​o complejos en una o varias secuencias de datos. Una CPU es mucho más rápida por núcleo (en términos de instrucciones por segundo) y puede realizar operaciones complejas en una o varias secuencias de datos más fácilmente, pero no puede manejar muchas transmisiones de forma simultánea.

Como resultado, las GPU no son adecuadas para manejar tareas que no se benefician significativamente o no se pueden paralelizar, incluidas muchas aplicaciones de consumo comunes, como procesadores de texto. Además, las GPU usan una arquitectura fundamentalmente diferente; uno tendría que programar una aplicación específicamente para una GPU para que funcione, y se requieren técnicas significativamente diferentes para programar las GPU. Estas diferentes técnicas incluyen nuevos lenguajes de programación, modificaciones a los lenguajes existentes y nuevos paradigmas de programación que son más adecuados para expresar un cálculo como una operación paralela que deben realizar muchos procesadores de flujo. Para obtener más información sobre las técnicas necesarias para programar GPU, consulte los artículos de Wikipedia en procesamiento de flujo y computación paralela.

Las GPU modernas son capaces de realizar operaciones vectoriales y aritmética de coma flotante, con las últimas tarjetas capaces de manipular números de coma flotante de doble precisión. Los marcos como CUDA y OpenCL permiten que los programas se escriban para GPU, y la naturaleza de las GPU los hace más adecuados para operaciones altamente paralelizables, como en computación científica, donde una serie de tarjetas de cálculo GPU especializadas pueden ser un reemplazo viable para una pequeña clúster de cálculo como en Supercomputadores personales NVIDIA Tesla. Los consumidores con GPU modernas con experiencia en Folding @ home pueden usarlas para contribuir con Clientes de GPU, que puede realizar simulaciones de plegamiento de proteínas a velocidades muy altas y contribuir con más trabajo al proyecto (asegúrese de leer el Preguntas frecuentes primero, especialmente aquellos relacionados con GPU). Las GPU también pueden permitir una mejor simulación física en videojuegos utilizando PhysX, acelerar la codificación y la decodificación de video, y realizar otras tareas de cálculo intensivo. Son estos tipos de tareas que las GPU son las más adecuadas para realizar.

AMD es pionero en el diseño de un procesador llamado Unidad de procesamiento acelerado (APU) que combina núcleos de CPU x86 convencionales con GPU. Este enfoque permite un rendimiento gráfico muy superior a las soluciones gráficas integradas en la placa base (aunque no coincide con las GPU discretas más costosas), y permite un sistema compacto y de bajo costo con buen rendimiento multimedia sin la necesidad de una GPU separada. Los últimos procesadores Intel también ofrecen gráficos integrados en el chip, aunque el desempeño competitivo de la GPU integrada actualmente se limita a los pocos chips con Intel Iris Pro Graphics. A medida que la tecnología continúe avanzando, veremos un grado creciente de convergencia de estas partes una vez separadas. AMD se imagina un futuro en el que la CPU y la GPU son una, capaces de trabajar a la perfección en la misma tarea.

No obstante, muchas tareas realizadas por los sistemas operativos y aplicaciones de PC son aún más adecuadas para las CPU, y se necesita mucho trabajo para acelerar un programa que utiliza una GPU. Como tanto software existente usa la arquitectura x86, y como las GPU requieren diferentes técnicas de programación y faltan varias características importantes necesarias para los sistemas operativos, es muy difícil una transición general de la CPU a la GPU para la informática cotidiana.


373



Al igual que esta respuesta, creo que la razón principal es que no tenemos buenos lenguajes de programación de flujo principal para tratar con arquitecturas paralelas como esta. Hemos luchado durante décadas para avanzar en la programación de múltiples hilos, y la gente sigue llamando "multi-threading" "mal". A pesar de que las CPU y GPU multinúcleo son una realidad, tendremos que idear nuevos paradigmas de programación para lidiar con esto. - Soren
Vale la pena señalar que Intel ha estado trabajando en Larrabee arquitectura (por demasiado tiempo) que es esencialmente un chip con una gran cantidad de núcleos x86. - Chris S
Gran respuesta para discutir las razones de hardware y discutir las APU y cómo van a cambiar esto. Sin embargo, @Soren da un muy buen punto en el lado del software. En realidad, es la combinación de los problemas de hardware, los problemas de software y el hecho de que las CPU funcionan y cuando se sabe que algo funciona, es difícil que la gente lo reemplace. - Nich Del
"No tenemos buenos lenguajes de programación de flujo principal para tratar con arquitecturas paralelas como esta". - Haskell, OCaml, Scheme, F #, Erlang, y prácticamente cualquier otro programa funcional de lenguajes con multihilo muy bien. Todos los que mencioné son convencionales. - BlueRaja - Danny Pflughoeft
@BlueRaja: conocemos estos idiomas, tu definición de flujo principal debe ser diferente a la mía :-) - Soren


¿Qué hace que la GPU sea mucho más rápida que la CPU?

La GPU es no más rápido que la CPU. CPU y GPU están diseñados con dos objetivos diferentes, con diferentes intercambios, por lo que tienen diferente característica de rendimiento Ciertas tareas son más rápidas en una CPU, mientras que otras tareas se computan más rápidamente en una GPU. La CPU sobresale al hacer manipulaciones complejas a un pequeño conjunto de datos, la GPU se destaca por hacer manipulaciones simples a un gran conjunto de datos.

La GPU es una CPU de propósito especial, diseñada para que una sola instrucción funcione sobre un gran bloque de datos (SIMD / Single Instruction Multiple Data), todos aplicando la misma operación. Trabajar en bloques de datos es ciertamente más eficiente que trabajar con una sola célula a la vez porque hay una sobrecarga mucho menor en decodificar las instrucciones, sin embargo, trabajar en bloques grandes significa que hay más unidades de trabajo paralelas, por lo que usa mucho más transistores para implementar una sola instrucción de GPU (causando restricción de tamaño físico, usando más energía y produciendo más calor).

La CPU está diseñada para ejecutar una sola instrucción en un solo dato lo más rápido posible. Como solo necesita trabajar con un solo dato, la cantidad de transistores necesarios para implementar una sola instrucción es mucho menor, por lo que una CPU puede tener un conjunto de instrucciones más grande, una ALU más compleja, una mejor predicción de bifurcación y una mejor virtualización arquitectura, y un esquema de caché / canalización más sofisticado. Sus ciclos de instrucciones también son más rápidos.

La razón por la que todavía estamos usando CPU es no porque x86 es el rey de la arquitectura de CPU y Windows está escrito para x86, la razón por la que todavía estamos usando CPU es porque el tipo de tareas que un sistema operativo necesita hacer, es decir, tomar decisiones, se ejecuta de manera más eficiente en una arquitectura de CPU. Un sistema operativo necesita ver cientos de diferentes tipos de datos y tomar varias decisiones, las cuales dependen una de la otra; este tipo de trabajo no se paraleliza fácilmente, al menos no en una arquitectura SIMD.

En el futuro, lo que veremos es una convergencia entre la CPU y la arquitectura de la GPU a medida que la CPU adquiere la capacidad de trabajar sobre bloques de datos, p. SSE. Además, a medida que la tecnología de fabricación mejora y los chips se hacen más pequeños, la GPU puede permitirse implementar instrucciones más complejas.


245



Esta es probablemente la mejor respuesta aquí. Es importante entender las diferencias fundamentales entre los dos paradigmas. Para que las GPU superen a las CPU, teniendo en cuenta las cargas de trabajo actuales, esencialmente significa que una GPU debe convertirse en una CPU. Y así la pregunta es la respuesta. - surfasb
+1 por ser la mejor respuesta. Tanto esta como la respuesta aceptada son correctas, pero esta la explica mucho más claramente.
Me sorprende que nadie en este hilo haya mencionado la sobrecarga de enviar datos a la GPU: el ancho de banda limitado sobre los buses PCI-Express hace que algunas operaciones paralelas en una GPU sean mucho más lentas de lo que se realizaron en la CPU. Se puede ver un caso simple en el que variar el tamaño de una FFT hizo una diferencia significativa en el rendimiento en GPU vs. CPU debido a la sobrecarga de enviar datos, configurar un contexto, leer resultados: stackoverflow.com/a/8687732/303612 Las operaciones más pequeñas se pueden realizar en caché en las CPU, y el ancho de banda de la memoria es muy superior a la arquitectura PCI-E actual. - Dr. Andrew Burnett-Thompson
@ Dr. Andrew Burnett-Thompson: eso es porque eso es irrelevante para la pregunta. Actualmente, GPU se considera una unidad de procesamiento auxiliar, es por eso que mover datos de / a una GPU es necesario y costoso. Si tratamos a la GPU como la unidad de procesamiento de primera clase, no será necesario ordenar los datos entre la memoria principal y la memoria de la GPU. - Lie Ryan
No es optimista, no tiene una sobrecarga de ancho de banda cero. Si un procesador con una arquitectura de GPU ejecuta todo el espectáculo, no hay nada que deba moverse, la memoria de la GPU es la memoria principal. En primer lugar, no se debe hablar de gastos indirectos de transferencia porque no hay transferencias. Por cierto, esto no es hipotético, las APU de AMD usan HSA (arquitectura de sistema heterogénea) con memoria principal unificada que permite la copia cero entre la CPU y la GPU. - Lie Ryan


GPUs carecen:

  1. Memoria virtual (!!!)
  2. Medios para direccionar dispositivos que no sean de memoria (por ejemplo, teclados, impresoras, almacenamiento secundario, etc.)
  3. Interrupciones

Necesita estos para poder implementar cualquier cosa como un sistema operativo moderno.

También son (relativamente) lentos en la aritmética de precisión doble (en comparación con su rendimiento aritmético de precisión simple) *, y son mucho más grandes (en términos de tamaño del silicio). Las arquitecturas antiguas de GPU no son compatibles con las llamadas indirectas (a través de punteros de función) necesarias para la mayoría de las aplicaciones de propósito general, y las arquitecturas más recientes que lo hacen lentamente. Finalmente, (como han notado otras respuestas), para las tareas que no se pueden paralelizar, las GPU pierden en comparación con las CPU con la misma carga de trabajo.

EDITAR: Tenga en cuenta que esta respuesta se escribió en 2011: la tecnología GPU es un área que cambia constantemente. Las cosas podrían ser muy diferentes dependiendo de cuándo estés leyendo esto: P

* Algunas GPU no son lentas en la aritmética de doble precisión, como las líneas Quadro o Tesla de NVidia (generación Fermi o más reciente), o la línea FirePro de AMD (generación GCN o más reciente). Pero estos no están en la mayoría de las máquinas de los consumidores.


75



@Cicada: ¿Tiene una referencia para eso? En cualquier caso, incluso si eso es cierto, incluso el hardware reciente no funcionará bien en ese caso. (por ejemplo, no tendría demasiada ventaja de rendimiento sobre una CPU, y una desventaja de consumo de energía) - Billy ONeal
Sí, los dispositivos Fermi como dijiste (con CUDA 4.0 y sm_20), admiten saltos indirectos (y, por lo tanto, métodos virtuales C ++, herencia, etc.). - Angry Lettuce
544 GigaFLOPS de una GPU de $ 2 hace 2 años es lento? - Ben Voigt
@Ben: solo obtienes ese tipo de rendimiento en aplicaciones de datos paralelos. Las operaciones secuenciales generales son un juego de pelota completamente diferente. (Eso es solo con los 1600 núcleos en ese chip corriendo en paralelo, ejecutando esencialmente la misma instrucción una y otra vez ... e incluso eso es más teórico que real) - Billy ONeal
@Billy: Pero eso es lentitud en una clase particular de algoritmos, no lentitud en la aritmética de precisión doble (que es lo que usted afirmó). (Y las CPU generalmente no alcanzan rendimientos de referencia tampoco) - Ben Voigt


Una CPU es como un trabajador que funciona muy rápido. Una GPU es como un grupo de trabajadores de clonación que funciona rápido, pero que todos tienen que hacer exactamente lo mismo al unísono (con la excepción de que puede tener algunos clones inactivos si lo desea)

¿Qué preferirías tener como tu compañero desarrollador, un chico súper rápido o 100 clones rápidos que no son tan rápidos, pero todos tienen que realizar las mismas acciones simultáneamente?

Para algunas acciones, los clones son bastante buenos, p. barrer el piso; cada uno puede barrer una parte.

Para algunas acciones, los clones apestan, p. escriba el informe semanal: todos los clones, excepto uno, permanecen inactivos mientras un clon escribe el informe (de lo contrario, obtendrá 100 copias del mismo informe).


37



¿Podría incluso tener ... ambos? - Kevin Panko
@ Kevin: Sí, pero necesitarías una computadora con ambos una CPU y una GPU! ¡Si hubiera tal cosa! - Joachim Sauer
Gran analogía. Lo recordaré - Mayo


Porque las GPU están diseñadas para hacer muchas cosas pequeñas a la vez, y las CPU están diseñadas para hacer una cosa por vez. Si su proceso puede hacerse masivamente paralelo, como el hash, la GPU es en gran medida más rápida, de lo contrario no lo será.

Su CPU puede calcular un hash mucho, mucho más rápido que su GPU, pero el tiempo que le tome a su CPU hacerlo, su GPU podría estar en medio de varios cientos de hashes. Las GPU están diseñadas para hacer muchas cosas al mismo tiempo, y las CPU están diseñadas para hacer una cosa a la vez, pero muy rápido.

El problema es que las CPU y GPU son soluciones muy diferentes para problemas muy diferentes, hay una pequeña superposición, pero generalmente lo que está en su dominio permanece en su dominio. No podemos reemplazar la CPU con una GPU porque la CPU está trabajando mucho mejor que una GPU, simplemente porque una GPU no está diseñada para hacer el trabajo, y una CPU sí lo hace.

Una pequeña nota al margen, sin embargo, si fuera posible eliminar la CPU y solo tener una GPU, ¿no crees que la cambiaríamos? :)


23



Creo que las CPU más modernas están diseñadas para hacer 2, 4 u 8 cosas a la vez. - danielcg
@ danielcg25: Y la mayoría de las GPU modernas están diseñadas para hacer 256, 512, 1024 cosas a la vez (la GTX 680 tiene 1536 Núcleos CUDA). Cada núcleo de CPU individual es una entidad distinta conceptualmente, pero esto no es cierto para una GPU. - Phoshi
@ danielcg25: Estoy al tanto, pero un comentario con un malentendido fundamental (aunque intencional) de la respuesta podría ser dañino si alguien lo estuviera leyendo sin conocer el tema. "Ser un burro" en ese sentido no es muy apreciado en SE ya que reduce la relación señal / ruido. - Phoshi
Solo estaba proporcionando información. La mayoría de las computadoras actualmente en realidad son capaces de procesar de 2 a 8 cosas a la vez. Algunos procesadores pueden hacer incluso más que eso. Todavía no se acerca a las GPU que hacen cientos de cosas a la vez. - danielcg
@ danielcg25: Es un tipo diferente de procesamiento, sin embargo, de eso se trata la pregunta. Cada núcleo de CPU está efectivamente separado, trabajando con sus propios fragmentos de datos y sus propios procesos. Cada núcleo de CPU realiza una tarea diferente y separada entre sí, y no aumentan su escala de forma lineal: un octo-núcleo no es el doble de útil ya que un núcleo cuádruple no es dos veces más útil que un núcleo doble. Los núcleos GPU, por otro lado, realizan la misma tarea en diferentes partes de datos, y escalan linealmente. Es obvio que existen CPU multi-core, pero esto no es lo mismo. - Phoshi


¿Estás realmente preguntando ¿Por qué no estamos usando arquitecturas similares a GPU en la CPU?

GPU es solo una CPU especializada de una tarjeta gráfica. Prestamos cómputo no gráfico a la GPU porque la CPU de propósito general no está a la par en paralelo y la ejecución en coma flotante.

En realidad, estamos usando arquitecturas de CPU diferentes (más GPU-ish). P.ej. Niágara los procesadores son bastante multitarea. SPARC T3 ejecutará 512 hilos concurrentes.


14



¿Por qué un downvote? - jkj
Supongo que la última línea, ya que es simplemente falso. De hecho, solo puedo pensar en un sistema operativo convencional de solo x86; e incluso ese ha sido portado a procesadores alpha y ARM, simplemente no comercialmente ofrecido en este momento. - Javier
De acuerdo. Se eliminó la última sección que era mi opinión sobre el soporte del sistema operativo principal que dificulta el cambio a las nuevas arquitecturas. Puede que no esté en el alcance de la respuesta. - jkj


Podría estar horriblemente equivocado aquí, y estoy hablando de poca o ninguna autoridad sobre el tema, pero aquí va:

  • Creo que cada unidad de ejecución de GPU ("core") tiene un espacio de direcciones muy limitado en comparación con una CPU.

  • Las unidades de ejecución de GPU no pueden manejar la bifurcación de manera eficiente.

  • Las unidades de ejecución de GPU no admiten interrupciones de hardware de la misma manera que las CPU.

Siempre he pensado que la forma en que las unidades de ejecución de GPU debían ser es algo así como las "SPEs" de Playstation 3, quieren que les den un bloque de datos, ejecuten una serie de operaciones secuenciales en él, y luego escupen otro bloque de datos, enjuague, repita. No tienen tanta memoria direccionable como el "CPE" principal, pero la idea es dedicar cada "SPE" a una tarea secuencial específica. La salida de una unidad puede alimentar la entrada de otra unidad.

Las unidades de ejecución no funcionan bien si están tratando de "analizar" los datos y tomar una serie de decisiones basadas en lo que esos datos son.

Estos "bloques de datos" pueden ser parte de una secuencia, como una lista de vértices de la tabla de estado de un juego, datos MPEG de un disco, etc.

Si algo no se ajusta a este modelo de "transmisión", entonces tiene una tarea que no se puede paralelizar eficientemente y la GPU no es necesariamente la mejor solución para ello. Un buen ejemplo es procesar elementos basados ​​en "eventos externos" como el teclado, el joystick o la entrada de red. No hay muchas cosas que no se ajusten a ese modelo, pero siempre habrá algunas.


11



Buen punto acerca de la optimización de la predicción de la sucursal: nunca lo hubiera considerado, pero tienes razón. - Jimmy Breck-McKye


Esto es nada sobre la velocidad del reloj o el propósito. Ambos son igualmente capaces de completar la mayoría, si no todas las tareas; sin embargo, algunos son ligeramente más adecuados para algunas tareas que otras.

Ha habido una muy un viejo argumento sobre si es mejor tener muchos núcleos tontos o un pequeño grupo de núcleos muy inteligentes. Esto se remonta fácilmente a los años 80.

Dentro de una CPU hay muchos cálculos posibles que se pueden hacer. Los núcleos más inteligentes pueden realizar muchos cálculos diferentes al mismo tiempo (algo así como multinúcleo pero no, es complicado; ver Paralelismo a nivel de instrucción) Un núcleo inteligente podría hacer varios cálculos al mismo tiempo (sumar, restar, multiplicar, dividir, operación de memoria) pero solo uno a la vez; debido a esto, son físicamente más grandes (y por lo tanto mucho más caros) que núcleos más burdos.

Un núcleo tonto es mucho más pequeño y, por lo tanto, se puede agregar más a un solo chip, pero no se pueden hacer tantos cálculos simultáneos. Hay un equilibrio fino entre muchos núcleos tontos y algunos núcleos inteligentes.

Las arquitecturas multinúcleo funcionan bien con gráficos porque los cálculos se pueden dividir fácilmente en cientos de núcleos, pero también depende de la calidad del código y de si otro código se basa en el resultado de un cálculo.

Esto es un mucho pregunta más complicada de lo que parece. Para obtener más información, lea este artículo sobre diseño de CPU:

Microprocesadores modernos: una guía de 90 minutos

http://www.lighterra.com/papers/modernmicroprocessors/


6



disculpe la mala gramática y, en general, el estilo de escritura deficiente que se usa en los párrafos anteriores, no he tomado mi café. es un concepto bastante complicado y el enlace incluido es donde debes ir si quieres entender más. no es mi mala explicación - Silverfire
Lo arreglé por ti y también agregué un enlace. - bwDraco