Perché ancora usiamo CPU anziché GPU?

Mi sembra che in questi giorni sono stati eseguiti molti calcoli sulla GPU. Ovviamente la grafica è fatta lì, ma utilizzando CUDA e simili, AI, algoritmi di hashing (think bitcoins) e altri sono anche fatti sulla GPU. Perché non possiamo liberarci dalla CPU e utilizzare la GPU per conto proprio? Cosa rende la GPU molto più veloce della CPU?

TL: la risposta a DR: le GPU hanno nuclei di processre molto più di CPU, ma perché each core GPU funziona molto più lentamente di un core CPU e non dispone delle funzionalità necessarie per i sisthemes operativi moderni, non è appropriato per eseguire la maggior parte delle elaborazioni in tutti i giorni computing. Essi sono più adatti per operazioni di calcolo intenso come elaborazione video e simulazioni di fisica.


GPGPU è ancora un concetto relativamente nuovo. Le GPU sono state inizialmente utilizzate per rendere solo grafica; come la tecnologia avanzata, il gran numero di nuclei nelle GPU rispetto alle CPU è stato sfruttato sviluppando funzionalità di calcolo per le GPU in modo da poter elaborare contemporaneamente molti flussi di dati paralleli, indipendentemente da ciò che i dati possono essere. Mentre le GPU possono avere centinaia o addirittura migliaia di processri di stream, ciascuno di essi funziona più lentamente di un core CPU e ha less funzionalità (anche se sono complete di Turing e possono essere programmate per eseguire qualsiasi programma in cui una CPU può essere eseguita). Le funzionalità mancanti dalle GPU includono interrupt e memory virtuale, necessari per implementare un sistema operativo moderno.

In altre parole, le CPU e le GPU hanno architetture significativamente diverse che li rendono più adatti a compiti diversi. Una GPU può gestire grandi quantità di dati in molti flussi, eseguendo operazioni relativamente semplici su di esse, ma non è adatta a un'operazione pesante o complessa su singoli o pochi stream di dati. Una CPU è molto più veloce su base per-core (in termini di istruzioni al secondo) e può eseguire operazioni complesse su singoli o pochi stream di dati più facilmente, 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 paralleli, tra cui molte applicazioni comuni di consumo quali elaboratori di testi. Inoltre, le GPU utilizzano un'architettura fondamentalmente diversa; bisogna programmare un'applicazione specifica per una GPU affinché funzioni, e sono necessarie tecniche molto diverse per programmare GPU. Queste diverse tecniche includono nuovi linguaggi di programmazione, modifiche alle lingue esistenti e nuovi paradigmi di programmazione più adatti per esprimere un calcolo come un'operazione parallela da eseguire da molti processri di stream. Per ulteriori informazioni sulle tecniche necessarie per programmare GPU, vedere gli articoli di Wikipedia sull'elaborazione di flussi e il calcolo parallelo .

Le GPU moderne sono in grado di eseguire operazioni vettoriali e aritmetiche a virgola mobile, con le ultime tabs in grado di manipolare numbers a virgola mobile a double precisione. I frameworks quali i programmi di abilitazione CUDA e OpenCL devono essere scritti per le GPU e la natura delle GPU li rendono più adatti a operazioni altamente parallelizzabili, come nel calcolo scientifico, where una serie di tabs di calcolo GPU specializzate può essere una sostituzione valida per un piccolo calcolare il cluster come in NVIDIA Tesla Personal Supercomputers . I consumatori con moderne GPU esperti con Folding @ home possono utilizzarli per contribuire con i client GPU , che possono eseguire simulazioni di piegatura di proteine ​​a velocità molto elevate e contribuire a lavorare maggiormente al progetto (leggere prima le FAQ , in particolare quelle relative a GPU). Le GPU possono anche consentire una migliore simulazione di fisica nei videogiochi utilizzando PhysX, accelerare la codifica video e la decodifica e eseguire altre attività computazionali. Sono questi tipi di attività che le GPU sono più adatte per eseguire.

