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

14

I nuovi sistemi come OpenCL vengono creati in modo da poter eseguire sempre più codice sui nostri processori grafici, che ha senso, perché dovremmo essere in grado di utilizzare la maggior parte del potere nei nostri sistemi il più possibile.

Tuttavia, con tutti questi nuovi sistemi, sembra che le GPU siano migliori delle CPU in in ogni modo . Poiché le GPU possono eseguire il calcolo parallelo, le GPU multi-core sembrano effettivamente molto meglio delle CPU multi-core; sarai 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?

    
posta RétroX 11.09.2011 - 16:45
fonte

7 risposte

26

However, with all of these new systems, it seems as if GPUs are better than CPUs in every way.

Questa è una fondamentale incomprensione. Gli attuali core GPU sono ancora limitati rispetto alle attuali CPU top-line. 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 di un processore Intel corrente. I chip Intel i7 forniscono tre livelli di memorizzazione nella cache, i core Fermi ne hanno solo due e ogni cache sul Fermi è più piccola della cache corrispondente sull'i7. La comunicazione tra processi tra i core GPU è abbastanza limitata ei calcoli devono essere elaborati per contenere tale limite (i nuclei sono raggruppati in blocchi e la comunicazione tra i core in un blocco è relativamente veloce, ma la comunicazione tra i blocchi è lenta). p>

Una limitazione significativa delle GPU correnti è che tutti i core devono eseguire lo stesso codice. A differenza dei core della CPU, non è possibile stabilire un core GPU per eseguire il client di posta elettronica e un altro core per eseguire il 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 della 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 ha sostanziali costi generali. La GPU ha una sua memoria, quindi i calcoli saranno limitati alla quantità di memoria sulla scheda GPU. Il trasferimento dei dati tra la memoria della GPU e la memoria principale è relativamente costoso. Pragmaticamente questo significa che non vi è alcun vantaggio nel passare una manciata di calcoli corti dalla CPU alla GPU, perché i costi di installazione e di smantellamento faranno accumulare il tempo necessario per eseguire il calcolo.

La linea di fondo è che le GPU sono utili quando si hanno molti (come in centinaia o migliaia) di copie di un lungo calcolo che può essere calcolato in parallelo. I compiti tipici per cui 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 è nel rendering del tipo sullo schermo.

    
risposta data 11.09.2011 - 21:38
fonte
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 della maggior parte delle applicazioni non riguarda l'applicazione dello stesso codice a una grande quantità di dati; si tratta di un ciclo di eventi: attendere input, leggere l'input, agire su di esso e attendere altro input. È un bel processo seriale e le GPU fanno "seriale".

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

Questa domanda è contrassegnata come "ottimizzazione", quindi ricordati di trattarla come tale. Applicare l'ottimizzazione della GPU dove test e profiling rivelano che l'ottimizzazione è necessaria e la natura dell'attività è tale da poter applicare l'ottimizzazione della GPU. Altrimenti, non preoccupartene, poiché sarebbe un'ottica prematura o errata, che causa più problemi di quanti ne risolva.

    
risposta data 11.09.2011 - 21:17
fonte
8

La semplice risposta è che una GPU funziona meglio quando devi fare un calcolo abbastanza piccolo, abbastanza semplice su ognuno di un numero molto grande di elementi. Per ottenere molto in questo modo, il calcolo per ciascun elemento deve essere indipendente dai calcoli per gli altri elementi. Se c'è (di solito) una certa dipendenza tra un oggetto e un altro, in genere devi trovare un modo per romperlo prima che tu possa ottenere molto da eseguire quel codice sulla GPU. Se la dipendenza non può essere interrotta o richiede troppo lavoro da interrompere, il codice potrebbe essere eseguito più velocemente sulla CPU.

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

Guardando da una direzione leggermente diversa, le CPU sono state (in gran parte) progettate per essere ragionevolmente convenienti per i programmatori, e le persone dell'hardware hanno fatto del loro meglio (e dannatamente buono è!) per creare hardware che mantenga quella modello conveniente per il programmatore, ma viene eseguito il più rapidamente possibile.

Le GPU arrivano dalla direzione opposta: sono progettate in gran parte per essere utili per il progettista hardware, e cose come OpenCL hanno cercato di fornire il più ragionevole possibile di un modello di programmazione dato i vincoli dell'hardware.

Scrivere codice per l'esecuzione su una GPU richiede in genere più tempo e impegno (quindi costerà più) rispetto a fare lo stesso sulla CPU. Come tale, farlo ha senso soprattutto quando / se entrambi:

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

Ci sono alcune ovvie possibilità per ciascuno - ma un enorme numero di applicazioni chiaramente non è nemmeno vicino a nessuno dei due. Sarei piuttosto sorpreso di vedere (per esempio) un'applicazione CRUD in esecuzione su una GPU in qualsiasi momento (e se lo fa, probabilmente accadrà perché qualcuno ha in mente con questo obiettivo preciso, non necessariamente qualcosa che si avvicina ad un ottimale rapporto costi / benefici).

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

    
risposta data 11.09.2011 - 20:15
fonte
3

you'd be able to do many calculations at once and really improve speed.

migliorare la velocità? e allora? Attraverso l'anno scorso posso ricordare solo una o due volte quando è stato necessario. Il più delle volte mi è stato chiesto di modificare o correggere la logica, di adattarsi a una diversa fonte di dati, di migliorare l'interazione dell'utente ecc. Ecc. I soli clienti speed interessati a questi casi erano la velocità di produzione un cambiamento. "Si prega di rilasciare la nuova funzionalità in un mese, o meglio ancora - in due settimane".

Non fraintendermi - come programmatore mi piace spremere a fondo le zecche della CPU. È solo che questa arte non è in genere molto richiesta.

Are there still certain cases where serial processing is still better, faster, and/or more efficient than parallel?

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

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

    
risposta data 11.09.2011 - 18:42
fonte
2

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

    
risposta data 11.09.2011 - 18:11
fonte
2

La semplice regola è, se quello che stai facendo può essere formulato in termini di costrutti da algebra lineare ed è time-critical, fallo sulla GPU altrimenti usa la CPU.

Le GPU non sono come un gran numero di CPU, hanno caratteristiche di performance molto diverse.

    
risposta data 11.09.2011 - 20:33
fonte
1

Se hai bisogno di crunch di numeri grezzi, le GPU sono la strada da percorrere. Tuttavia, tutte queste ALU significano che ci sono meno transistor dedicati al circuito di controllo (ramificazione). Quindi, se hai bisogno di scrivere qualcosa che richiede un flusso di controllo molto complesso, un sacco di condizionali, ecc., Allora una CPU sarà più veloce.

    
risposta data 12.09.2011 - 03:45
fonte

Leggi altre domande sui tag