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