AMD sta pionierando un design del processre chiamato l' Accelerated Processing Unit (APU) che combina i core convenzionali di CPU x86 con le GPU. Questo approccio rende le performance grafiche superiori alle soluzioni grafiche integrate per tabs madri (anche se non corrispondono a GPU discreti più costose) e consente un sistema compatto e a basso costo con buone performance multimediali senza la necessità di una GPU separata. Gli ultimi processri Intel offrono anche grafica integrata su chip, anche se le performance GPU integrate sono attualmente limitate ai pochi chip con Intel Iris Pro Graphics. Mentre la tecnologia continua ad avanzare, vedremo un crescente grado di convergenza di queste parti una volta separate. AMD prevede un futuro in cui la CPU e la GPU sono uno, capaci di lavorare insieme sullo stesso task .

Tuttavia, molte attività eseguite da sisthemes operativi e applicazioni PC sono ancora più adatti alle CPU e sono necessari molti lavori per accelerare un programma utilizzando una GPU. Poiché tanti software esistenti utilizzano l'architettura x86 e perché le GPU richiedono diverse tecniche di programmazione e mancano diverse funzionalità importnti necessarie per i sisthemes operativi, una transizione generalizzata dalla CPU alla GPU per il calcolo quotidiano è molto difficile.

Cosa rende la GPU molto più veloce della CPU?

La GPU non è più veloce della CPU. CPU e GPU sono progettati con due obiettivi diversi, con differenti compromessi, in modo da avere caratteristiche di performance diverse . Alcune attività sono più veloci in una CPU mentre altre attività sono più veloci calcolate in una GPU. La CPU eccelle di fare manipolazioni complesse a un piccolo insieme di dati, la GPU eccelle a fare semplici manipolazioni a un grande insieme di dati.

La GPU è una CPU specifica, progettata in modo che un'unica istruzione funziona su un grande block di dati (SIMD / Single Istruzione Multiple Data), tutti applicando la stessa operazione. Lavorare in blocchi di dati è sicuramente più efficiente di lavorare con una sola cella alla volta perché c'è una riduzione molto più ridotta nel decodificare le istruzioni, ma lavorando in grandi blocchi significa che ci sono più unità di lavoro parallele, quindi utilizza molto molto più transistor per implementare un'unica istruzione GPU (causando un vincolo di dimensione fisica, utilizzando più energia e produrre più calore).

La CPU è progettata per eseguire una singola istruzione su un singolo dato più rapidamente ansible. Poiché è necessario lavorare solo con un singolo dato, il numero di transistori richiesti per implementare una singola istruzione è molto less in modo che una CPU possa permettersi di avere un set di istruzioni più ampio, un ALU più complesso, una migliore previsione del branch, meglio virtualizzato architettura e un più sofisticato schemi di caching / pipeline. I loops di istruzione sono anche più veloci.

Il motivo per cui ancora stiamo usando la CPU non è perché x86 è il re dell'architettura della CPU e Windows è scritto per x86, il motivo per cui ancora stiamo usando la CPU è perché il tipo di attività che un sistema operativo deve fare, vale a dire prendere decisioni, è gestito in modo più efficiente su un'architettura CPU. Un sistema operativo deve esaminare 100 tipi di dati diversi e prendere decisioni diverse, che dipendono tutte tra loro; questo tipo di lavoro non è facile parallelizzare, alless non in un'architettura SIMD.

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

Mancanza di GPU:

  1. Memoria virtuale (!!!)
  2. Mezzi di indirizzamento di dispositivi diversi dalla memory (ad es. Tastiere, printingnti, archiviazione secondaria, ecc.)
  3. interrupt

Hai bisogno di questi per essere in grado di implementare qualcosa di simile a un sistema operativo moderno.

Sono anche (relativamente) lenti con aritmetica a double precisione (rispetto alla loro singola prestazione aritmetica di precisione) * e sono molto più grandi (in termini di size del silicio). Le architetture GPU più vecchie non supportno le chiamate indirette (tramite i puntatori di function) necessarie per la maggior parte della programmazione in generale e le architetture più recenti che lo fanno lentamente. Infine, (come hanno scoperto altre risposte), per le attività che non possono essere parallate, le GPU perdono rispetto alle CPU con lo stesso carico di lavoro.

EDIT : Si prega di notare che questa risposta è stata scritta nel 2011 – GPU tech è una zona che cambia costantemente. Le cose potrebbero essere molto diverse a seconda di quando stai leggendo questo: P

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

