CPUではなくGPUに作業をオフロードする必要があるのはいつですか?


15

OpenCLなどの新しいシステムは、グラフィックプロセッサでより多くのコードを実行できるように作成されています。これは、システムで可能な限り多くのパワーを利用できるようにする必要があるためです。

ただし、これらすべての新しいシステムでは、あらゆる点でGPUがCPUよりも優れているようです。GPUは並列計算を実行できるため、マルチコアGPUは実際にはマルチコアCPUよりもはるかに優れているように見えます。一度に多くの計算を行うことができ、本当に速度が向上します。シリアル処理がパラレルよりも優れ、高速、かつ/または効率的である特定のケースがまだありますか?



6
ハードウェアに関する質問ではありません。「GPUのプログラミングよりもCPUのプログラミングが優れているのはいつ」と言い換えるべきであり、それはかなり良いP.SE質問IMOです。SOで特にGPGPUタグを参照してください。しかし、アーキテクチャの「使用する技術」の質問は、ここよりも優れています。
ケイトグレゴリー

1
@Kateその角度は、リンクされたスーパーユーザーの質問で非常によくカバーされているようです。それを読んで、正直に言うと、ここに移行されなかったことに少し驚いています。SOにもこれがあります。質問を再開します(あなたが正しいので、プログラミングの側面はここで話題になっています)。この問題の既存の(優れた)カバレッジを指し示すだけの答えではないことを願っています。
アダムリア

1
@Annaの要点は、GPUとCPUの違いを純粋に理論的に説明するのではなく、プログラマーがいつGPUを使用すべきかについての答えがもっと必要だと思います。これを反映するようにタイトルを編集しました。

2
@RetroX異なるサイトにある質問を重複して閉じることはできません。
アダムリア

回答:


26

ただし、これらすべての新しいシステムでは、あらゆる点でGPUがCPUよりも優れているように見えます。

これは根本的な誤解です。現在のGPUコアは、現在のトップラインCPUと比較してまだ制限されています。NVIDIAのFermiアーキテクチャは、現在利用可能な最も強力なGPUです。整数演算用の32ビットレジスタしかなく、現在の市販のIntelプロセッサよりも分岐予測と投機的実行の能力が低くなっています。Intel i7チップは3つのレベルのキャッシングを提供し、Fermiコアには2つしかありません。また、Fermiの各キャッシュはi7の対応するキャッシュよりも小さくなっています。GPUコア間のプロセス間通信はかなり制限されており、その制限に対応するために計算を構成する必要があります(コアはブロックにまとめられ、ブロック内のコア間の通信は比較的高速ですが、ブロック間の通信は低速です)。

現在のGPUの重大な制限は、すべてのコアで同じコードを実行する必要があることです。CPUのコアとは異なり、1つのGPUコアにメールクライアントを実行し、別のコアにWebサーバーを実行するように指示することはできません。GPUにマトリックスを反転する機能を与えると、すべてのコアがデータの異なるビットでその機能を実行します。

GPU上のプロセッサは孤立した世界に住んでいます。ディスプレイを制御できますが、ディスク、ネットワーク、またはキーボードにはアクセスできません。

GPUシステムへのアクセスにはかなりのオーバーヘッドコストがかかります。GPUには独自のメモリがあるため、計算はGPUカードのメモリ量に制限されます。GPUメモリとメインメモリ間でのデータ転送は比較的高価です。実際には、セットアップとティアダウンのコストが計算に必要な時間を圧倒するため、CPUからGPUに少数の短い計算を渡すメリットがないことを意味します。

要するに、GPUは、並行して計算できる長い計算のコピー(数百または数千など)がある場合に便利です。これが一般的な一般的なタスクは、科学計算、ビデオエンコーディング、画像レンダリングです。テキストエディタのようなアプリケーションの場合、GPUが役立つ可能性のある唯一の機能は、画面にタイプを表示することです。


倍精度サポートはShader Model 5の一部であり、AMD / ATIにもサポートされています。
ベンフォークト

@Ben、訂正してくれてありがとう。間違ったステートメントを削除しました。
チャールズE.グラント

11

GPUはCPUのようなジェネラリストプロセッサではありません。彼らは、1つの非常に具体的なこと(同じコードを大量のデータに適用すること)に特化しており、CPUよりもはるかに優れた方法で非常に優れています。しかし、ほとんどのアプリケーションの大部分は、同じコードを大量のデータに適用することではありません。それは、イベントループについてです。入力を待機し、入力を読み取り、それに作用し、さらに入力を待機します。これは非常にシリアルなプロセスであり、GPUは「シリアル」を嫌います。

処理する必要がある大量のデータがあり、各アイテムを他のアイテムとは無関係に並列に処理できる場合は、先に進んでGPUに送信します。しかし、これをすべてを絞らなければならない「新しいパラダイム」と考えないでください。

この質問には「最適化」というタグが付いているため、忘れずに1つとして扱ってください。テストとプロファイリングにより最適化が必要であることが明らかになり、タスクの性質がGPU最適化を適用できるようなものである場合、GPU最適化を適用します。それ以外の場合は、気にしないでください。これは、最適化が時期尚早または不適切であり、修正するよりも多くの問題が発生するためです。


