なぜまだ GPU ではなく CPU を使っているのか
最近は GPU 上で多くの計算が行われているような気がします。グラフィックはもちろんですが、CUDAなどを使ったり、AIやハッシュアルゴリズム(ビットコインのようなもの)などもGPU上で行われています。なぜCPUを捨ててGPUを単体で使うことができないのか?GPUの方がCPUより速いのは何でだろうか?
**GPUはCPUよりもはるかに多くのプロセッサコアを持っていますが、各GPUコアはCPUコアよりもかなり遅く動作し、現代のオペレーティングシステムに必要な機能を持っていないため、日常的なコンピューティングのほとんどの処理を実行するのには適していません。それらはビデオ処理および物理学のシミュレーションのような計算集中的な操作に最も適しています。技術の進歩に伴い、CPUに比べてGPUのコア数が多いことを利用して、データが何であれ、多くの並列ストリームを同時に処理できるようにGPUの計算機能を開発してきました。GPUは何百、何千ものストリームプロセッサを持つことができますが、CPUコアよりも動作が遅く、機能も少ないです(たとえ Turing complete で、CPUが実行できるプログラムを実行するようにプログラムすることができたとしても)。GPUに欠けている機能には、最新のオペレーティングシステムを実装するために必要な割り込みと仮想メモリが含まれています。GPUは、多くのストリームの大量のデータを処理し、それらに比較的簡単な操作を行うことができますが、データの単一または少数のストリームの重いまたは複雑な処理には不向きです。CPUは、コアごとに(1秒あたりの命令の点で)はるかに速く、データの単一または少数のストリーム上で複雑な操作をより簡単に実行することができますが、効率的に多くのストリームを同時に処理することはできません。さらに、GPUは根本的に異なるアーキテクチャを使用しており、動作するためにはGPU専用のアプリケーションをプログラムしなければならず、GPUをプログラムするためにはかなり異なる技術が必要となります。これらの異なる技術には、新しいプログラミング言語、既存の言語の修正、多数のストリームプロセッサで実行される並列処理として計算を表現するのに適した新しいプログラミングパラダイムなどがあります。GPU のプログラミングに必要な技術の詳細については、Wikipedia の ストリーム処理 と 並列計算 の記事を参照してください。
最新の GPU はベクトル演算や浮動小数点演算が可能で、最新のカードでは倍精度の浮動小数点数を扱うことができます。また、CUDAやOpenCLなどのフレームワークを利用してGPU用のプログラムを書くことが可能であり、その性質上、科学計算のような高度に並列化された演算に最も適しており、「NVIDIA Tesla Personal Supercomputers」(http://en.wikipedia.org/wiki/Parallel_computing)のように、一連の専用GPUコンピュートカードが小規模なコンピュートクラスタの代わりとなることもあります。Folding@homeに慣れている最新のGPUを持っている消費者は、それらを使って[GPUクライアント](http://www.nvidia.com/object/personal-supercomputing.html)を使って貢献することができ、タンパク質の折りたたみシミュレーションを非常に高速で実行し、プロジェクトに貢献することができます。また、GPUはPhysXを使ってビデオゲームでより優れた物理シミュレーションを可能にしたり、ビデオのエンコードとデコードを高速化したり、その他の計算集約的なタスクを実行したりすることができます。AMDは、従来のx86 CPUコアとGPUを組み合わせた「Accelerated Processing Unit (APU)」(http://folding.stanford.edu/English/DownloadWinOther)と呼ばれるプロセッサ設計を開発しています。このアプローチは、マザーボード統合型グラフィックスソリューション(より高価なディスクリートGPUのために一致しないが)に大幅に優れたグラフィカルなパフォーマンスを可能にし、別のGPUを必要とせずに良いマルチメディア性能を持つコンパクトな低コストのシステムを可能にします。最新のIntelプロセッサは、オンチップ統合グラフィックスも提供していますが、競争力のある統合GPU性能は、現在のところ、Intel Iris Proグラフィックスを搭載した少数のチップに限られています。テクノロジーの進歩に伴い、かつては分離されていたこれらの部品の収束がますます進んでいくことが予想されます。AMDは、CPUとGPUが1つになり、同じタスクでシームレスに一緒に働くことができる未来を想定しています。
それでも、PCのオペレーティングシステムやアプリケーションによって実行される多くのタスクは、まだCPUに適しており、GPUを使用してプログラムを加速するために多くの作業が必要です。多くの既存のソフトウェアが x86 アーキテクチャを使用しており、GPU は異なるプログラミング技術を必要とし、オペレーティングシステムに必要ないくつかの重要な機能を欠いているため、日常的なコンピューティングのために CPU から GPU への一般的な移行は非常に困難です。
GPUがCPUよりも高速なのはなぜか
GPUはCPUよりも高速ではありません。CPUとGPUは、異なるトレードオフを持つ2つの異なる目的で設計されているので、それらはdifferent**パフォーマンス特性を持っています。他の仕事が GPU で計算されるより速いが、ある特定の仕事は CPU でより速いです。CPU は小さいセットのデータに複雑な処理をすることを得意としますが、GPU は大きいセットのデータに簡単な処理をすることを得意とします。データのブロックで働くことは命令を解読することに大いに減らされたオーバーヘッドがあるので一度に単一の細胞を使用することより確かにより有効です、しかし大きいブロックで働くことはより多くの平行働く単位があることを意味します、従って単一 GPU 命令を実行するのにはるかに多くのより多くのトランジスタを使用します(物理的なサイズの制約を引き起こし、より多くのエネルギーを使用して、より多くの熱を作り出します)。1つのデータムで動作するだけなので、1つの命令を実装するのに必要なトランジスタの数ははるかに少なく、CPUはより大きな命令セット、より複雑なALU、より良い分岐予測、より良い仮想化アーキテクチャ、より洗練されたキャッシング/パイプラインスキームを持つ余裕があります。また、その命令サイクルも高速です。
我々がまだCPUを使用している理由は、x86はCPUアーキテクチャの王様であり、Windowsはx86のために書かれているため**ではありません。OSは100種類以上のデータを見て、お互いに依存した様々な判断をしなければなりませんが、このような作業は簡単には並列化できません。また、製造技術が向上し、チップが小さくなるにつれて、GPUはより複雑な命令を実装する余裕が出てくる。
GPUに欠けているもの:
最新のオペレーティングシステムのようなものを実装するためには、これらが必要です。
倍精度の演算でも(単精度の演算性能と比較して)遅く、(シリコンのサイズ的に)はるかに大きくなります。古いGPUアーキテクチャは、ほとんどの汎用プログラミングに必要な間接的な呼び出し(関数ポインタを介した)をサポートしておらず、最近のアーキテクチャでは遅いです。最後に、(他の回答者が指摘しているように)並列化できないタスクでは、GPUは同じワークロードを与えられたCPUと比較して負けます。この回答は2011年に書かれたものであることに注意してください。物事はこれを読んでいる時によって非常に異なっているかもしれません :P
* いくつかのGPUはNVidiaのQuadroまたはTeslaライン(Fermiの世代かより新しい)またはAMDのFireProライン(GCNの世代かより新しい)のような倍精度の算術で遅くない。しかし、これらはほとんどのコンシューマ機には搭載されていない。
CPU は超高速に動くワーカーのようなものです。GPU は高速に行くクローンの労働者のグループのようなものですが、すべてが一致して全く同じことをしなければなりません (あなたが望むならば、いくつかのクローンをアイドル状態で座らせることができるという例外を除いて)
どちらがあなたの仲間の開発者、1 つの超高速な男、または実際には高速ではありませんが、すべてが同時に同じアクションを実行しなければならない 100 の高速なクローンとしてむしろあなたが持っているでしょうか?
いくつかのアクションについては、クローンはかなり良いです。例えば、床を掃除 - 彼らはそれぞれがそれの一部を掃除することができます。
なぜなら、GPU は一度に多くの小さなことを行うように設計されており、CPU は一度に一つのことを行うように設計されているからです。ハッシュのように大規模な並列処理が可能な場合、GPUの方が桁違いに速く、そうでない場合はそうはなりません。GPUは同時に多くの事をするように設計されており、CPUは一度に1つの事をするように設計されていますが、非常に速いです。
問題はCPUとGPUが非常に異なった問題への非常に異なった解決策であることです、そこに少し重複がありますが、一般的に彼らのドメインにあるものは彼らのドメインにとどまります。私達は GPU との CPU を取り替えることができません、なぜなら GPU が仕事をするように設計されていないし、CPU がそうであるので、CPU がそこに座っているので、GPU は GPU ができるよりもはるかによく仕事をしています。)
あなたは本当に **なぜ我々はCPUでGPUのようなアーキテクチャを使用していないのかを尋ねていますか?私たちは、汎用CPUが並列と浮動小数点の実行にちょうど追いついていないので、GPUを非グラフィックス計算に貸しています。例えば、 Niagara プロセッサはかなりのマルチタスクです。SPARC T3 ](http://en.wikipedia.org/wiki/SPARC_T3)は512の同時スレッドを実行します。
私はここに恐ろしく間違っているかもしれないし、主題のほとんどまたは全く権限から話していますが、ここに行きます:
-私は各 GPU の実行単位(「中心」)に CPU と比較される非常に限られたアドレス空間があることを信じます。
私は GPU の実行単位があるために意味された方法が Playstation 3 の「SPEs」のような何かであると常に考えました、データのブロックを与えられ、それの連続的な操作のいくつかを実行し、そしてデータの別のブロック、リンス、繰り返しを吐き出したいと思います。それらは、メインの「CPE」ほど多くのアドレス指定可能なメモリを持っていないが、アイデアは、各「SPE」を特定のシーケンシャルなタスクに割り当てることである。また、1つのユニットの出力は、別のユニットの入力を供給するかもしれません。
実行ユニットは、データを “分析 "し、そのデータが何であるかに基づいて多くの決定をしようとしている場合、うまく動作しません。
これらの「データのブロック」は、ゲームのステートテーブルからの頂点のリスト、ディスクからのMPEGデータなど、ストリームの一部になる可能性があります。良い例はキーボード、ジョイスティック、またはネットワーク入力のような「外的なでき事」に基づいた事を処理しています。このモデルに当てはまらないものは多くはないが、常にいくつかあるだろう。
これは、クロックの速度や目的に関係ありません。しかし、いくつかのタスクは他のタスクに少し適しています。
ダムコアをたくさん持っているか、または非常にスマートなコアの小さなグループを持っている方が良いかどうかについては、非常に古い議論がありました。これは、80年代に簡単にさかのぼります。よりスマートなコアは、同時に多くの異なる計算を実行することができます (マルチコアのようなものですが、複雑です; Instruction-level parallelism を参照してください)。スマートコアは、いくつかの計算(加算、減算、乗算、除算、メモリ操作)を同時に行うことができますが、一度に1つの計算しかできません; このため、ダンバーコアよりも物理的に大きく(したがって、はるかに高価です)なります。
マルチコアアーキテクチャは、数百個のコアで簡単に計算を分割することができるので、グラフィックスとの相性が良いのですが、コードの品質や、他のコードが一つの計算結果に依存しているかどうかにも依存します。詳細については、CPU設計についてのこの記事を読んでください:
現代のマイクロプロセッサ - 90分ガイド
私は1つの構文的なポイントを論じたいと思います。CPUとGPUという用語は、アーキテクチャ上の名前ではなく、機能的な名前である。
もしコンピュータがGPUをメインプロセッサとして使うならば、アーキテクチャやデザインに関係なく「中央処理装置」(CPU)になるだろう。
アーキテクチャ空間には、あるプロセッサを「中心」とし、別のプロセッサを「グラフィックス」とする魔法のような境界線は存在しないということを念頭に置いておくことが重要です(まあ、一部の GPU はあまりにも一般的なものではないかもしれませんが、それらはここで話しているものではありません)。(まあ、GPUの中には、完全に汎用的とは言えないような障害を持ったものもあるかもしれませんが、ここで話しているのはそういうものではありません。)
その区別は、それらがどのようにボード上にインストールされ、どのようなタスクが与えられているか、ということです。もちろん、メインのデータムーバーには汎用プロセッサ(または汎用プロセッサのセット)を使用し、物事(グラフィックスのようなもの)のための特別な、並列化された、深いパイプ状のユニットを使用して、それらを最大限に活用することができます。WordやExcel、Netscapeなど、人々がコンピュータを使っている多くのものは、グラフィックスに特化したチップが提供する機能をフルに活用していないだけでなく、それらのアーキテクチャ上でslowerを実行していることが判明しました。
私たちがいまだにCPUを使っているのは、CPUとGPUの両方に独自の利点があるからです。ACM Computing Surveys 2015に受理された私の以下の論文を参照してください。"CPU vs GPUの議論 “から "CPUとGPUの協調コンピューティング "へと移行するための決定的かつ包括的な議論を提供しています。 A Survey of CPU-GPU Heterogeneous Computing Techniques
cpus もストリーム処理機能を持っていますが (SIMD 拡張と呼ばれています)、すべてのプログラミングロジックをストリーム処理として実装することはできませんし、コンパイラは可能な限り SIMD 命令を利用した btyecode を作成するオプションを持っています。欠点としては、ゲームではすべてを gpus にオフロードすることができないということですが、それはスタッタを発生させるからです。
簡単に言えば、GPUは車の中のトレーラーに例えられる。大抵の人はトランクで十分なので、大きなものを買った場合を除いては、トレーラーが必要になります。その場合はトレーラーが必要になる。GPUも同じで、通常は普通のCPUがあれば大抵のタスクをこなすことができる。しかし、多くのスレッドでの集中的な計算が必要な場合は、GPUが必要になります。