Quando devo scaricare il lavoro su una GPU anziché sulla CPU?


15

Sistemi più recenti come OpenCL sono stati creati in modo da poter eseguire sempre più codice sui nostri processori grafici, il che ha senso, perché dovremmo essere in grado di utilizzare quanta più potenza possibile nei nostri sistemi.

Tuttavia, con tutti questi nuovi sistemi, sembra che le GPU siano migliori delle CPU in ogni modo . Poiché le GPU possono eseguire calcoli paralleli, le GPU multi-core sembrano in realtà molto migliori delle CPU multi-core; saresti in grado di fare molti calcoli contemporaneamente e migliorare davvero la velocità. Ci sono ancora alcuni casi in cui l'elaborazione seriale è ancora migliore, più veloce e / o più efficiente del parallelo?



6
Non è davvero una domanda sull'hardware. Dovrebbe essere riformulato "quando la programmazione della CPU è migliore della programmazione della GPU (s)" ed è una domanda abbastanza buona per IMO. Vedi il tag GPGPU tra gli altri su SO. Ma le domande sull'architettura "Quale tecnologia usare" sono migliori qui che lì.
Kate Gregory,

1
@Kate Quell'angolo sembra essere molto ben coperto nella domanda Super User collegata. Leggendolo, sono un po 'sorpreso che non sia stato migrato qui, a dire il vero. C'è anche questo su SO. Riaprirò la domanda (dato che hai ragione, gli aspetti di programmazione sono in argomento qui). Spero che vedremo una risposta che non stia solo indicando la copertura (eccellente) esistente di questo problema.
Adam Lear

1
Al punto di @Anna, penso che le risposte debbano riguardare molto di più quando un programmatore dovrebbe usare la GPU piuttosto che una discussione puramente teorica su quale sia la differenza tra una GPU e una CPU. Ho modificato il titolo per riflettere questo.

2
@RetroX Non possiamo chiudere le domande come duplicati se si trovano su siti diversi.
Adam Lear

Risposte:


26

Tuttavia, con tutti questi nuovi sistemi, sembra che le GPU siano migliori delle CPU in ogni modo.

Questa è una comprensione sbagliata fondamentale. I core GPU attuali sono ancora limitati rispetto alle attuali CPU di fascia alta. Penso che l'architettura Fermi di NVIDIA sia la GPU più potente attualmente disponibile. Ha solo registri a 32 bit per l'aritmetica dei numeri interi e meno capacità per la previsione dei rami e l'esecuzione speculativa rispetto a un processore Intel di materie prime corrente. I chip Intel i7 offrono tre livelli di cache, i core Fermi ne hanno solo due e ogni cache su Fermi è più piccola della cache corrispondente su i7. La comunicazione tra processi tra i core della GPU è piuttosto limitata e i calcoli devono essere strutturati per adattarsi a tale limitazione (i core sono sistemati in blocchi e la comunicazione tra i core in un blocco è relativamente veloce, ma la comunicazione tra i blocchi è lenta).

Una limitazione significativa delle GPU attuali è che tutti i core devono eseguire lo stesso codice. A differenza dei core della CPU, non puoi dire a un core GPU di eseguire il tuo client di posta elettronica e un altro core a eseguire il tuo server web. Dai alla GPU la funzione di invertire una matrice e tutti i core eseguono quella funzione su diversi bit di dati.

I processori sulla GPU vivono in un mondo isolato. Possono controllare il display, ma non hanno accesso al disco, alla rete o alla tastiera.

L'accesso al sistema GPU comporta notevoli costi generali. La GPU ha una propria memoria, quindi i tuoi calcoli saranno limitati alla quantità di memoria sulla scheda GPU. Il trasferimento di dati tra la memoria GPU e la memoria principale è relativamente costoso. Pragmaticamente questo significa che non vi è alcun vantaggio nel consegnare una manciata di brevi calcoli dalla CPU alla GPU, perché i costi di installazione e smantellamento dilagheranno il tempo necessario per eseguire il calcolo.

