Me parece que en estos días se hacen muchos cálculos en la GPU. Obviamente, los gráficos se realizan allí, pero usando CUDA y similares, AI, algoritmos de hash (piense en bitcoins) y otros también se realizan en la GPU. ¿Por qué no podemos deshacernos de la CPU y usar la GPU por nuestra cuenta? ¿Qué hace que la GPU sea mucho más rápida que la CPU?
373
Respuestas:
TL; Respuesta DR: las GPU tienen muchos más núcleos de procesador que las CPU, pero debido a que cada núcleo de 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 parte del procesamiento en el día a día informática. Son los más adecuados para operaciones de cómputo intensivo, como el procesamiento de video y las simulaciones físicas.
GPGPU sigue siendo un concepto relativamente nuevo. Las GPU se utilizaron inicialmente solo para representar gráficos; A medida que la tecnología avanzó, la gran cantidad de núcleos en las GPU en relación con las CPU se explotó mediante el desarrollo de capacidades computacionales para las GPU para que puedan procesar muchos flujos paralelos de datos simultáneamente, sin importar cuáles sean esos datos. Si bien 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 tienen menos características (incluso si están completas y se pueden programar 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 las GPU tienen arquitecturas significativamente diferentes que las hacen más adecuadas para diferentes tareas. Una GPU puede manejar grandes cantidades de datos en muchos flujos, realizando operaciones relativamente simples en ellos, pero no es adecuada para el procesamiento pesado o complejo en uno o pocos flujos 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 sola o pocas secuencias de datos más fácilmente, pero no puede manejar eficientemente muchas secuencias simultáneamente.
Como resultado, las GPU no son adecuadas para manejar tareas que no se benefician significativamente o que no pueden ser paralelizadas, incluidas muchas aplicaciones de consumo comunes, como los procesadores de texto. Además, las GPU utilizan 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 una computación 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 las GPU, consulte los artículos de Wikipedia sobre procesamiento continuo y computación paralela .
Las GPU modernas son capaces de realizar operaciones vectoriales y aritmética de punto flotante, con las últimas tarjetas capaces de manipular números de punto flotante de doble precisión. Los marcos como CUDA y OpenCL permiten escribir programas para GPU, y la naturaleza de las GPU los hace más adecuados para operaciones altamente paralelizables, como en la informática científica, donde una serie de tarjetas de cómputo GPU especializadas pueden ser un reemplazo viable para un pequeño computar clúster como en NVIDIA Tesla Personal Supercomputers . Los consumidores con GPU modernas con experiencia en Folding @ home pueden usarlas para contribuir con los clientes de GPU , que pueden realizar simulaciones de plegamiento de proteínas a velocidades muy altas y aportar más trabajo al proyecto (asegúrese de leer las preguntas frecuentesprimero, especialmente los relacionados con las GPU). Las GPU también pueden permitir una mejor simulación física en los videojuegos usando PhysX, acelerar la codificación y decodificación de video, y realizar otras tareas de computación intensiva. Es este tipo de tareas que las GPU son las más adecuadas para realizar.
AMD es pionero en un diseño de 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 es compatible con GPU discretas más costosas), y permite un sistema compacto y de bajo costo con un buen rendimiento multimedia sin la necesidad de una GPU separada. Los últimos procesadores Intel también ofrecen gráficos integrados en chip, aunque el rendimiento competitivo de la GPU integrada se limita actualmente 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 que una vez estuvieron separadas. AMD imaginaUn futuro en el que la CPU y la GPU son uno, capaces de trabajar juntos sin problemas en la misma tarea .
No obstante, muchas de las tareas realizadas por los sistemas operativos y aplicaciones de PC aún se adaptan mejor a las CPU, y se necesita mucho trabajo para acelerar un programa usando una GPU. Dado que gran parte del software existente utiliza la arquitectura x86, y debido a que las GPU requieren diferentes técnicas de programación y faltan varias características importantes necesarias para los sistemas operativos, una transición general de la CPU a la GPU para la informática diaria es muy difícil.
fuente
La GPU no es más rápida que la CPU. La CPU y la GPU están diseñadas con dos objetivos diferentes, con diferentes compensaciones, por lo que tienen características de rendimiento diferentes . Ciertas tareas son más rápidas en una CPU, mientras que otras tareas se calculan más rápido en una GPU. La CPU se destaca por 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 ellos aplicando la misma operación. Trabajar en bloques de datos es ciertamente más eficiente que trabajar con una sola celda a la vez porque hay una sobrecarga muy reducida en la decodificación de las instrucciones, sin embargo, trabajar en bloques grandes significa que hay más unidades de trabajo en paralelo, por lo que utiliza muchos más transistores. implementar una sola instrucción de GPU (lo que causa una restricción de tamaño físico, usa más energía y produce más calor).
La CPU está diseñada para ejecutar una sola instrucción en un solo dato lo más rápido posible. Dado que 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 permitirse tener un conjunto de instrucciones más grande, una ALU más compleja, una mejor predicción de rama, mejor virtualizada arquitectura y esquemas de almacenamiento en caché / canalización más sofisticados Sus ciclos de instrucción también son más rápidos.
La razón por la que todavía estamos usando la CPU no es porque x86 es el rey de la arquitectura de la CPU y Windows está escrito para x86, la razón por la que todavía estamos usando la CPU es porque el tipo de tareas que un sistema operativo debe hacer, es decir, tomar decisiones, se ejecuta de manera más eficiente en una arquitectura de CPU. Un sistema operativo necesita observar cientos de diferentes tipos de datos y tomar varias decisiones que dependen unas de otras; 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 arquitectura de la CPU y la GPU a medida que la CPU adquiere la capacidad de trabajar sobre bloques de datos, por ejemplo, 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.
fuente
Las GPU carecen de:
Los necesita para poder implementar algo como un sistema operativo moderno.
También son (relativamente) lentos en aritmética de doble precisión (en comparación con su rendimiento aritmético de precisión simple) *, y son mucho más grandes (en términos de tamaño de silicio). Las arquitecturas de GPU más antiguas no admiten llamadas indirectas (a través de punteros de función) necesarias para la mayoría de la programación de propósito general, y las arquitecturas más recientes que lo hacen lentamente. Finalmente, (como han señalado otras respuestas), para tareas que no pueden ser paralelas, las GPU pierden en comparación con las CPU que reciben la misma carga de trabajo.
EDITAR : Tenga en cuenta que esta respuesta se escribió en 2011: la tecnología de GPU es un área que cambia constantemente. Las cosas pueden ser muy diferentes dependiendo de cuándo estés leyendo esto: P
* Algunas GPU no son lentas con la aritmética de doble precisión, como las líneas Quadro o Tesla de NVidia (generación de Fermi o más reciente), o la línea FirePro de AMD (generación de GCN o más nueva). Pero estos no están en la mayoría de las máquinas de los consumidores.
fuente
Una CPU es como un trabajador que va súper rápido. Una GPU es como un grupo de trabajadores de clones que van rápido, pero que todos tienen que hacer exactamente lo mismo al unísono (con la excepción de que puede hacer que algunos clones permanezcan inactivos si lo desea)
¿Qué preferirías tener como compañero desarrollador, un tipo súper rápido o 100 clones rápidos que en realidad no son tan rápidos, pero todos tienen que realizar las mismas acciones simultáneamente?
Para algunas acciones, los clones son bastante buenos, por ejemplo, barrer el piso; cada uno puede barrer una parte de él.
Para algunas acciones, los clones apestan, por ejemplo, escribir el informe semanal: todos los clones menos uno permanecen inactivos mientras un clon escribe el informe (de lo contrario, solo obtendrá 100 copias del mismo informe).
fuente
Debido a que 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 a la vez. Si su proceso se puede hacer masivamente paralelo, como el hash, la GPU es mucho 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 toma a su CPU hacerlo, su GPU podría estar en medio de varios cientos de hash. 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 las GPU son soluciones muy diferentes a 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á sentada allí haciendo su trabajo mucho mejor de lo que una GPU podría hacerlo, simplemente porque una GPU no está diseñada para hacer el trabajo, y una CPU sí.
Sin embargo, una pequeña nota al margen, si fuera posible eliminar la CPU y solo tener una GPU, ¿no cree que deberíamos cambiarle el nombre? :)
fuente
¿Realmente se pregunta por qué no estamos usando GPU como arquitecturas en la CPU?
GPU es solo una CPU especializada de una tarjeta gráfica. Prestamos computación GPU no gráfica porque la CPU de propósito general no está a la par en la ejecución de punto flotante y paralelo.
De hecho, estamos utilizando diferentes arquitecturas de CPU (más GPU-ish). Por ejemplo, los procesadores Niagara son bastante multitarea. SPARC T3 ejecutará 512 hilos concurrentes.
fuente
Podría estar terriblemente equivocado aquí, y estoy hablando de poca o ninguna autoridad en el tema, pero aquí va:
Creo que cada unidad de ejecución de GPU ("núcleo") tiene un espacio de direcciones muy limitado en comparación con una CPU.
Las unidades de ejecución de GPU no pueden lidiar con la ramificació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 las unidades de ejecución de GPU deben ser como los "SPEs" de Playstation 3, quieren recibir un bloque de datos, ejecutar una serie de operaciones secuenciales y luego escupir 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 intentan "analizar" los datos y tomar un montón de decisiones en función de cuáles son esos datos.
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 de manera eficiente y la GPU no es necesariamente la mejor solución para ello. Un buen ejemplo es el procesamiento de cosas basadas 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.
fuente
Esto no es nada acerca de la velocidad o el propósito del reloj. Ambos son igualmente capaces de completar la mayoría, si no todas las tareas; sin embargo, algunos son más adecuados para algunas tareas que otras.
Ha habido una discusión muy antigua 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 los núcleos más tontos.
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 puede hacer tantos cálculos simultáneos. Hay un buen equilibrio 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 depende del resultado de un cálculo.
Esta es una pregunta mucho más complicada de lo que parece. Para obtener más información, lea este artículo sobre diseño de CPU:
fuente
Me gustaría abordar un punto sintáctico: los términos CPU y GPU son nombres funcionales, no nombres arquitectónicos.
Si una computadora usara una GPU como su procesador principal, se convertiría en una "unidad central de procesamiento" (CPU) independientemente de la arquitectura y el diseño.
fuente
Es importante tener en cuenta que no hay una línea divisoria mágica en el espacio de la arquitectura que haga que un procesador sea el "central" y otro el "gráfico". (Bueno, algunas GPU pueden estar demasiado lisiadas para ser completamente generales, pero esas no son de las que estamos hablando aquí).
La distinción es una de cómo se instalan en el tablero y qué tareas se les asignan. Por supuesto, utilizamos procesadores de propósito general (o un conjunto de procesadores de propósito general) para el transportador de datos principal, y una unidad especial, paralelizada y profundamente canalizada para cosas (como gráficos) para aprovecharlos mejor.
La mayoría de los trucos geniales que se han utilizado para hacer que las GPU hagan su trabajo muy rápido fueron desarrollados primero por personas que intentaban hacer CPU más rápidos y mejores. Resulta que Word y Excel y Netscape y muchas otras cosas para las que las personas usan sus computadoras no solo aprovechan al máximo las características que ofrecen los chips especializados en gráficos, sino que incluso se ejecutan más lentamente en esas arquitecturas porque se ramifican mucho (muy caro y lento) despeja la tubería.
fuente
El punto principal de la existencia de una GPU era liberar a la CPU de los costosos cálculos gráficos que estaba haciendo en ese momento.
Al combinarlos con un solo procesador nuevamente estaríamos volviendo a donde todo comenzó.
fuente
Por una simple razón: la mayoría de las aplicaciones no son multiproceso / vectorizado.
Las tarjetas gráficas dependen en gran medida de múltiples subprocesos, al menos en el concepto.
Compare un automóvil con un solo motor, un automóvil con un motor más pequeño por rueda. Con el último automóvil, debe controlar todos los motores, algo que no se ha tenido en cuenta desde el punto de vista de la programación del sistema.
Sin embargo, con la fusión AMD, cambiará la forma en que tendremos que utilizar el poder de procesamiento: vectorizado, o rápido para un hilo.
fuente
La razón por la que todavía usamos CPU es que tanto las CPU como las GPU tienen sus ventajas únicas. Consulte mi siguiente artículo, aceptado en ACM Computing Surveys 2015, que proporciona una discusión concluyente e integral sobre cómo alejarse del 'debate CPU vs GPU' por 'computación colaborativa CPU-GPU'.
Una encuesta de las técnicas de computación heterogéneas CPU-GPU
fuente
En pocas palabras, la GPU se puede comparar con el remolque en el automóvil. Como generalmente, el baúl es suficiente para la mayoría de las personas, excepto para los casos si compran algo realmente grande. Entonces pueden necesitar un remolque. Lo mismo con la GPU, ya que generalmente es suficiente tener una CPU normal que realice la mayoría de las tareas. Pero si necesita algunos cálculos intensivos en muchos hilos, entonces puede necesitar GPU
fuente
Los GPU son buenos procesadores de flujo. Puedes pensar en el procesamiento de flujo como multiplicar una larga serie de números secuencialmente. Los cpus también tienen capacidades de procesamiento de flujo (se llaman extensiones SIMD), pero no puede implementar toda la lógica de programación como procesamiento de flujo, y los compiladores tienen la opción de crear btyecode que evita el uso de instrucciones SIMD siempre que sea posible.
No todo es un conjunto de números. las imágenes y los videos son, tal vez también sonido (hay codificadores opencl aquí y allá). para que gpus pueda procesar, codificar y decodificar imágenes, videos y cualquier cosa similar. Un inconveniente es que no puedes descargar todo a gpus en los juegos porque crearía tartamudeo, los gpus están ocupados con los gráficos y se supone que son el cuello de botella en el sistema cuando juegas. La solución óptima sería utilizar todos los componentes de una PC. así, por ejemplo, el motor physx de nvidia, por defecto, hace cálculos en la CPU cuando la GPU se utiliza por completo.
fuente