なんでまだGPUじゃなくてCPUを使ってるの?

cpu cuda gpgpu gpu

最近では、多くの計算がGPU上で行われているように思います。明らかにグラフィックスはそこで行われているが、CUDAなどを使ったり、AIやハッシュアルゴリズム(ビットコインを考える)などもGPU上で行われている。なぜCPUを捨ててGPUを単体で使うことができないのか?GPUの方がCPUより速いのは何でだろうか?

  388  ell  2011-07-10


ベストアンサー

TL;DRの答え。GPUはCPUよりもはるかに多くのプロセッサコアを持っていますが、各GPUコアはCPUコアよりもかなり遅く動作し、現代のオペレーティングシステムに必要な機能を持っていないため、日常のコンピューティングでほとんどの処理を実行するのには適していません。GPUは、ビデオ処理や物理シミュレーションなどの計算量の多い処理に最も適しています


GPGPUは、まだ比較的新しい概念です。技術の進歩に伴い、CPUに比べてGPUのコア数が多いことが利用されるようになり、データがどのようなものであっても、多くの並列ストリームを同時に処理できるようにGPUの計算機能が開発されました。GPUは何百、何千ものストリームプロセッサを持つことができますが、CPUコアよりも動作が遅く、機能も少ないです(チューリング完全版で、CPUが実行できるプログラムを実行するようにプログラムすることができたとしても)。GPUに欠けている機能には、最新のオペレーティングシステムを実装するために必要な割り込みと仮想メモリが含まれています

言い換えれば、CPUとGPUはアーキテクチャが大きく異なるため、それぞれのタスクに適しています。GPUは、多数のストリームで大量のデータを処理し、それらに対して比較的単純な処理を行うことができますが、単一または少数のストリームのデータに対して重い処理や複雑な処理を行うのには適していません。CPUは、コア単位(1秒あたりの命令数)でははるかに高速で、単一または少数のデータストリームに対して複雑な処理をより簡単に実行できますが、効率的に多くのストリームを同時に処理することはできません

その結果、ワードプロセッサのような多くの一般的なコンシューマアプリケーションを含む、並列化の恩恵をあまり受けない、あるいは並列化できないタスクの処理にはGPUは適していません。さらに、GPU は根本的に異なるアーキテクチャを使用しており、動作するためには GPU 専用のアプリケーションをプログラムしなければならず、GPU をプログラムするためには大幅に異なる技術が必要となります。これらの異なる技術には、新しいプログラミング言語、既存の言語の修正、多数のストリームプロセッサで実行される並列処理として計算を表現するのに適した新しいプログラミングパラダイムなどがあります。GPU のプログラミングに必要な技術の詳細については、ストリーム処理並列計算 の Wikipedia の記事を参照してください

最新の GPU はベクトル演算や浮動小数点演算が可能で、最新のカードでは倍精度の浮動小数点数を操作することができます。CUDA や OpenCL などのフレームワークにより、GPU 用のプログラムを書くことができます。また、GPU の性質上、NVIDIA Tesla Personal Supercomputersのように、一連の特殊な GPU コンピュートカードが小規模なコンピュートクラスタの代わりとなり得るような科学的コンピューティングのような、高度に並列化可能な処理に最も適しています。Folding@home を使いこなしている最新の GPU を持つ消費者は、GPU クライアントを使って貢献することができ、タンパク質の折りたたみシミュレーションを非常に高速に実行でき、プロジェクトに貢献することができます (よくある質問、特に GPU に関連する質問を最初に読んでください)。また、GPUはPhysXを使ってビデオゲームでより良い物理シミュレーションを可能にしたり、ビデオのエンコードとデコードを高速化したり、その他の計算集約的なタスクを実行したりすることができます。GPU が最も適しているのは、このようなタイプのタスクです

AMD は、従来の x86 CPU コアと GPU を組み合わせた Accelerated Processing Unit (APU) と呼ばれるプロセッサ設計のパイオニアです。このアプローチにより、マザーボードに統合されたグラフィック ソリューションよりもはるかに優れたグラフィック性能を実現し (より高価なディスクリート GPU には敵いませんが)、別個の GPU を必要とせずに、コンパクトで低コストのシステムで優れたマルチメディア性能を発揮します。最新のIntelプロセッサは、オンチップ統合グラフィックスも提供していますが、競争力のある統合GPU性能は、現在のところ、Intel Iris Proグラフィックスを搭載した少数のチップに限られています。技術の進歩が進むにつれ、かつては分離していたこれらの部品の収束の度合いが増していくことが予想されます。AMDは、CPUとGPUが一体となり、同じタスクでシームレスに連携できる未来を想定しています