8

簡単な答えは、非常に多数のアイテムのそれぞれに対してかなり小さく、かなり単純な計算を行う必要があるときにGPUが最適に機能するということです。この方法を実現するには、各アイテムの計算が他のアイテムの計算から独立している必要があります。あるアイテムと別のアイテムの間に(通常)何らかの依存関係がある場合、一般に、GPUでそのコードを実行することから多くを得る前に、それを破る何らかの方法を見つけ出す必要があります。依存関係をまったく解消できない場合、または解消するために多くの作業が必要な場合、コードはCPU上でより高速に実行される可能性があります。

現在のほとんどのCPUは、現在のGPUがまったくサポートしようとしない、非常に少数のタイプの操作もサポートします(たとえば、マルチタスクのメモリ保護)。

CPUを少し異なる方向から見ると、CPUは(大部分)プログラマーにとって合理的に便利になるように設計されており、ハードウェアの人々は、その便利なモデルを維持するハードウェアを作成するために最善を尽くしていますプログラマーですが、可能な限り迅速に実行します。

GPUは、むしろ反対方向からのものに来ます:それらは主にハードウェア設計者にとって便利になるように設計されており、OpenCLのようなものは、ハードウェアの制約を考慮して可能な限り合理的なプログラミングモデルを提供しようとしました。

GPUで実行するコードを記述すると、通常、CPUで同じことを行うよりも多くの時間と労力がかかります(したがって、コストがかかります)。このように、そうすることは、主に次の場合に意味があります。

  1. 問題は非常に並行的であるため、最小限の労力で大きな利益を期待できます。
  2. 速度の向上は非常に重要であるため、多くの余分な作業が必要になります。

それぞれにいくつかの明白な可能性がありますが、膨大な数のアプリケーションは明らかにどちらにも近いものではありません。(たとえば)すぐにGPUでCRUDアプリケーションが実行されるのを見ると、非常に驚​​くでしょう(もしそうなれば、誰かがその正確な目標を念頭に置いて、必ずしも最適に近づいているわけではないので、おそらく起こります)費用便益比)。

現実には、多くの(「ほとんど」と言いたい)アプリケーションでは、典型的なCPUは十分に高速であり、プログラミングの利便性(新機能の開発が容易になるなど)がはるかに重要です。実行速度。


3

一度に多くの計算を行うことができ、本当に速度が向上します。

速度を改善しますか?だから何?昨年を通して、必要なときに1回か2回しか思い出せません。ほとんどの場合、ロジックの変更または修正、異なるデータソースの調整、ユーザーインタラクションの改善などを依頼されました。これらのケースに関心のあった唯一の速度は、変更の速度です。「1か月以内に、またはそれ以上の新機能を2週間以内にリリースしてください」。

誤解しないでください-コーダーとして、私はCPUティックを徹底的に絞ることを楽しんでいます。ただ、このアートは一般的に需要が高いわけではありません。

シリアル処理がパラレルよりも優れ、高速、かつ/または効率的である特定のケースがまだありますか?

たくさんのケースがあると思います。シリアル処理はパラレル処理よりも単純であるため、速度が重要な要件ではないすべてのケースで効率が向上します。シリアル処理により、複雑なロジックとユーザーインターフェイスの実装が容易になり、指定とテスト、保守、変更が容易になります。

原則として、シリアル処理により、プログラマの意図をより明確に表現し、コードを簡単に読み取ることができます。私はそれが最も貴重で希少な資源、つまりプログラマーの脳を節約すると言うでしょう。


2

CPUはさらに汎用性があります。たとえば、GPUは単精度ではCPUよりも効率的ですが、倍精度では効率的ではありません。GPU用よりもCPU用のライブラリがはるかに多くあります。


3
もう少し詳しく説明していただけますか?3つのステートメントを提供しましたが、それらの真実性に関する情報や説明はありません。

さて、効率的な倍精度計算の欠如は一般的な知識です:en.wikipedia.org/wiki/GPGPU
quant_dev

@quant:あなたの情報は少なくとも2年古いです:544 GigaFLOPSは他のどのメインストリームCPUよりもはるかに高速です。
ベンフォークト

@Benあなたのリンクが倍精度のパフォーマンスに言及しているところがわかりません。
quant_dev


2

単純なルールは、あなたがしていることを線形代数からの構造に関して表現することができ、時間が重要である場合、GPUでそれ以外の場合はCPUを使用します。

GPUは多数のCPUとは異なり、パフォーマンス特性が大きく異なります。


「タイムクリティカル」である場合は、コンピューティングシェーダー用にGPUを再構成し、データをアップロードする時間がありません。最も利益をもたらすのは大きな問題です。
ベンフォークト

@Ben、私たちは「タイムクリティカル」の異なる定義を持っていると思います、私が意味することは、計算がかなりの時間クリティカルパス上にあるということです。
dan_waterworth

1

生の数値計算が必要な場合は、GPUが最適です。ただし、これらすべてのALUは、制御フロー(分岐)回路専用のトランジスタが少ないことを意味します。したがって、多くの複雑な制御フロー、多くの条件などを必要とするものを記述する必要がある場合、CPUは高速になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.