2011-07-10 13:31:41 +0000 2011-07-10 13:31:41 +0000
380
380

Perché usiamo ancora le CPU invece delle GPU?

Mi sembra che al giorno d'oggi si facciano molti calcoli sulla GPU. Ovviamente la grafica viene fatta lì, ma usando CUDA e simili, IA, algoritmi di hashing (pensate ai bitcoin) e altri ancora vengono fatti sulla GPU. Perché non possiamo semplicemente sbarazzarci della CPU e usare la GPU da sola? Cosa rende la GPU molto più veloce della CPU?

Risposte (15)

394
394
394
2011-07-10 14:00:49 +0000

TL;DR risposta: Le GPU hanno molti più core di processore rispetto alle CPU, ma poiché ogni core di GPU gira molto più lentamente di un core di CPU e non ha le caratteristiche necessarie per i sistemi operativi moderni, non sono adatte per eseguire la maggior parte dell'elaborazione nel computing quotidiano. Sono più adatti per operazioni ad alta intensità di calcolo come l'elaborazione video e le simulazioni fisiche.


GPGPU è ancora un concetto relativamente nuovo. Le GPU sono state inizialmente usate solo per il rendering della grafica; con l'avanzare della tecnologia, il gran numero di core nelle GPU rispetto alle CPU è stato sfruttato sviluppando capacità di calcolo per le GPU in modo che possano elaborare molti flussi paralleli di dati simultaneamente, indipendentemente da quali siano i dati. Mentre le GPU possono avere centinaia o addirittura migliaia di stream processor, ognuna di esse è più lenta di un core di CPU e ha meno funzionalità (anche se sono Turing complete e possono essere programmate per eseguire qualsiasi programma che una CPU può eseguire). Le caratteristiche che mancano alle GPU includono gli interrupt e la memoria virtuale, che sono necessari per implementare un sistema operativo moderno.

In altre parole, le CPU e le GPU hanno architetture significativamente diverse che le rendono più adatte ai diversi compiti. Una GPU può gestire grandi quantità di dati in molti flussi, eseguendo su di essi operazioni relativamente semplici, ma non è adatta a un'elaborazione pesante o complessa su uno o pochi flussi di dati. Una CPU è molto più veloce su base per-core (in termini di istruzioni al secondo) e può eseguire più facilmente operazioni complesse su uno o pochi flussi di dati, ma non è in grado di gestire in modo efficiente molti flussi contemporaneamente.

Di conseguenza, le GPU non sono adatte a gestire compiti che non beneficiano in modo significativo o non possono essere messi in parallelo, comprese molte comuni applicazioni consumer come i word processor. Inoltre, le GPU utilizzano un'architettura fondamentalmente diversa; per il loro funzionamento sarebbe necessario programmare un'applicazione specifica per una GPU, e per programmare le GPU sono necessarie tecniche significativamente diverse. Queste tecniche diverse includono nuovi linguaggi di programmazione, modifiche ai linguaggi esistenti e nuovi paradigmi di programmazione che sono più adatti a esprimere un calcolo come operazione parallela che deve essere eseguita da molti stream processor. Per ulteriori informazioni sulle tecniche necessarie per programmare le GPU, vedere gli articoli di Wikipedia su stream processing e parallel computing .

Le moderne GPU sono in grado di eseguire operazioni vettoriali e aritmetiche in virgola mobile, con le ultime schede in grado di manipolare numeri in virgola mobile a doppia precisione. I framework come CUDA e OpenCL permettono di scrivere programmi per le GPU, e la natura delle GPU le rende più adatte ad operazioni altamente parallelizzabili, come nel computing scientifico, dove una serie di schede di calcolo GPU specializzate può essere un valido sostituto per un piccolo cluster di calcolo come nei NVIDIA Tesla Personal Supercomputer . I consumatori con GPU moderne che hanno esperienza con Folding@home possono utilizzarle per contribuire con GPU clients , che possono eseguire simulazioni di piegatura delle proteine ad altissima velocità e contribuire al progetto con più lavoro (assicurarsi di leggere prima le FAQs , specialmente quelle relative alle GPU). Le GPU possono anche consentire una migliore simulazione fisica nei videogiochi utilizzando PhysX, accelerare la codifica e la decodifica video ed eseguire altri compiti ad alta intensità di calcolo. Sono questi i tipi di compiti che le GPU sono più adatte a svolgere.

