La respuesta simple es que una GPU funciona mejor cuando necesita hacer un cálculo bastante pequeño y bastante simple en cada uno de una gran cantidad de elementos. Para lograr mucho de esta manera, el cálculo de cada elemento debe ser independiente de los cálculos de los otros elementos. Si hay (normalmente) alguna dependencia entre un elemento y otro, generalmente necesita encontrar alguna forma de romperlo antes de sacar mucho provecho de la ejecución de ese código en la GPU. Si la dependencia no puede romperse en absoluto, o requiere demasiado trabajo para romper, el código podría ejecutarse más rápido en la CPU.
La mayoría de las CPU actuales también admiten bastantes tipos de operaciones que las GPU actuales simplemente no intentan admitir en absoluto (por ejemplo, protección de memoria para multitarea).
Mirándolo desde una dirección ligeramente diferente, las CPU han sido (en gran parte) diseñadas para ser razonablemente convenientes para los programadores, y la gente del hardware ha hecho todo lo posible (¡y lo mejor es lo mejor!) Para crear hardware que mantenga ese modelo conveniente para el programador, pero aún se ejecuta lo más rápido posible.
Las GPU vienen en una dirección bastante opuesta: están diseñadas en gran medida para ser convenientes para el diseñador de hardware, y cosas como OpenCL han intentado proporcionar un modelo de programación tan razonable como sea posible dadas las limitaciones del hardware.
Escribir código para ejecutarse en una GPU generalmente requerirá más tiempo y esfuerzo (por lo que costará más) que hacer lo mismo en la CPU. Como tal, hacerlo tiene sentido principalmente cuando / si:
- El problema es tan paralelo que puede esperar una gran ganancia con un esfuerzo mínimo, o
- La ganancia de velocidad es tan importante que justifica mucho trabajo extra.
Hay algunas posibilidades obvias para cada uno, pero una gran cantidad de aplicaciones claramente ni siquiera están cerca de ninguna de ellas. Me sorprendería bastante ver (por ejemplo) una aplicación CRUD que se ejecuta en una GPU en el corto plazo (y si lo hace, probablemente sucederá porque alguien se propuso con ese objetivo exacto en mente, no necesariamente algo que se aproxime a un óptimo relación costo / beneficio).
La realidad es que para muchas aplicaciones (estoy tentado a decir "la mayoría"), una CPU típica es mucho más que lo suficientemente rápida, y la conveniencia de la programación (que lleva a cosas como el desarrollo más fácil de nuevas características) es mucho más importante que velocidad de ejecución