CPUとGPUの違い:構造・得意な処理・用途を比較

CPUは、1つの仕事をできるだけ速く終わらせるために作られていて、強力なコアを少数と、大きなキャッシュ、賢い制御回路を持ちます。GPUは、似た仕事を大量に同時にこなすために作られていて、単純な演算器を数千個そろえ、膨大な数のスレッドを切り替えることでメモリの待ち時間を隠します。CPUは複雑で分岐の多い逐次的な処理に、GPUは画像処理やディープラーニングのような大規模な並列計算に向いています。

項目CPUGPU
設計の目的低遅延。1つのスレッドをできるだけ速く終わらせる高スループット。全体でできるだけ多くの仕事をこなす
コア数複雑なコアが数個から数百個単純な演算器が数千個。いくつかの塊にまとめられている
実行モデル各コアに投機実行(アウトオブオーダー)と分岐予測があり、SIMD命令も使うSIMT。スレッドのグループ(たとえば32個)が、同じ命令をそろって実行する
制御回路とキャッシュ大きなキャッシュと高度な制御回路が、チップ面積の多くを占める面積の多くを演算器に使う。スレッドあたりのキャッシュは小さい
メモリ遅延の隠し方主にキャッシュとプリフェッチ主に、待っているスレッドから別の実行可能なスレッドへ切り替える
メモリDDRやLPDDR。帯域は一般に数十〜数百GB/sGDDRやHBM。帯域は一般に数百GB/s〜数TB/s
分岐分岐や不規則なコードに強いグループ内のスレッドが別々の分岐に進むと遅くなる(ダイバージェンス)
データの置き場所メインメモリを直接扱う外付けのGPUは専用メモリを持つので、PCIeなどでデータをコピーする必要がある
プログラミングほとんどの言語やツールが使えるCUDA、HIP、OpenCL、シェーダー言語などの専用のモデル
得意な処理OS、データベース、制御ロジック、一般的なアプリケーショングラフィックス、行列・ベクトル計算、ディープラーニング、シミュレーション

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

CPU
処理が逐次的で分岐が多いとき、または1つのスレッドに素早い応答が必要なとき。OSの実行、アプリケーションのロジック、データベースなど。
GPU
同じ演算を大量のデータに当てはめるとき。画像のレンダリング、ニューラルネットワークの学習と推論、科学技術シミュレーションなど。
組み合わせ
ほとんどのシステムは両方を使います。CPUがプログラムを動かしてデータを用意し、GPUが重い並列計算をします。GPUに渡す仕事が少なすぎると、データのコピーに時間がかかり、CPUだけで済ませるより遅くなることもあります。

よくある質問

なぜディープラーニングではGPUがCPUより速いのですか?

ディープラーニングは、同じ演算に分けられる行列計算が中心です。GPUは、単純な演算器が数千個あり、メモリ帯域も非常に高いので、少数の複雑なコアを持つCPUより、この並列な仕事をはるかにうまくこなせます。

GPUはCPUの代わりになりますか?

なりません。GPUは、分岐が多く逐次的なコードが苦手で、OSの実行やデータの供給にはCPUが必要です。両者は協力して働きます。

GPUのSIMTとは何ですか?

SIMT(単一命令・複数スレッド)は、たとえば32個のスレッドのグループが、同じ命令を、別々のデータに対してそろって実行する方式です。グループ内で別々の分岐に進むと、順番に実行されることになり、これをダイバージェンスと呼びます。

小さな処理では、GPUを使うと遅くなることがあるのはなぜですか?

データを、PCIeなどのバスを通して、CPUのメモリとGPUのメモリの間でコピーしなければなりません。処理が少ないと、コピーの時間が、GPUで節約できる時間より大きくなることがあります。

理解度チェック