AMD è all'avanguardia nella progettazione di un processore chiamato Accelerated Processing Unit (APU) che combina i core convenzionali x86 della CPU con le GPU. Questo approccio consente prestazioni grafiche di gran lunga superiori alle soluzioni grafiche integrate nella scheda madre (anche se non può competere con le più costose GPU discrete), e permette un sistema compatto, a basso costo, con buone prestazioni multimediali senza la necessità di una GPU separata. I più recenti processori Intel offrono anche una grafica integrata su chip, anche se le prestazioni competitive delle GPU integrate sono attualmente limitate ai pochi chip con Intel Iris Pro Graphics. Man mano che la tecnologia continua a progredire, vedremo un crescente grado di convergenza di queste parti un tempo separate. AMD prevede un futuro in cui CPU e GPU siano un tutt'uno, in grado di lavorare insieme senza soluzione di continuità sullo stesso compito .

Ciononostante, molti compiti eseguiti dai sistemi operativi dei PC e dalle applicazioni sono ancora più adatti alle CPU, e molto lavoro è necessario per accelerare un programma che utilizza una GPU. Poiché molti software esistenti utilizzano l'architettura x86 e poiché le GPU richiedono tecniche di programmazione diverse e mancano diverse importanti caratteristiche necessarie per i sistemi operativi, una transizione generale da CPU a GPU per il computing quotidiano è molto difficile.

257
257
257
2011-07-10 20:22:09 +0000

Cosa rende la GPU molto più veloce della CPU?

La GPU è non più veloce della CPU. CPU e GPU sono progettate con due obiettivi diversi, con diversi compromessi, quindi hanno caratteristiche di performance diverse. Alcune attività sono più veloci in una CPU, mentre altre sono più veloci calcolate in una GPU. La CPU eccelle nel fare manipolazioni complesse su un piccolo set di dati, la GPU eccelle nel fare semplici manipolazioni su un grande set di dati.

La GPU è una CPU speciale, progettata in modo che una singola istruzione funzioni su un grande blocco di dati (SIMD/Single Instruction Multiple Data), applicando tutte la stessa operazione. Lavorare in blocchi di dati è certamente più efficiente che lavorare con una singola cella alla volta perché c'è un overhead molto ridotto nella decodifica delle istruzioni, tuttavia lavorare in blocchi grandi significa che ci sono più unità di lavoro in parallelo, quindi utilizza molti più transistor per implementare una singola istruzione della GPU (causando un vincolo fisico di dimensioni, usando più energia e producendo più calore).

La CPU è progettata per eseguire una singola istruzione su un singolo dato il più rapidamente possibile. Poiché deve lavorare solo con un singolo datum, il numero di transistor necessari per implementare una singola istruzione è molto inferiore, per cui una CPU può permettersi di avere un set di istruzioni più grande, un ALU più complesso, una migliore previsione delle diramazioni, una migliore architettura virtualizzata e schemi di caching/pipeline più sofisticati. Anche i suoi cicli di istruzioni sono più veloci.

La ragione per cui stiamo ancora usando la CPU è non perché x86 è il re dell'architettura della CPU e Windows è scritto per x86, la ragione per cui stiamo ancora usando la CPU è perché il tipo di compiti che un sistema operativo deve fare, cioè prendere decisioni, è eseguito in modo più efficiente su un'architettura della CPU. Un sistema operativo deve guardare a 100s di diversi tipi di dati e prendere varie decisioni che dipendono tutte l'una dall'altra; questo tipo di lavoro non si parallelizza facilmente, almeno non in un'architettura SIMD.

In futuro, ciò che vedremo è una convergenza tra l'architettura CPU e GPU, poiché la CPU acquisisce la capacità di lavorare su blocchi di dati, ad esempio SSE. Inoltre, man mano che la tecnologia di produzione migliora e i chip si riducono, la GPU può permettersi di implementare istruzioni più complesse.

77
77
77
2011-07-10 21:17:30 +0000