Una CPU è come un lavoratore che supera velocemente. Una GPU è come un gruppo di operai di clone che vanno velocemente, ma che tutti devono fare esattamente la stessa cosa in unione (ad exception che si può avere alcuni cloni sedersi inattivi se si desidera)

Quale sarebbe piuttosto come tuo sviluppatore, un ragazzo super veloce o 100 cloni veloci che non sono effettivamente veloci, ma tutti devono eseguire le stesse azioni contemporaneamente?

Per alcune azioni, i cloni sono abbastanza buoni per esempio spazzare il pavimento – possono spazzare una parte di esso.

Per alcune azioni, i cloni puzzano, ad esempio scrivono il rapporto settimanale – tutti i cloni ma uno inattivo mentre un clone scrive il rapporto (altrimenti si ottiene solo 100 copie dello stesso rapporto).

Poiché le GPU sono progettate per fare un sacco di piccole cose contemporaneamente, e le CPU sono progettate per fare una cosa alla volta. Se il process può essere fatto massicciamente parallelo, come la hashing, la GPU è ordini di grandezza più veloce, altrimenti non lo sarà.

La CPU può calcolare un hash molto, molto più veloce della GPU ansible – ma il tempo che richiede la CPU per farlo, la tua GPU potrebbe essere parte attraverso 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 veloci.

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

Una nota laterale minore, però, se fosse ansible scartare la CPU e avere solo una GPU, non pensi che l'avremmo rinominato? 🙂

Stai davvero chiedendo perché non stiamo utilizzando GPU come architetture nella CPU?

GPU è solo una CPU specializzata di una scheda grafica. Noi offriamo un calcolo GPU non grafico perché la CPU a scopo generale non è solo in grado di eseguire in parallelo e in esecuzione a virgola mobile.

In realtà stiamo usando diverse (più GPU-ish) CPU architetture. Ad esempio i processri Niagara sono piuttosto multitasking. SPARC T3 eseguirà 512 thread concorrenti.

Potrei essere terribilmente sbagliato qui e parlo da poco o nessuna autorità in materia, ma qui va:

  • Credo che each unità di esecuzione della GPU ("core") abbia uno spazio di indirizzi molto limitato rispetto ad una CPU.

  • Le unità di esecuzione della GPU non possono affrontare efficacemente le ramificazioni.

  • Le unità di esecuzione della GPU non supportno gli interrupt hardware in modo che le CPU fanno.

Ho sempre pensato al modo in cui le unità di esecuzione della GPU erano destinate ad essere è qualcosa come le Playstation 3 "SPEs", vogliono avere un block di dati, eseguire un certo numero di operazioni sequenziali su di esso e poi sputare un altro block di dati, sciacquare, ripetere. Non hanno altrettanta memory indirizzabile come il principale "CPE", ma l'idea è di dedicare each "SPE" ad un task specifico e sequenziale. L'output di un'unità potrebbe alimentare l'ingresso di un'altra unità.

Le unità di esecuzione non funzionano bene se stanno cercando di "analizzare" i dati e fare un sacco di decisioni in base a ciò che i dati sono.

Questi "blocchi di dati" possono essere parte di un stream, ad esempio un elenco di vertici da una tabella di stato di un gioco, i dati MPEG da un disco ecc.

Se qualcosa non si inserisce in questo model "streaming", allora hai un task che non può essere parallelo in modo efficiente e la GPU non è necessariamente la soluzione migliore. Un buon esempio è la elaborazione di elementi di "evento esterno" come tastiera, joystick o input di networking. Non ci sono molte cose che non si adattano a quel model, ma ci saranno sempre pochi.

Questo non è niente di orologio o di 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, poi altri.

C'è stato un argomento molto vecchio su se è meglio avere un sacco di nuclei muffi o un piccolo gruppo di nuclei molto intelligenti. Questo risale facilmente negli anni '80.

All'interno di una CPU ci sono molti possibili calcoli che possono essere fatti. I nuclei più intelligenti sono in grado di eseguire contemporaneamente diversi calcoli diversi (tipo di multi-core ma non, è complicato; vedere il parallelismo a livello di istruzione ). Un nucleo intelligente potrebbe fare diversi calcoli allo stesso tempo (aggiungere, sottrarre, moltiplicare, dividere, operare in memory) ma solo uno alla volta; a causa di ciò, sono fisicamente più grandi (e quindi molto più costosi) poi nuclei duri.

