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:
- Il problema è così parallelo che puoi aspettarti un grande guadagno dal minimo sforzo, o
- 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.