Mancano le GPU:

  1. 1. Memoria virtuale (!!!!)
  2. 2. Mezzi di indirizzamento di dispositivi diversi dalla memoria (ad es. tastiere, stampanti, memoria secondaria, ecc.)
  3. Mezzi di indirizzamento di dispositivi diversi dalla memoria (ad es. tastiere, stampanti, memoria secondaria, ecc.)
  4. Mezzi di indirizzamento di dispositivi diversi dalla memoria (ad es. tastiere, stampanti, memoria secondaria, ecc.)
  5. Mezzi di indirizzamento di dispositivi diversi dalla memoria (ad es. 3. Interruzioni

Ne avete bisogno per poter implementare qualsiasi cosa come un sistema operativo moderno.

Sono anche (relativamente) lenti a doppia precisione aritmetica (se confrontate con le loro prestazioni aritmetiche a singola precisione)*, e sono molto più grandi (in termini di dimensioni del silicio). Le architetture GPU più vecchie non supportano le chiamate indirette (attraverso i puntatori di funzione) necessarie per la maggior parte della programmazione generale, e le architetture più recenti che lo fanno lentamente. Infine, (come hanno notato altre risposte), per i compiti che non possono essere messi in parallelo, le GPU perdono rispetto alle CPU a parità di carico di lavoro.

EDIT : Si prega di notare che questa risposta è stata scritta nel 2011 – La tecnologia delle GPU è un settore in costante evoluzione. Le cose potrebbero essere molto diverse a seconda di quando si legge questo :P

* Alcune GPU non sono lente a doppia precisione aritmetica, come le linee Quadro o Tesla di NVidia (generazione Fermi o più recente), o la linea FirePro di AMD (generazione GCN o più recente). Ma queste non sono presenti nella maggior parte delle macchine dei consumatori.

39
39
39
2011-07-11 15:39:21 +0000

Una CPU è come un lavoratore che va super veloce. Una GPU è come un gruppo di clonatori che vanno veloci, ma che devono tutti fare esattamente la stessa cosa all'unisono (con l'eccezione che si possono avere alcuni cloni seduti inattivi se si vuole)

Quale preferiresti avere come collega sviluppatore, un tipo super veloce, o 100 cloni veloci che in realtà non sono così veloci, ma tutti devono eseguire le stesse azioni contemporaneamente?

Per alcune azioni, i cloni sono piuttosto bravi, ad esempio spazzare il pavimento - ognuno può spazzare una parte di esso.

Per alcune azioni, i cloni fanno schifo, ad esempio scrivere il rapporto settimanale - tutti i cloni tranne uno stanno inattivi mentre un clone scrive il rapporto (altrimenti si ottengono solo 100 copie dello stesso rapporto).

24
24
24
2011-07-10 17:51:46 +0000

Perché le GPU sono progettate per fare molte piccole cose contemporaneamente, e le CPU sono progettate per fare una cosa alla volta. Se il vostro processo può essere fatto in parallelo in modo massiccio, come l'hash, la GPU è di ordini di grandezza più veloce, altrimenti non lo sarà.

La vostra CPU può calcolare un hash molto, molto più velocemente di quanto possa fare la vostra GPU - ma il tempo che la vostra CPU impiega per farlo, la vostra GPU potrebbe essere parte integrante di diverse centinaia di hash. Le GPU sono progettate per fare molte cose allo stesso tempo, e le CPU sono progettate per fare una cosa alla volta, ma molto velocemente.

Il problema è che le CPU e le GPU sono soluzioni molto diverse a problemi molto diversi, c'è una piccola sovrapposizione ma generalmente ciò che è nel loro dominio rimane nel loro dominio. Non possiamo sostituire la CPU con una GPU perché la CPU è seduta lì a fare il suo lavoro molto meglio di quanto potrebbe mai fare una GPU, semplicemente perché una GPU non è progettata per fare il lavoro, e una CPU lo è.

Una piccola nota a margine, però, se fosse possibile eliminare la CPU e avere solo una GPU, non pensi che la rinomineremmo? :)

15
15
15
2011-07-10 17:57:36 +0000

Vi state davvero chiedendo *perché non usiamo le GPU come architetture nella CPU? *

La GPU è solo una CPU specializzata di una scheda grafica. Noi prestiamo il calcolo non grafico delle GPU perché le CPU per uso generale non sono all'altezza dell'esecuzione in parallelo e in virgola mobile.