それにもかかわらず、PC のオペレーティングシステムやアプリケーションで実行される多くのタスクは CPU に適しており、GPU を使用してプログラムを高速化するには多くの作業が必要となります。既存のソフトウェアの多くが x86 アーキテクチャを使用しており、GPU は異なるプログラミング技術を必要とし、オペレーティングシステムに必要ないくつかの重要な機能を欠いているため、日常的なコンピューティングのために CPU から GPU への一般的な移行は非常に困難です

401  bwDraco  2011-07-10


GPUがCPUより速いのは何でだろう?

GPUはCPUより速いわけではありません。CPUとGPUは2つの異なる目標を持って設計されており、トレードオフが異なるため、性能特性が異なる。特定のタスクはCPUの方が速く、他のタスクはGPUの方が速く計算されます。CPUは小さなデータセットに対する複雑な操作を得意とし、GPUは大きなデータセットに対する単純な操作を得意としています

GPU は特別な目的の CPU であり、1 つの命令が大規模なデータブロック(SIMD/Single Instruction Multiple Data)上で動作するように設計されており、すべての命令が同じ操作を適用するようになっています。データのブロックで作業することは、命令をデコードする際のオーバーヘッドが大幅に削減されるため、一度に単一のセルで作業するよりも確かに効率的ですが、大きなブロックで作業することは、より多くの並列作業ユニットがあることを意味するため、単一のGPU命令を実装するためには、より多くのトランジスタを使用します(物理的なサイズの制約を引き起こし、より多くのエネルギーを使用し、より多くの熱を発生させます)

CPUは、1つのデータム上で1つの命令をできるだけ早く実行するように設計されています。1つのデータムで動作するだけなので、1つの命令を実装するのに必要なトランジスタ数ははるかに少なくて済むので、CPUはより大きな命令セット、より複雑なALU、より優れた分岐予測、より優れた仮想化アーキテクチャ、およびより洗練されたキャッシング/パイプラインスキームを持つ余裕があります。また、命令サイクルも高速化されています

私たちがいまだにCPUを使っている理由は、x86がCPUアーキテクチャの王様であり、Windowsはx86用に書かれているからではありません。OSは何百種類ものデータを見て様々な判断をしなければなりませんが、それらはすべて互いに依存しています

将来的には、CPUがSSEのようなデータブロック上で動作する能力を獲得することで、CPUとGPUのアーキテクチャが収束していくことが予想されます。また、製造技術が向上し、チップが小さくなるにつれて、GPUはより複雑な命令を実装する余裕が出てきます

258  Lie Ryan  2011-07-10