GPUのSIMT(単一命令・複数スレッド)の方式と、CPUのSIMD命令の違いとして正しいものはどれか。

  1. ASIMTは1つのデータに複数の命令を同時に行い、SIMDは1つの命令を1つのデータに行う
  2. BSIMTとSIMDはまったく同じもので、名前が違うだけである
  3. CSIMTでは各スレッドを独立したプログラムとして書け、分岐もハードウェアが処理するが、SIMDではプログラマやコンパイラが幅の決まったベクトルの命令を明示的に使う
答えと解説を見る

正解:C. SIMTでは各スレッドを独立したプログラムとして書け、分岐もハードウェアが処理するが、SIMDではプログラマやコンパイラが幅の決まったベクトルの命令を明示的に使う

CPUのSIMDでは、4個や8個のデータをまとめたベクトルのレジスタに1つの命令をかけるので、プログラムはベクトルの幅を意識して書きます。GPUのSIMTでは、プログラマは1本のスレッドの処理を普通に書き、ハードウェアが32本ずつ束ねて同じ命令で動かします。スレッドごとに分岐してもよく、ハードウェアが分岐した経路を順に実行しますが、そのときは効率が下がります。

GPUが行列演算やAIの学習・推論に向いている主な理由はどれか。

  1. Aクロック周波数がCPUの100倍以上あるから
  2. B単純な演算器を多数もち、大量のデータを並列に処理できるから
  3. Cメモリを持たないから
答えと解説を見る

正解:B. 単純な演算器を多数もち、大量のデータを並列に処理できるから

GPUは、もともと画面の多数の画素を同時に処理するために、単純な演算器を数千〜1万個以上並べた構造をもっています。行列演算のように同じ計算を大量のデータに繰り返す処理では、この並列性で高い性能を発揮します。近年は行列演算専用のユニット(Tensor Coreなど)と広帯域のHBMを備え、AIの学習の主役になっています。分岐の多い逐次的な処理はCPUのほうが得意です。

GPUのキャッシュについて、CPUと比べた一般的な特徴として正しいものはどれか。

  1. AGPUにはキャッシュがまったくない
  2. BGPUにもL1やL2のキャッシュはあるが、同時に動くスレッドの数が非常に多いので、1スレッドあたりのキャッシュの容量はずっと小さい
  3. CGPUのキャッシュは1スレッドあたりCPUの何倍も大きい
答えと解説を見る

正解:B. GPUにもL1やL2のキャッシュはあるが、同時に動くスレッドの数が非常に多いので、1スレッドあたりのキャッシュの容量はずっと小さい

GPUもSMごとのL1キャッシュやチップ全体で共有するL2キャッシュを持っていますが、数万本のスレッドが同時に動くので、1スレッドあたりに使える容量はCPUの1スレッドより桁違いに小さくなります。キャッシュに頼って遅延を減らすのではなく、多数のワープの切り替えで遅延を隠し、合体アクセスや共有メモリでメモリの使い方を工夫するのがGPUの考え方です。

  1. 単体のGPUを使うプログラムで、CPU側のメモリとGPU側のメモリについて一般的に正しいものはどれか。
  2. 配列の要素を1回だけ足し算するような軽い処理のためにデータをGPUへ送ると、CPUで計算するより遅くなることがある。主な理由はどれか。
  3. CPUのメモリをピン留め(ページロック)してからGPUへ転送すると速くなる理由として正しいものはどれか。

GPUプログラミングの練習問題へ

関連する用語の解説

GPU
Graphics Processing Unit の略。単純な演算器を多数もち、大量のデータを並列に処理するプロセッサ。画像処理のほか、AIの学習や推論に広く使われている。
SIMD
Single Instruction, Multiple Data の略。1つの命令で複数のデータに同じ演算を同時に行う方式。画像処理やAIの計算を高速化する。
キャッシュメモリ
CPUの近くに置く高速・小容量のメモリ。よく使うデータを保持して主記憶との速度差を緩和する。主にSRAMでつくられる。
HBM
複数のDRAMダイをTSVで積層し、非常に広いバス幅で高い帯域を実現するメモリ。

関連する比較