Die einfache Antwort ist, dass eine GPU am besten funktioniert, wenn Sie eine ziemlich kleine, ziemlich einfache Berechnung für jede sehr große Anzahl von Elementen durchführen müssen. Um auf diese Weise viel zu erreichen, muss die Berechnung für jedes Element unabhängig von den Berechnungen für die anderen Elemente sein. Wenn es (normalerweise) Abhängigkeiten zwischen einem Element und einem anderen gibt, müssen Sie im Allgemeinen herausfinden, wie Sie es auflösen können, bevor Sie den Code auf der GPU ausführen können. Wenn die Abhängigkeit überhaupt nicht unterbrochen werden kann oder zu viel Arbeit erfordert, wird der Code möglicherweise schneller auf der CPU ausgeführt.
Die meisten aktuellen CPUs unterstützen auch einige Arten von Vorgängen, die von aktuellen GPUs einfach nicht unterstützt werden (z. B. Speicherschutz für Multitasking).
Aus einer etwas anderen Perspektive betrachtet, wurden CPUs (größtenteils) so entwickelt, dass sie für Programmierer einigermaßen praktisch sind, und die Hardware-Leute haben ihr Bestes gegeben (und es ist verdammt gut, dass es das Beste ist!), Um Hardware zu entwickeln, die dieses praktische Modell beibehält der Programmierer, aber immer noch so schnell wie möglich ausgeführt.
GPUs kommen aus einer eher entgegengesetzten Richtung: Sie wurden größtenteils so entworfen, dass sie für den Hardware-Designer bequem sind, und Dinge wie OpenCL haben versucht, ein Programmiermodell so angemessen wie möglich angesichts der Einschränkungen der Hardware bereitzustellen.
Das Schreiben von Code für die Ausführung auf einer GPU nimmt in der Regel mehr Zeit und Mühe in Anspruch (kostet also mehr) als das Gleiche für die CPU. Insofern ist dies in erster Linie dann sinnvoll, wenn:
- Das Problem ist so parallel, dass Sie mit minimalem Aufwand einen großen Gewinn erwarten können, oder
- Der Geschwindigkeitszuwachs ist so wichtig, dass er viel zusätzliche Arbeit rechtfertigt.
Es gibt einige offensichtliche Möglichkeiten für jede - aber eine große Anzahl von Anwendungen kommt eindeutig keiner von beiden nahe. Ich wäre ziemlich überrascht, wenn (zum Beispiel) bald eine CRUD-Anwendung auf einer GPU laufen würde (und wenn dies der Fall ist, wird dies wahrscheinlich geschehen, weil jemand genau dieses Ziel verfolgt und sich nicht unbedingt einem Optimum nähert Kosten-Nutzen-Verhältnis).
Die Realität ist, dass für viele (ich bin versucht, "die meisten" zu sagen) Anwendungen eine typische CPU weit mehr als schnell genug ist und der Programmierkomfort (der zu Dingen wie der einfacheren Entwicklung neuer Funktionen führt) viel wichtiger ist als Ausführungsgeschwindigkeit.