In realtà stiamo usando architetture di CPU diverse (più simili alle GPU). Ad esempio, i processori Niagara sono piuttosto multitasking. SPARC T3 eseguiranno 512 filettature simultanee.

12
12
12
2011-07-10 15:55:56 +0000

Potrei sbagliarmi di grosso e parlo con poca o nessuna autorità sull'argomento, ma ecco qui:

  • Credo che ogni unità di esecuzione GPU (“core”) abbia uno spazio di indirizzamento molto limitato rispetto a una CPU.

  • Le unità di esecuzione GPU non sono in grado di gestire in modo efficiente le ramificazioni.

  • Le unità di esecuzione su GPU non supportano gli interrupt hardware allo stesso modo delle CPU.

Ho sempre pensato che il modo in cui le unità di esecuzione su GPU sono state concepite è qualcosa di simile alle “SPE” della Playstation 3, vogliono ricevere un blocco di dati, eseguire una serie di operazioni sequenziali su di esso, e poi sputare un altro blocco di dati, risciacquare, ripetere. Non hanno tanta memoria indirizzabile quanto il “CPE” principale, ma l'idea è di dedicare ogni “SPE” ad un compito specifico e sequenziale. L'uscita di un'unità potrebbe alimentare l'ingresso di un'altra unità.

Le unità di esecuzione non funzionano bene se cercano di “analizzare” i dati e prendere una serie di decisioni in base a quali sono i dati.

Questi “blocchi di dati” possono essere parte di un flusso, come una lista di vertici da una tabella di stato di un gioco, dati MPEG da un disco, ecc.

Se qualcosa non si adatta a questo modello di “streaming”, allora si ha un compito che non può essere paralizzato in modo efficiente e la GPU non è necessariamente la soluzione migliore per questo. Un buon esempio è l'elaborazione di cose basate su “eventi esterni” come la tastiera, il joystick o l'input di rete. Non ci sono molte cose che non si adattano a quel modello, ma ce ne saranno sempre alcune.

7
7
7
2011-07-12 04:36:14 +0000

Questo è nulla sulla velocità dell'orologio o sullo scopo. Sono entrambi ugualmente in grado di completare la maggior parte, se non tutti i compiti; tuttavia alcuni sono leggermente più adatti per alcuni compiti rispetto ad altri.

C'è stata una molto vecchia discussione sul fatto se sia meglio avere un sacco di nuclei stupidi o un piccolo gruppo di nuclei molto intelligenti. Questo risale facilmente agli anni ‘80.

All'interno di una CPU ci sono molti possibili calcoli che possono essere fatti. I core più intelligenti sono in grado di eseguire molti calcoli diversi allo stesso tempo (un po’ come il multi-core ma non, è complicato; vedi Parallelismo a livello di istruzioni ). Un nucleo intelligente può eseguire più calcoli contemporaneamente (aggiungere, sottrarre, moltiplicare, dividere, operare in memoria) ma solo uno alla volta; per questo motivo, sono fisicamente più grandi (e quindi molto più costosi) rispetto ai nuclei più stupidi.

Un nucleo stupido è molto più piccolo e quindi ne possono essere aggiunti altri ad un singolo chip ma non sono in grado di eseguire altrettanti calcoli simultanei. C'è un buon equilibrio tra molti dumb cores e alcuni smart cores.

Le architetture multi-core funzionano bene con la grafica perché i calcoli possono essere facilmente suddivisi su centinaia di cores, ma dipende anche dalla qualità del codice e dal fatto che altri codici si basino sul risultato di un calcolo.

Questa è una domanda molto più complicata di quanto possa sembrare. Per maggiori informazioni, leggere questo articolo sulla progettazione delle CPU:

Moderni microprocessori - Una guida di 90 minuti

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

6
6
6
2011-07-15 11:44:05 +0000

Vorrei affrontare un punto sintattico: I termini CPU e GPU sono nomi funzionali e non nomi architettonici.

Se un computer dovesse usare una GPU come processore principale, diventerebbe una “unità di elaborazione centrale” (CPU) indipendentemente dall'architettura e dal design.

