La respuesta simple es que una GPU funciona mejor cuando necesita realizar un cálculo bastante pequeño y bastante simple en cada uno de un gran número de elementos. Para lograr mucho de esta manera, el cálculo para cada artículo debe ser independiente de los cálculos para los otros artículos. Si hay (normalmente) alguna dependencia entre un elemento y otro, generalmente necesita descubrir alguna forma de romperlo antes de que pueda obtener mucho de la ejecución de ese código en la GPU. Si la dependencia no se puede romper 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 tareas múltiples).
Mirándolo desde una dirección ligeramente diferente, las CPU han sido (en gran medida) diseñadas para ser razonablemente convenientes para los programadores, y la gente de hardware ha hecho todo lo posible (¡y lo mejor es que es!) para crear hardware que mantenga eso Un modelo conveniente para el programador, pero aún se ejecuta lo más rápido posible.
Las GPU vienen en direcciones bastante opuestas: están diseñadas en gran medida para que sean convenientes para el diseñador de hardware, y cosas como OpenCL han intentado proporcionar un modelo de programación lo más razonable posible dadas las limitaciones del hardware. / p>
Escribir el código para ejecutarse en una GPU generalmente toma más tiempo y esfuerzo (por lo que costará más) que hacer lo mismo en la CPU. Como tal, hacerlo principalmente tiene sentido cuando / si:
- El problema es tan paralelo que puede esperar una gran ganancia de un esfuerzo mínimo, o
- El aumento de velocidad es tan importante que justifica una gran cantidad de trabajo adicional.
Hay algunas posibilidades obvias para cada una, pero una cantidad enorme de aplicaciones claramente no están cerca de ninguna de las dos. Me sorprendería mucho ver (por ejemplo) una aplicación CRUD que se ejecuta en una GPU en el futuro (y si lo hace, probablemente sucederá porque alguien partió con ese objetivo exacto en mente, no necesariamente nada que se aproxime a un óptimo relación costo / beneficio).
La realidad es que para muchas de las aplicaciones (estoy tentado de decir "la mayoría"), una CPU típica es más que lo suficientemente rápida, y la conveniencia de programación (lo que lleva a un desarrollo más sencillo de nuevas funciones) es < em> much más importante que la velocidad de ejecución.