Un nucleo muffato è molto più piccolo e pertanto più possono essere aggiunti ad un singolo chip, ma non sono in grado di fare altretanti calcoli simultanei. C'è un ottimo equilibrio tra molti nuclei neri e alcuni nuclei intelligenti.

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

Questa è una domanda molto più complicata di quanto possa apparire. Per ulteriori informazioni, leggere questo articolo sulla progettazione della CPU:

Microprocessri moderni – Una guida di 90 minuti

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

Vorrei fare un punto sinottico: i termini CPU e GPU sono nomi funzionali non nomi architettonici.

Se un computer wheresse utilizzare una GPU come processre principale, sarebbe diventato un "central processing unit" (CPU) indipendentemente dall'architettura e dal design.

È importnte tenere presente che nello spazio dell'architettura non esiste una linea di divisione magica che rende un processre "centrale" e un altro "grafico". (Beh, alcune GPU possono essere troppo svalutate per essere completamente generali, ma non sono quelle che stiamo parlando qui.)

La distinzione è uno di come vengono installati sul bordo e quali sono le attività che vengono loro assegnate. Naturalmente, utilizziamo un processre di tipo generale (o un set di processri di uso generale) per il mainstream di dati e una unità speciale, parallela e profondamente foderata per le cose (come la grafica) che possono trarre vantaggio.

La maggior parte dei trucchi spiffy che sono stati utilizzati per fare GPU fare la loro cosa molto veloce sono stati sviluppati da persone che cercano di fare CPU più veloci e migliori. Sembra che Word e Excel e Netscape e molte altre cose che la gente utilizza i propri computer non solo non sfruttino appieno le funzionalità offerte dai chip specializzati in grafica, ma anche funzionano più lentamente su quelle architetture perché fanno molto causa (molto costose e lenta).

L'integer punto di essere una GPU era di sollievo dalla CPU dai costosi calcoli grafici che stava facendo al momento.
Combinandoli a un singolo processre tornerebbero nuovamente da where tutti cominciarono.

Per una ragione semplice: la maggior parte delle applicazioni non sono multi-threaded / vectorized.

Le carte grafiche si basano fortemente sulla multi filettatura, alless nel concetto.

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

Con la fusione di AMD, però, cambierà come dovremo usare il potere di elaborazione: sia vettoriale, sia veloce per un thread.

Il motivo per cui stiamo ancora utilizzando CPU è che entrambe le CPU e le GPU hanno i loro vantaggi unici. Vedere la mia carta successiva, accettata in ACM Computing Surveys 2015, che fornisce una discussione conclusiva e completa sullo spostamento dal "dibattito CPU vs GPU" al "computing collaborativo CPU-GPU".

Un sondaggio di tecniche di elaborazione eterogenea CPU-GPU

Se per mettere semplicemente GPU può essere paragonato al trailer in auto. Come normalmente il tronco è abbastanza per la maggior parte delle persone tranne che per i casi se acquistano qualcosa di veramente grande. Poi possono avere bisogno di un rimorchio. Lo stesso con GPU, di solito è sufficiente avere CPU ordinaria che compirà la maggior parte dei compiti. Ma se avete bisogno di calcoli intensivi in ​​molti thread, allora è necessario disporre di GPU

gpus sono processri di stream buono. si può pensare all'elaborazione del stream come moltiplicare una lunga serie di numbers in sequenza. Anche le cpus dispongono di funzionalità di elaborazione di flussi (si chiama estensioni SIMD) ma non è ansible implementare tutta la logica di programmazione come elaborazione di flussi e i compilatori hanno l'opzione di creare btyecode che usa istruzioni simd quando ansible.

non tutto è una serie di numbers. immagini e video sono, forse anche suoni (ci sono encoder opencl qua e là). in modo che gpus possa elaborare, codificare e decodificare immagini, video e qualsiasi cosa simile. un inconveniente è che non puoi offloadare tutto a gpus nei giochi perché creerebbe stutter, gpus sono occupati con la grafica e dovrebbero essere il collo di bottiglia nel sistema durante la riproduzione di giochi. la soluzione ottimale sarebbe utilizzare pienamente tutti i componenti in un pc. così, per esempio, il motore fisico di nvidia, per impostazione predefinita, calcola sulla CPU quando il gpu viene completamente utilizzato.