簡単な答えは、非常に多数のアイテムのそれぞれに対してかなり小さく、かなり単純な計算を行う必要があるときにGPUが最適に機能するということです。この方法を実現するには、各アイテムの計算が他のアイテムの計算から独立している必要があります。あるアイテムと別のアイテムの間に(通常)何らかの依存関係がある場合、一般に、GPUでそのコードを実行することから多くを得る前に、それを破る何らかの方法を見つけ出す必要があります。依存関係をまったく解消できない場合、または解消するために多くの作業が必要な場合、コードはCPU上でより高速に実行される可能性があります。
現在のほとんどのCPUは、現在のGPUがまったくサポートしようとしない、非常に少数のタイプの操作もサポートします(たとえば、マルチタスクのメモリ保護)。
CPUを少し異なる方向から見ると、CPUは(大部分)プログラマーにとって合理的に便利になるように設計されており、ハードウェアの人々は、その便利なモデルを維持するハードウェアを作成するために最善を尽くしていますプログラマーですが、可能な限り迅速に実行します。
GPUは、むしろ反対方向からのものに来ます:それらは主にハードウェア設計者にとって便利になるように設計されており、OpenCLのようなものは、ハードウェアの制約を考慮して可能な限り合理的なプログラミングモデルを提供しようとしました。
GPUで実行するコードを記述すると、通常、CPUで同じことを行うよりも多くの時間と労力がかかります(したがって、コストがかかります)。このように、そうすることは、主に次の場合に意味があります。
- 問題は非常に並行的であるため、最小限の労力で大きな利益を期待できます。
- 速度の向上は非常に重要であるため、多くの余分な作業が必要になります。
それぞれにいくつかの明白な可能性がありますが、膨大な数のアプリケーションは明らかにどちらにも近いものではありません。(たとえば)すぐにGPUでCRUDアプリケーションが実行されるのを見ると、非常に驚くでしょう(もしそうなれば、誰かがその正確な目標を念頭に置いて、必ずしも最適に近づいているわけではないので、おそらく起こります)費用便益比)。
現実には、多くの(「ほとんど」と言いたい)アプリケーションでは、典型的なCPUは十分に高速であり、プログラミングの利便性(新機能の開発が容易になるなど)がはるかに重要です。実行速度。