La linea di fondo è che le GPU sono utili quando si hanno molte (come in centinaia o migliaia) di copie di un lungo calcolo che può essere calcolato in parallelo. Compiti tipici per i quali questo è comune sono il calcolo scientifico, la codifica video e il rendering delle immagini. Per un'applicazione come un editor di testo l'unica funzione in cui una GPU potrebbe essere utile è il rendering del tipo sullo schermo.


il supporto per la doppia precisione fa parte del modello Shader 5 e anche AMD / ATI.
Ben Voigt,

@Ben, grazie per la correzione. Ho rimosso la dichiarazione errata.
Charles E. Grant,

11

Le GPU non sono processori generalisti come le CPU. Sono specializzati nel fare una cosa molto specifica - applicare lo stesso codice a una grande quantità di dati - e lo fanno molto, molto bene, molto meglio di una CPU. Ma la maggior parte delle applicazioni non riguarda l'applicazione dello stesso codice a una grande quantità di dati; si tratta di un loop di eventi: attendere l'input, leggere l'input, agire su di esso e quindi attendere ulteriori input. È un processo piuttosto seriale e le GPU fanno schifo in "seriale".

Quando hai una grande quantità di dati che devi elaborare e ogni articolo può essere elaborato in parallelo, indipendentemente dagli altri, vai avanti e invialo alla GPU. Ma non pensare a questo come al "nuovo paradigma" in cui tutto deve essere schiacciato.

Questa domanda è taggata "ottimizzazione", quindi ricorda di trattarla come tale. Applicare l'ottimizzazione della GPU laddove i test e la profilazione rivelano che l'ottimizzazione è necessaria e la natura dell'attività è tale da poter applicare l'ottimizzazione della GPU. Altrimenti, non preoccuparti, poiché sarebbe un'ottimizzazione prematura o errata, che causa più problemi di quanti ne risolva.


8

La semplice risposta è che una GPU funziona meglio quando è necessario eseguire un calcolo abbastanza piccolo e abbastanza semplice su ciascuno di un numero molto elevato di elementi. Per ottenere molto in questo modo, il calcolo per ogni articolo deve essere indipendente dai calcoli per gli altri oggetti. Se c'è (normalmente) una certa dipendenza tra un elemento e l'altro, in genere è necessario trovare un modo per romperlo prima di ottenere molto dall'esecuzione di quel codice sulla GPU. Se la dipendenza non può essere completamente interrotta o richiede troppo lavoro per essere interrotta, il codice potrebbe essere eseguito più velocemente sulla CPU.

La maggior parte delle CPU attuali supporta anche alcuni tipi di operazioni che le GPU attuali semplicemente non tentano affatto di supportare (ad esempio, la protezione della memoria per il multitasking).

Guardandolo da una direzione leggermente diversa, le CPU sono state (in gran parte) progettate per essere ragionevolmente convenienti per i programmatori e le persone hardware hanno fatto del loro meglio (e un dannatamente meglio è!) Per creare hardware che mantenga quel modello conveniente per il programmatore, ma esegue comunque il più rapidamente possibile.

Le GPU provengono piuttosto dalla direzione opposta: sono progettate in gran parte per essere convenienti per il progettista hardware e cose come OpenCL hanno tentato di fornire il più ragionevole possibile di un modello di programmazione dati i vincoli dell'hardware.

La scrittura di codice per l'esecuzione su una GPU richiederà in genere più tempo e sforzi (quindi avrà un costo maggiore) rispetto a fare lo stesso sulla CPU. Come tale, farlo principalmente ha senso quando / se uno dei due:

  1. Il problema è così parallelo che puoi aspettarti un grande guadagno con il minimo sforzo, o
  2. Il guadagno di velocità è così importante che giustifica molto lavoro extra.

