最近のGPUでは多くの計算が行われているようです。明らかにグラフィックはそこで行われますが、CUDAなどを使用して、AI、ハッシュアルゴリズム(ビットコインだと思います)などもGPUで行われます。どうして私たちはCPUを取り除き、GPUを単独で使うことができないのでしょうか。 GPUがCPUよりはるかに速いのはなぜですか?
TL; DR回答:GPUはCPUよりもはるかに多くのプロセッサコアを備えていますが、各GPUコアはCPUコアよりもかなり低速で動作し、最新のオペレーティングシステムに必要な機能を備えていません。日常のコンピューティングでほとんどの処理を実行するのには適していません。ビデオ処理や物理シミュレーションなどの計算集約型の操作に最も適しています。
GPGPU は、まだ比較的新しい概念です。 GPUは当初、グラフィックのみをレンダリングするために使用されていました。技術の進歩に伴い、CPUと比較してGPUに含まれる多数のコアは、GPUが大量の並列データストリームを同時に処理できるようにGPUの計算機能を開発することによって悪用されました。 GPUは何百、何千ものストリームプロセッサを持つことができますが、それらはそれぞれCPUコアよりも遅く動作し、機能は少なくなります(たとえ Turing complete であってもCPUが実行できる任意のプログラムを実行します。 GPUに欠けている機能には、最新のオペレーティングシステムを実装するために必要な割り込みと仮想メモリがあります。
言い換えれば、CPUとGPUは、それぞれ異なるタスクにより適しているという点で、アーキテクチャが大きく異なっています。 GPUは多くのストリームで大量のデータを処理し、それらに対して比較的単純な操作を実行できますが、単一または少数のデータストリームに対する大量または複雑な処理には不向きです。 CPUは(1秒あたりの命令数で)コア単位ではるかに高速であり、1つまたは少数のデータストリームに対して複雑な操作をより簡単に実行できますが、同時に多数のストリームを効率的に処理することはできません。
結果として、GPUは、ワープロなどの一般的な多くの一般消費者向けアプリケーションを含む、あまり恩恵を受けない、または並列化できないタスクの処理には適していません。さらに、GPUは根本的に異なるアーキテクチャを使用しています。 GPUを機能させるには、GPU専用のアプリケーションをプログラムする必要があります。また、GPUをプログラムするには、大幅に異なる手法が必要です。これらの異なる技法には、新しいプログラミング言語、既存の言語への変更、および多くのストリームプロセッサによって実行される並列処理として計算を表現するのにより適した新しいプログラミングパラダイムが含まれます。 GPUのプログラミングに必要な技術の詳細については、 ストリーム処理 および parallel computing に関するWikipediaの記事を参照してください。
最新のGPUは、倍精度浮動小数点数を操作できる最新のカードを使用して、ベクトル演算と浮動小数点演算を実行できます。 CUDAやOpenCLのようなフレームワークはGPUのためにプログラムを書くことを可能にします、そしてGPUの性質は科学的計算のような非常に並列化可能な操作に最も適しています。 NVIDIA Tesla Personal Supercomputers のようにクラスターを計算します。 Folding @ homeを経験している現代のGPUを持つ消費者は、それらを使って GPUクライアント に貢献でき、非常に高速でタンパク質のフォールディングシミュレーションを実行できます。プロジェクト(最初に FAQ 、特にGPUに関連するものを必ず読んでください)。また、GPUを使用すると、PhysXを使用してビデオゲームの物理シミュレーションを向上させたり、ビデオのエンコードとデコードを高速化したり、計算を多用するタスクを実行したりすることもできます。 GPUが実行に最も適しているのは、この種のタスクです。
AMDは、従来のx86 CPUコアとGPUを組み合わせた Accelerated Processing Unit(APU) というプロセッサ設計の先駆者です。このアプローチはマザーボードに統合されたグラフィックスソリューションよりもはるかに優れたグラフィックパフォーマンスを可能にし(より高価なディスクリートGPUには不向きですが)、別のGPUを必要とせずに優れたマルチメディアパフォーマンスを備えたコンパクトで低コストのシステムを可能にします。最新のIntelプロセッサもオンチップの統合グラフィックスを提供していますが、競争力のある統合GPUパフォーマンスは現在Intel Iris Proグラフィックスを搭載した数チップに制限されています。技術が進歩し続けるにつれて、私たちはこれらのかつて別々の部分のますます集中する度合いを見るでしょう。 AMDは CPUとGPUが1つであり、同じタスクでシームレスに連携することができる未来を想定しています 。
それにもかかわらず、PCのオペレーティングシステムやアプリケーションによって実行される多くのタスクはまだCPUに適しており、GPUを使用してプログラムを高速化するために多くの作業が必要です。非常に多くの既存のソフトウェアがx86アーキテクチャを使用し、GPUは異なるプログラミング技術を必要とし、オペレーティングシステムに必要ないくつかの重要な機能を欠いているので、日常のコンピューティングのためのCPUからGPUへの一般的な移行は非常に困難です。
GPUがCPUよりはるかに速いのはなぜですか?
GPUはCPUよりもnotです。 CPUとGPUは、異なるトレードオフを持つ2つの異なる目標を持って設計されているため、differentの性能特性を持ちます。特定のタスクはCPU内で高速ですが、他のタスクはGPU内で高速に計算されます。 CPUは小さなデータセットに対して複雑な操作を行うのに優れていますが、GPUは大きなデータセットに対して単純な操作を行うのに優れています。
GPUは、単一の命令が大きなデータブロック(SIMD /単一命令複数データ)に対して機能するように設計された特殊用途のCPUで、それらすべてが同じ操作を適用します。データのブロックで作業することは、命令をデコードする際のオーバーヘッドが大幅に減少するため、一度に1つのセルで作業することよりも確かに効率的です。単一のGPU命令を実装する(物理サイズの制約を引き起こし、より多くのエネルギーを使用し、より多くの熱を発生させる)。
CPUは、1つのデータに対して1つの命令をできるだけ早く実行するように設計されています。 1つのデータを処理するだけでよいため、1つの命令を実装するのに必要なトランジスタの数ははるかに少なく、CPUはより大きな命令セット、より複雑なALU、より優れた分岐予測、より優れた仮想化を実現できます。アーキテクチャ、およびより洗練されたキャッシング/パイプライン方式。その命令サイクルも高速です。
私たちがまだCPUを使っているのはnotです。なぜならx86はCPUアーキテクチャの王者で、Windowsはx86用に書かれているからです。 OSがやらなければならない、つまり決定を下すようなタスクは、CPUアーキテクチャ上でより効率的に実行されます。 OSは、何百もの異なる種類のデータを調べて、すべて互いに依存するさまざまな決定を下す必要があります。この種の仕事は、少なくともSIMDアーキテクチャーではなく、容易に並列化できません。
将来的には、CPUがデータブロックを処理する機能を獲得するにつれて、CPUとGPUアーキテクチャの間の収束が見られるでしょう。 SSEまた、製造技術の向上とチップの小型化に伴い、GPUはより複雑な命令を実装する余裕があります。
GPUが不足している:
最新のオペレーティングシステムのようなものを実装するには、これらが必要です。
それらはまた、(比較的)倍精度演算が遅い(単精度演算性能と比較して)*、はるかに大きい(シリコンのサイズの点で)。古いGPUアーキテクチャーは、ほとんどの汎用プログラミングに必要な(関数ポインターを介した)間接呼び出し、およびそれをゆっくり行う最近のアーキテクチャーをサポートしていません。最後に、(他の回答が指摘したように)並列化できないタスクについては、GPUは同じワークロードを与えられたCPUと比較して失います。
EDIT:この回答は2011年に書かれたものです - GPU技術は絶えず変化する分野です。これを読んでいる時期によって状況が大きく異なる可能性があります。P
* NVidiaのQuadroやTeslaライン(Fermi世代以降)、あるいはAMDのFireProライン(GCN世代以降)など、一部のGPUは倍精度演算を遅くしません。しかし、これらはほとんどの消費者のマシンにはありません。
CPUは超高速になるワーカーのようなものです。 GPUは、高速に動作するクローンワーカーのグループのようなものですが、すべて同じ作業を一斉に行う必要があります(ただし、必要に応じて一部のクローンをアイドル状態にしておくことができます)。
あなたはどちらがあなたの仲間の開発者、1人の超高速男、または実際にはそれほど速くない100人の高速クローンとして持っているほうがよいでしょうが、すべてが同じアクションを同時に実行しなければなりませんか?
いくつかのアクションでは、クローンはかなり良いです。床を掃除する - 彼らはそれぞれそれの一部を掃除することができます。
いくつかのアクションでは、クローンは臭いがします。毎週のレポートを書く - 1つのクローンを除いてすべてのクローンがアイドル状態になります(1つのクローンがレポートを書く間、そうでなければあなたはちょうど同じレポートの100コピーを得る)。
GPUは一度にたくさんの小さなことを実行するように設計されており、CPUは一度に1つのことを実行するように設計されているからです。ハッシングのようにあなたのプロセスを超並列にすることができれば、GPUは桁違いに速くなります、そうでなければそうではありません。
あなたのCPUはあなたのGPUができるよりはるかに速く、はるかに速くハッシュを計算することができます - しかしあなたのCPUがそれをするのにかかる時間に、あなたのGPUは数百のハッシュの一部をやり遂げることができます。 GPUは多くのことを同時に行うように設計されています。CPUは一度に1つのことを行うように設計されていますが、非常に高速です。
問題は、CPUとGPUは非常に異なる問題に対する非常に異なる解決策であるということです。少しのオーバーラップがありますが、一般的に彼らのドメインにあるものは彼らのドメインに留まります。単にCPUが仕事をするように設計されていない、そしてCPUがそうであるという理由だけで、CPUはそこに座ってGPUよりもずっとよく仕事をしているので、CPUをGPUに置き換えることはできません。
ちなみに、CPUをスクラップしてGPUだけを持つことが可能だった場合は、名前を変更したいと思いませんか。 :)
私はここでひどく誤解されているかもしれず、そしてこの問題についてほとんどまたは全く権威から語っていませんが、ここに行きます:
各GPU実行ユニット( "コア")は、CPUと比べてアドレススペースが非常に限られていると思います。
GPU実行ユニットは分岐を効率的に処理できません。
GPU実行ユニットは、CPUと同じようにハードウェア割り込みをサポートしません。
私はいつもGPU実行ユニットがPlayStation 3の「SPE」のようなものであることを意図していたと考えていました、彼らはデータのブロックを与えられ、それに対していくつかの順次操作を実行し、そしてデータ、すすぎ、繰り返します。それらはメインの "CPE"ほど多くのアドレス可能なメモリを持っていません、しかし考えはそれぞれの "SPE"を特定の連続したタスクに捧げることです。あるユニットの出力が別のユニットの入力に供給される可能性があります。
実行ユニットは、データを「分析」し、そのデータが何であるかに基づいて多数の決定を下そうとしている場合はうまくいきません。
これらの「データのブロック」は、ゲームの状態テーブルからの頂点のリスト、ディスクからのMPEGデータなど、ストリームの一部になることができます。
何かがこの「ストリーミング」モデルに合わないならば、あなたは効率的に並列化することができないタスクを持っています、そして、GPUはそれのための必ずしも最善の解決策ではありません。良い例は、キーボード、ジョイスティック、ネットワーク入力などの「外部イベント」ベースの処理です。そのモデルに合わないものはそれほど多くありませんが、常にいくつかあるでしょう。
これは何もしないクロック速度や目的についてはありません。それらは両方とも、すべてではないにしても、ほとんどのタスクを等しく完了することができます。ただし、いくつかのタスクよりも若干適しているものもあります。
たくさんのダムコアを使うのが良いのか、あるいは非常にスマートなコアの小さなグループを持つのが良いのかについて、とても古い議論がありました。これは簡単に80年代に遡ります。
CPUの内部には、実行可能な計算が多数あります。よりスマートなコアは同時に多くの異なる計算を実行することができます(マルチコアのようなものではありませんが、複雑です。 を参照してください。命令レベルの並列処理 )。スマートコアは同時に複数の計算(加算、減算、乗算、除算、メモリ操作)を実行できますが、一度に1つだけです。このため、それらは物理的に大きく(したがって、はるかに高価になります)コアを浪費します。
ダムコアははるかに小さいため、1つのチップに追加することはできますが、それほど多くの同時計算を実行することはできません。多くのダムコアといくつかのスマートコアの間にはバランスが取れています。
計算は何百ものコアに簡単に分割できるため、マルチコアアーキテクチャはグラフィックとうまく機能しますが、コードの品質や他のコードが1つの計算の結果に依存しているかどうかによっても異なります。
これは見かけよりもずっと複雑な質問です。詳細については、CPU設計に関するこの記事を読んでください。
現代のマイクロプロセッサ - 90分ガイド
1つの構文上の要点を簡単に説明します。CPUおよびGPUという用語は、アーキテクチャ名ではなく機能名です。
コンピュータがメインプロセッサとしてGPUを使用すると、アーキテクチャや設計に関係なく、そのコンピュータは「中央処理装置」(CPU)になります。
アーキテクチャー空間には、1つのプロセッサーを「中央」のものにし、もう1つを「グラフィック」のものにする魔法のような境界線がないことに留意することが重要です。 (さて、いくつかのGPUは完全に一般的にするには不自由すぎるかもしれませんが、それらは私たちがここで話しているものではありません。)
違いは、それらがボードにどのようにインストールされているか、そしてどのようなタスクが彼らに与えられているかということです。もちろん、メインのデータムーバーには汎用プロセッサ(または汎用プロセッサのセット)を使用し、それらを最大限に活用できるようにするために(グラフィックなど)特殊な並列化された深いパイプラインのユニットを使用します。
GPUを非常に高速にするために使用されてきた巧妙なトリックのほとんどは、より速くより良いCPUを製造しようとする人々によって最初に開発されました。その結果、WordやExcel、Netscapeなど、人々がコンピュータを使用するために使用している他の多くのものは、グラフィック専用チップが提供する機能を十分に利用できないだけでなく、それらに対してslowerを実行することもできます。なぜなら、ブランチは多くの場合(非常に高価で遅い)パイプラインのクリアを引き起こすからです。
単純な理由で、ほとんどのアプリケーションはマルチスレッド/ベクトル化されていません。
グラフィックカードは、少なくとも概念的には、マルチスレッドに大きく依存しています。
1台のエンジンを搭載した車と、1輪あたり1台の小さなエンジンを搭載した車を比較してください。後者の車では、システムプログラミングの観点からは考慮されていない、すべてのエンジンに命令する必要があります。
しかし、AMDの融合では、処理能力をどのように利用する必要があるかが変わります。ベクトル化されているか、1スレッドで速いかのどちらかです。
GPUが存在することの全体的な目的は、その時点で行っていた高価なグラフィック計算からCPUを解放することでした。
それらを再び1つのプロセッサに組み合わせることで、すべてが始まった場所に戻ることになります。
まだCPUを使用しているのは、CPUとGPUの両方に独自の利点があるためです。 ACM Computing Surveys 2015に掲載されている私の次の論文を参照してください。この記事では、「CPUとGPUの討論」から「CPU-GPUコラボレーティブコンピューティング」への移行に関する決定的かつ包括的な説明を提供します。
gpusは良いストリームプロセッサです。ストリーム処理は、長い数の配列を順次乗算することと考えることができます。 cpusにはストリーム処理機能(SIMD拡張機能と呼ばれる)もありますが、すべてのプログラミングロジックをストリーム処理として実装することはできません。また、コンパイラには、可能な限りsimd命令を使用するbtyecodeを作成するオプションがあります。
すべてが数値の配列ではありません。写真やビデオも、おそらく音がします(あちこちにopenclエンコーダがあります)。そのため、gpusは、写真、ビデオなどの処理、エンコード、デコードを行うことができます。 1つの欠点は、ゲームでgpusにすべてをオフロードできないことです。Gpusはグラフィックで忙しく、ゲームをプレイするときにシステムのボトルネックになると考えられているからです。最適な解決策は、PC内のすべてのコンポーネントを完全に活用することです。そのため、たとえば、nvidiaのphysxエンジンは、デフォルトで、gpuが完全に利用されたときにcpuで計算を行います。
簡単に言えばGPUは車の中でトレーラーと比較することができます。彼らが本当に大きいものを買う場合を除いて、通常トランクは大部分の人々にとって十分です。それから彼らはトレーラーを必要とすることができます。 GPUと同じですが、通常は大部分のタスクを実行する通常のCPUを使用するだけで十分です。しかし、多くのスレッドで集中的な計算が必要な場合は、GPUが必要です。