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