GPU
同じ演算を大量のデータに並列適用することに特化したプロセッサ。
CPU との違い#
| CPU | GPU | |
|---|---|---|
| コア数 | 8〜64 | 数千〜数万 |
| 1 コアの性能 | 高い | 低い |
| キャッシュ | 大きい | 小さい |
| 制御回路 | 複雑(分岐予測、OoO) | 単純 |
| 得意 | 分岐の多い逐次処理 | 同じ処理の大量並列 |
CPU はトランジスタの大半を「1 つの命令列を速く流す」ために使う。 GPU は演算器そのものに使う。
SIMT#
多数のスレッドをまとめ(NVIDIA では 32 スレッドの warp)、 同じ命令を同時に実行する。
if (x > 0) { A } else { B }warp 内でスレッドごとに条件が分かれると、 A を実行してから B を実行し、 それぞれ該当しないスレッドを無効化する。
分岐すると両方の経路を実行するので遅くなる(ダイバージェンス)。 GPU 向けのコードで分岐を避けるのはこのため。
レイテンシ隠蔽#
GPU はキャッシュが小さく、メモリレイテンシを隠せない。 代わりに待っているスレッドを別のスレッドに切り替える。
十分な数のスレッドがあれば、 常にどれかが実行可能な状態になり、演算器が遊ばない。 大量の並列性があることが前提の設計。
深層学習との相性#
- 分岐がほとんど無い
- 同じ演算を大量のデータに適用する
- 並列度が十分にある
GPU の前提と完全に一致している。 これが深層学習の実用化に GPU が不可欠だった理由。
近年は行列積専用の演算ユニット(Tensor Core)や 低精度演算(FP16、BF16、FP8)で、さらに特化が進んでいる。
参考文献#
- John L. Hennessy, David A. Patterson. Computer Architecture: A Quantitative Approach, 6th ed. Morgan Kaufmann, 2017.
- NVIDIA. CUDA C++ Programming Guide. https://docs.nvidia.com/cuda/cuda-c-programming-guide/
- John Nickolls et al. Scalable Parallel Programming with CUDA. ACM Queue 6(2), 2008. https://doi.org/10.1145/1365490.1365500