Ci sono alcune ovvie possibilità per ognuna, ma un numero enorme di applicazioni chiaramente non è nemmeno vicino a nessuna delle due. Sarei piuttosto sorpreso di vedere (ad esempio) un'applicazione CRUD in esecuzione su una GPU in qualsiasi momento presto (e, in tal caso, probabilmente accadrà perché qualcuno ha deciso con quell'obiettivo preciso in mente, non necessariamente qualcosa che si avvicina a un ottimale rapporto costi / benefici).

La realtà è che per molte applicazioni (sono tentato di dire "la maggior parte"), una CPU tipica è molto più che abbastanza veloce e la comodità di programmazione (che porta a cose come lo sviluppo più semplice di nuove funzionalità) è molto più importante di velocità di esecuzione.


3

saresti in grado di fare molti calcoli contemporaneamente e migliorare davvero la velocità.

migliorare la velocità? e allora? Durante l'anno scorso posso ricordare solo una o due volte quando era necessario. Il più delle volte mi è stato chiesto di modificare o correggere la logica, di adattarmi a una diversa fonte di dati, di migliorare l'interazione dell'utente, ecc. Ecc. L'unica velocità che i clienti erano interessati a questi casi era la velocità di apportare una modifica. "Per favore rilascia nuove funzionalità tra un mese, o meglio ancora - tra due settimane".

Non fraintendetemi: come programmatore mi piace spremere a fondo i tick della CPU. È solo che questa arte non è in genere molto richiesta.

Ci sono ancora alcuni casi in cui l'elaborazione seriale è ancora migliore, più veloce e / o più efficiente del parallelo?

Direi che ci sono molti casi. L'elaborazione seriale è più semplice del parallelo, il che la rende più efficiente in tutti i casi in cui la velocità non è un requisito critico. L'elaborazione seriale consente una più semplice implementazione della logica complessa e dell'interfaccia utente, è più facile specificare e testare, mantenere e modificare.

Di norma, l'elaborazione seriale consente un'espressione più chiara dell'intento del programmatore e una lettura più semplice del codice. Direi che salva la risorsa più preziosa e scarsa: il cervello del programmatore.


2

Le CPU sono ancora più versatili. Ad esempio, le GPU sono più efficienti delle CPU con precisione singola, ma non con precisione doppia. Esistono molte più librerie per CPU che per GPU.


3
Puoi approfondire un po 'di più? Hai fornito tre dichiarazioni senza informazioni o spiegazioni sulla veridicità di esse.

Bene, la mancanza di efficienti calcoli a doppia precisione è una conoscenza comune: en.wikipedia.org/wiki/GPGPU
quant_dev

@quant: le tue informazioni sono obsolete da almeno 2 anni: 544 GigaFLOPS è molto più veloce di qualsiasi CPU tradizionale.
Ben Voigt,

@Ben Non vedo dove il tuo link menziona le prestazioni a doppia precisione.
quant_dev,


2

La semplice regola è che se quello che stai facendo può essere formulato in termini di costrutti dall'algebra lineare ed è critico in termini di tempo, fallo sulla GPU, altrimenti usa la CPU.

Le GPU non sono come un gran numero di CPU, hanno caratteristiche prestazionali incredibilmente diverse.


Se è "tempo critico", probabilmente non hai tempo per riconfigurare la GPU per uno shader di calcolo e caricare i dati. Sono i grandi problemi a trarne maggiori benefici.
Ben Voigt,

@Ben, penso che abbiamo diverse definizioni di "tempo critico", ciò che intendo è che il calcolo è sul percorso critico per un periodo di tempo significativo.
dan_waterworth,

1

Se hai bisogno di scricchiolare i numeri, le GPU sono la strada da percorrere. Tuttavia, tutte quelle ALU indicano che ci sono meno transistor dedicati ai circuiti di flusso di controllo (branching). Quindi, se hai bisogno di scrivere qualcosa che richiede molto flusso di controllo complesso, molti condizionali, ecc., Una CPU sarà più veloce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.