La réponse simple est qu'un GPU fonctionne mieux lorsque vous devez effectuer un calcul assez petit et assez simple sur chacun d'un très grand nombre d'éléments. Pour accomplir beaucoup de cette façon, le calcul de chaque élément doit être indépendant des calculs pour les autres éléments. S'il y a (normalement) une certaine dépendance entre un élément et un autre, vous devez généralement trouver un moyen de le casser avant de tirer le meilleur parti de l'exécution de ce code sur le GPU. Si la dépendance ne peut pas être brisée du tout ou nécessite trop de travail pour être brisée, le code peut s'exécuter plus rapidement sur le CPU.
La plupart des processeurs actuels prennent également en charge un certain nombre de types d'opérations qu'un GPU actuel ne tente tout simplement pas de prendre en charge (par exemple, la protection de la mémoire pour le multitâche).
En regardant dans une direction légèrement différente, les processeurs ont été (en grande partie) conçus pour être raisonnablement pratiques pour les programmeurs, et les gens du matériel ont fait de leur mieux (et c'est le meilleur!) Pour créer du matériel qui maintient ce modèle pratique pour le programmeur, mais exécute toujours aussi rapidement que possible.
Les GPU viennent dans des directions plutôt opposées: ils sont conçus en grande partie pour être pratiques pour le concepteur de matériel, et des choses comme OpenCL ont tenté de fournir un modèle de programmation aussi raisonnable que possible compte tenu des contraintes du matériel.
L'écriture de code à exécuter sur un GPU prendra généralement plus de temps et d'efforts (donc cela coûtera plus cher) que de faire de même sur le CPU. En tant que tel, cela est principalement logique lorsque / si:
- Le problème est si parallèle que vous pouvez vous attendre à un gain important avec un effort minimal, ou
- Le gain de vitesse est si important qu'il justifie beaucoup de travail supplémentaire.
Il existe des possibilités évidentes pour chacun - mais un grand nombre d'applications ne sont clairement pas proches de l'une ou l'autre. Je serais assez surpris de voir (par exemple) une application CRUD s'exécuter sur un GPU de sitôt (et si c'est le cas, cela se produira probablement parce que quelqu'un s'est fixé cet objectif précis à l'esprit, pas nécessairement quelque chose approchant un optimal rapport coût / bénéfice).
La réalité est que pour de nombreuses applications (je suis tenté de dire "la plupart"), un CPU typique est beaucoup plus que suffisamment rapide, et la commodité de la programmation (conduisant à des choses comme le développement plus facile de nouvelles fonctionnalités) est beaucoup plus importante que vitesse d'exécution.