5
5
5
2011-07-10 14:57:18 +0000

È importante tenere presente che non c'è una linea di demarcazione magica nello spazio dell'architettura che fa di un processore il “centrale” e dell'altro il “grafico”. (Beh, alcune GPU possono essere troppo paralizzate per essere del tutto generiche, ma non sono quelle di cui stiamo parlando qui)

La distinzione è una di come sono installate sulla scheda e quali compiti vengono loro affidati. Naturalmente, noi usiamo un processore generico (o un insieme di processori generici) per il data mover principale, e un'unità speciale, parallelizzata, profondamente pipe-lined per le cose (come la grafica) per poterne sfruttare al meglio i vantaggi.

La maggior parte degli spiffy tricks che sono stati usati per far fare alle GPU le loro cose molto velocemente sono stati sviluppati per la prima volta da persone che cercavano di rendere le CPU più veloci e migliori. A quanto pare Word, Excel e Netscape e molte altre cose per cui le persone usano i loro computer non solo non sfruttano appieno le funzionalità offerte dai chip specializzati nella grafica, ma eseguono anche slower su quelle architetture perché le diramazioni causano (molto costose e lente) cancellazioni di pipe-line.

3
3
3
2015-06-07 11:53:13 +0000

La ragione per cui stiamo ancora usando le CPU è che sia le CPU che le GPU hanno i loro vantaggi unici. Si veda il mio seguente documento, accettato in ACM Computing Surveys 2015, che fornisce una discussione conclusiva e completa sul passaggio dal ‘dibattito CPU vs GPU’ al ‘CPU-GPU collaborative computing’. A Survey of CPU-GPU Heterogeneous Computing Techniques

3
3
3
2011-07-17 16:44:16 +0000

Per un semplice motivo: la maggior parte delle applicazioni non sono multifilettate/vettoriali.

Le schede grafiche si basano molto sul multifilettatura, almeno nel concetto.

Confronta un'auto con un solo motore, un'auto con un motore più piccolo per ruota. Con quest'ultima auto, è necessario comandare tutti i motori, cosa che non è stata presa in considerazione dal punto di vista della programmazione del sistema.

Con AMD fusion, però, cambierà il modo in cui dovremo utilizzare la potenza di elaborazione: o vettorizzata, o veloce per un thread.

3
3
3
2011-07-10 21:35:07 +0000

Lo scopo dell'esistenza di una GPU era proprio quello di alleggerire la CPU dai costosi calcoli grafici che stava facendo all'epoca. Combinandoli di nuovo a un singolo processore si sarebbe tornati al punto di partenza.

2
2
2
2016-07-01 11:46:23 +0000

I gpus sono buoni processori di flusso. si può pensare all'elaborazione di flusso come a una moltiplicazione sequenziale di una lunga serie di numeri. i cpus hanno anche capacità di elaborazione di flusso (si chiamano estensioni SIMD) ma non si può implementare tutta la logica di programmazione come elaborazione di flusso, e i compilatori hanno l'opzione di creare btyecode che fa uso di istruzioni simd ogni volta che è possibile.

non tutto è una serie di numeri. le immagini e i video lo sono, forse anche il suono (ci sono codificatori opencl qua e là). quindi gpus può elaborare, codificare e decodificare immagini, video e qualsiasi cosa simile. un inconveniente è che non si può scaricare tutto su gpus nei giochi perché creerebbe balbuzie, i gpus sono occupati con la grafica e si suppone che siano il collo di bottiglia nel sistema quando si gioca. la soluzione ottimale sarebbe utilizzare completamente tutti i componenti in un pc. così, per esempio, il motore physx di nvidia, per default, fa i calcoli sulla cpu quando la gpu è completamente utilizzata.

2
2
2
2015-11-16 15:42:30 +0000

Se per dirla in parole povere la GPU può essere paragonata al rimorchio dell'auto. Come di solito tronco è sufficiente per la maggior parte delle persone, tranne che per i casi se comprano qualcosa di veramente grande. Poi possono avere bisogno di rimorchio. Lo stesso con la GPU, come di solito è sufficiente avere una normale CPU che esegue la maggior parte dei compiti. Ma se si ha bisogno di calcoli intensivi in molti thread, allora si può avere bisogno di GPU