GPUs lack:

  1. 仮想メモリ(!?
  2. メモリ以外のデバイス(キーボード、プリンタ、二次記憶装置など)をアドレス指定する手段
  3. Interrupts

最新のオペレーティングシステムのように何でも実装できるようにするには、これらが必要です

また、(単精度演算性能と比較した場合)倍精度演算では(相対的に)遅く、(シリコンのサイズ的に)はるかに大きくなります。古い GPU アーキテクチャは、ほとんどの汎用プログラミングに必要な(関数ポインタを介した)間接的な呼び出しをサポートしておらず、最近のアーキテクチャでは遅くなります。最後に、(他の回答者が指摘しているように)並列化できないタスクでは、GPUは同じ作業量でCPUと比較して負けます

EDIT: この回答は2011年に書かれたものであることに注意してください — GPU技術は常に変化している分野です。あなたがこれを読んでいる時によって、物事は大きく異なる可能性があります 😛

* NVidiaのQuadroやTeslaライン(Fermi世代以降)やAMDのFireProライン(GCN世代以降)のように、倍精度演算では遅くないGPUもあります。しかし、これらはほとんどのコンシューマ機には搭載されていない

77  Billy ONeal  2011-07-10


CPU は超高速に動作するワーカーのようなものです。GPU は、高速に動作するクローンワーカーのグループのようなものですが、すべてのクローンは全く同じことを同時に行わなければなりません (例外として、必要に応じていくつかのクローンをアイドル状態にしておくことができます)

開発者仲間として、1人の超高速な男と、実際にはそれほど高速ではないが、全員が同時に同じ動作をしなければならない100個の高速なクローンと、どちらがいいでしょうか?

いくつかのアクションでは、クローンはかなり良い例としては、床を掃除する – 彼らはそれぞれがそれの一部を掃除することができます

いくつかのアクションでは、クローンが悪臭を放ちます。例えば、週報を書く – 1つのクローンがレポートを書く間、1つのクローン以外のすべてのクローンがアイドル状態で座っています(そうでなければ、同じレポートのコピーを100枚取得するだけです)

39  John Robertson  2011-07-11


なぜなら、GPUは一度に多くの小さなことを行うように設計されており、CPUは一度に一つのことを行うように設計されているからです。ハッシュのように大量並列化できる処理であればGPUの方が桁違いに速く、そうでなければそうはなりません

CPUはGPUよりもはるかに高速にハッシュを計算することができますが、CPUがハッシュを計算するのにかかる時間は、GPUは数百のハッシュの一部を処理している可能性があります。GPUは同時に多くのことを行うように設計されており、CPUは一度に一つのことを行うように設計されていますが、非常に高速です

問題は、CPUとGPUは非常に異なる問題に対する非常に異なるソリューションであり、多少の重複はあるものの、一般的にはそれぞれの領域にあるものはそれぞれの領域に留まるということです。CPUはGPUよりもはるかに優れた仕事をしているので、CPUをGPUに置き換えることはできません

余談だが、CPUをスクラップしてGPUだけにすることが可能だったら名前を変えるんじゃないかな? 🙂

24  Phoshi  2011-07-10


なぜCPUにGPUのようなアーキテクチャを使わないのかと本気で聞いているのか?

GPUはグラフィックスカードの専用CPUに過ぎません。汎用CPUでは並列処理や浮動小数点演算ができないため、GPUをグラフィックス以外の計算に使用しています

実際には異なる(よりGPU的な)CPUアーキテクチャを使用しています。例えば、ナイアガラプロセッサはかなりのマルチタスクです。SPARC T3は512個のスレッドを同時に実行します

15  jkj  2011-07-10


私の勘違いかもしれませんが、この件に関してはほとんど何の権威もないのですが、以下にご紹介します

  • GPUの各実行ユニット(「コア」)は、CPUに比べてアドレス空間が非常に限られていると思います

  • GPUの実行ユニットは分岐を効率よく処理できない

  • GPU実行ユニットはCPUと同じようにハードウェア割り込みをサポートしていません

GPU の実行ユニットは Playstation 3 の「SPE」のようなものだと思っていましたが、データのブロックを与えられ、その上でいくつかのシーケンシャルな操作を実行して、別のブロックのデータを吐き出し、リンスを繰り返します。それらは、メインの「CPE」ほど多くのアドレス指定可能なメモリを持っていないが、アイデアは、各「SPE」を特定のシーケンシャルなタスクに割り当てることである。1つのユニットの出力は、別のユニットの入力を供給することができます

そのデータが何なのかを「分析」して、そのデータを元にして何かを決めようとしているのでは、実行部隊はうまく機能しません

これらの「データのブロック」は、ゲームのステートテーブルからの頂点のリスト、ディスクからのMPEGデータなど、ストリームの一部になります

何かがこの「ストリーミング」モデルに適合しない場合、効率的にパラレル化できないタスクがあり、GPUがそれに最適な解決策であるとは限りません。良い例としては、キーボード、ジョイスティック、またはネットワーク入力のような「外部イベント」ベースの処理があります。このモデルに当てはまらないものは多くはないが、常にいくつかあるだろう

12  LawrenceC  2011-07-10


これは、クロックの速度や目的に関するものではありません。どちらも、すべてのタスクではないにしても、ほとんどのタスクを完了させることができます

ダムコアをたくさん持っている方がいいのか、それとも非常にスマートなコアの小さなグループを持っている方がいいのかということについては、非常に古い議論がありました。これは簡単に80年代にさかのぼります

CPU の内部では、多くの計算が可能です。よりスマートなコアは、多くの異なる計算を同時に実行することができます(マルチコアのようなものですが、そうではありません。スマートコアは、複数の計算(加算、減算、乗算、除算、メモリ操作)を同時に行うことができますが、一度に1つの計算しかできません

ダムコアの方がはるかに小さいので、1つのチップに追加できる数は多いですが、同時計算はあまりできません。多くのダムコアと少数のスマートコアの間には、絶妙なバランスがあります

マルチコアアーキテクチャは、何百コアにも及ぶ計算を簡単に分割できるため、グラフィックスではうまく機能しますが、コードの品質や、他のコードが1つの計算結果に依存しているかどうかにも左右されます

これは、見た目よりもずっと複雑な問題です。詳細については、CPU設計についてのこの記事を読んでください

現代のマイクロプロセッサ – 90分でわかるガイド

Modern Microprocessors - A 90-Minute Guide!
A brief, pulls-no-punches, fast-paced introduction to the main design aspects of modern processor microarchitecture.

7  Silverfire  2011-07-12


私は、一つの構文的なポイントをお話ししたいと思います。CPUとGPUという用語は、アーキテクチャ名ではなく機能名である

もしコンピュータがGPUをメインプロセッサとして使うとしたら、アーキテクチャやデザインに関係なく「中央処理装置」(CPU)になってしまう

6  Andrew Neely  2011-07-15


アーキテクチャ空間には、あるプロセッサを「中心」とし、別のプロセッサを「グラフィックス」とする魔法のような境界線は存在しないことを心に留めておくことが重要です。(まあ、GPUの中には完全に一般化するにはあまりにも不自由なものもあるかもしれませんが、ここで話しているのはそういうものではありません)

違いは、それらがどのようにボード上にインストールされ、どのようなタスクが与えられているかという点にあります。もちろん、メインのデータムーバーには汎用プロセッサ(または汎用プロセッサのセット)を使用し、グラフィックスのようなものには特別な並列化された深いパイプのあるユニットを使用して、それらを最大限に活用することができるようにしています

GPU を非常に高速に動作させるために使用されてきた気の利いたトリックのほとんどは、より速く、より良い CPU を作ろうとする人々によって最初に開発されました。WordやExcel、Netscapeなど、人々がコンピュータを使っている多くのものは、グラフィックスに特化したチップが提供する機能をフルに活用していないだけでなく、(非常に高価で遅い)パイプラインのクリアを分岐するために、それらのアーキテクチャ上では動作が遅くなっていることが判明しました

5  dmckee — ex-moderator kitten  2011-07-10


GPUが存在していた全体のポイントは、当時CPUが行っていた高価なグラフィックス計算からCPUを解放することでした。 それらを再び単一のプロセッサに組み合わせることで、すべての始まりの場所に戻ることになるだろう

3  Petruza  2011-07-10


理由は簡単で、ほとんどのアプリケーションはマルチスレッド化/ベクトル化されていません

グラフィックカードは、少なくともコンセプト上、マルチスレッドに大きく依存しています

単一のエンジンを搭載した車と、ホイールごとに1つの小さなエンジンを搭載した車を比較してみてください。後者の車では、すべてのエンジンをコマンドする必要があります、何かは、ビューのシステムプログラミングの観点から考慮されていませんでした

しかし、AMDのフュージョンでは、処理能力を利用する必要がある方法が変わってきます

3  jokoon  2011-07-17


私たちがいまだにCPUを使っているのは、CPUとGPUの両方に独自の利点があるからです。ACM Computing Surveys 2015に受理された私の以下の論文を参照してください。この論文は、「CPU vs GPUの議論」から「CPUとGPUの協調コンピューティング」へと移行するための決定的かつ包括的な議論を提供しています

CPUとGPUのヘテロジニアスコンピューティング技術に関する調査

3  user984260  2015-06-07


簡単に言えば、GPUは車の中のトレーラーに例えられる。大抵の人はトランクで十分なので、大きなものを買った場合を除いては、トレーラーが必要になります。その場合はトレーラーが必要になる。GPUも同じで、通常は普通のCPUがあれば大抵のタスクをこなすことができる。しかし、多くのスレッドでの集中的な計算が必要な場合は、GPUが必要になることがあります

2  Yuriy Zaletskyy  2015-11-16


cpusもストリーム処理機能を持っていますが(SIMD拡張と呼ばれています)、すべてのプログラミングロジックをストリーム処理として実装することはできず、コンパイラは可能な限りSIMD命令を利用するbtyecodeを作成するオプションを持っています

画像やビデオはそうですし、音もそうでしょう(あちこちに opencl エンコーダーがあります)。欠点としては、ゲーム中にすべてを gpus にオフロードすることができないということが挙げられます

2  Uğur Gümüşhan  2016-07-01


タイトルとURLをコピーしました