はじめに
さて今回は、CPUとGPUの処理速度の違いとその理由についてまとめたいと思います。
なぜ今更こんなことをといった感じでしょうが、理由は単純、生成AIが原因です。
生成AIを色々いじいじしていると、CPUよりもGPUの方が処理速度は速いというのをよく聞きます。こいつは何でなんだろうと気になり、ちゃんと理解しておこうと思った次第です。
細かくCPUやGPUの構造まで理解しようと思っているわけではありません。簡単に何でなんだろうというのを頭に入れておきたかっただけです。
皆さんの理解の一助になれば嬉しいです!それでは見ていきましょう~
処理速度の違いとその理由
まずはCPUとGPUの構造と役割を簡単に理解しておきましょう。そこが分かればある程度答えが見えてくると思います。
CPU | GPU | |
---|---|---|
構造・設計 | 数個から数十個の高性能なコアを持つマルチコアプロセッサ。 各コアは、複雑な命令を迅速に処理するように設計されており、様々なタスクを並行して実行可能。 | 数千個の小型で効率的なコアを持つ多数コアプロセッサ。 各コアは、同時に多くの単純な計算を高速で実行するように最適化されている。 |
役割 | システム全体の制御と管理を行う。プログラムの実行、デバイスの管理、ユーザーからの入力処理など、幅広いタスクを担当 。 | 主にグラフィックス処理に特化。例えば、画像やビデオのレンダリング、3Dモデルの描画等。 近年ではディープラーニングやAIの高速化にも活用される。 |
伝わりました?
CPUは高性能なコアを少し持っており、GPUは小型で効率的なコアを大量に持っている、というのが大きな構造の違いです。CPUは各コアが複雑な命令を迅速に実行し、一方GPUは各コアが並列で同時に多くの単純な計算を実行するようになっているというわけです。
これらが速度に大きな影響を与えます。結論、速度的な違いは以下の通りです。
CPU | GPU | |
---|---|---|
処理速度 | 複雑な命令を迅速に処理する能力に優れる。 一方、並列処理能力は限定的で、多数のタスクを同時に処理する際の効率はGPUに劣る。 | 多数のコアを活用して大規模な並列処理を行うため、同じタスクを大量に同時処理する能力に優れる。 特に、グラフィックスのレンダリングや科学計算、ディープラーニングなどの分野で高いパフォーマンスを発揮 。 |
分かりました??
結論、CPUよりもGPUの方が処理速度が速いというのは半分正解、半分不正解ということです。
1コアあたりの処理速度に関しては、一般的にCPUの方がGPUよりも速いです。これはCPUが高いクロック速度と強力なシングルスレッド性能を持っているためです。CPUのコアは少数ですが、各コアが複雑なタスクや連続的な処理を高効率で行うように設計されています 。
一方、GPUは多数のコアを持ち、並列処理を得意としています。各コアは比較的単純な処理を行いますが、多数のコアが同時に動作することで、特に大量のデータを並行して処理する場合には非常に高いパフォーマンスを発揮します 。
したがって、単純に単一コアの処理速度に限って見てみればCPUが優れており、多数のデータを同時に処理する場合にはGPUが優れていると言えます。
要は役割分担です。システムの効率を最大化するためには、CPUとGPUの特性を活かした使い方が重要です。例えば、ゲームではCPUがゲームロジックやAIの処理を行い、GPUがグラフィックスのレンダリングを担当する。一方CPUは複雑なタスクを直列で実行していく。お互いに補完しあって最適化していく構成となっているわけですね。
いや~、個人的にはしっくりきました。生成AIだけ見ていたからGPUの方が処理速度が速いと言われていたのですね。単純に処理速度が速いなら全部GPUにしちゃえばいいじゃん~、何が理由でそんなことにしないんだろうかと頭を抱えていたわけですが、やっとこさ明確になりました。
具体例:行列計算で確認
さて、色々と理由は説明し、しっくり来ていただけたかと思いますが、文字面だけでは理解が難しいところもあるかと思いますので、具体例も見ていきましょう。
実際にCPUとGPUで行列計算を実行し、それぞれの処理時間を見ていきましょう。
Google Colaboratoryを使って実行していきます。
実行するのは以下のコードです。
import torch
import time
# 行列サイズ設定
for size in range(100, 11000, 100):
a = torch.randn([size, size])
b = torch.randn([size, size])
# CPUで計算
start_time = time.time()
c = torch.matmul(a, b)
end_time = time.time()
cpu_time = end_time - start_time
print('Matrix Size: {}, CPU処理時間: {:.4f}秒'.format(size, cpu_time))
# GPUで計算
a = a.to('cuda')
b = b.to('cuda')
start_time = time.time()
c = torch.matmul(a, b)
torch.cuda.synchronize() # すべてのCUDAカーネルが完了するまで待つ
end_time = time.time()
gpu_time = end_time - start_time
print('Matrix Size: {}, GPU処理時間: {:.4f}秒'.format(size, gpu_time))
実行結果は以下の通りです。
Matrix Size: 100, CPU処理時間: 0.0035秒
Matrix Size: 100, GPU処理時間: 0.0003秒
Matrix Size: 200, CPU処理時間: 0.0004秒
Matrix Size: 200, GPU処理時間: 0.0002秒
Matrix Size: 300, CPU処理時間: 0.0005秒
Matrix Size: 300, GPU処理時間: 0.0002秒
Matrix Size: 400, CPU処理時間: 0.0011秒
Matrix Size: 400, GPU処理時間: 0.0002秒
Matrix Size: 500, CPU処理時間: 0.0019秒
Matrix Size: 500, GPU処理時間: 0.0004秒
Matrix Size: 600, CPU処理時間: 0.0032秒
Matrix Size: 600, GPU処理時間: 0.0003秒
Matrix Size: 700, CPU処理時間: 0.0064秒
Matrix Size: 700, GPU処理時間: 0.0004秒
Matrix Size: 800, CPU処理時間: 0.0112秒
Matrix Size: 800, GPU処理時間: 0.0006秒
Matrix Size: 900, CPU処理時間: 0.0140秒
Matrix Size: 900, GPU処理時間: 0.0008秒
Matrix Size: 1000, CPU処理時間: 0.0230秒
Matrix Size: 1000, GPU処理時間: 0.0009秒
・
省略
・
Matrix Size: 10100, CPU処理時間: 17.7103秒
Matrix Size: 10100, GPU処理時間: 0.5897秒
Matrix Size: 10200, CPU処理時間: 17.1594秒
Matrix Size: 10200, GPU処理時間: 0.5879秒
Matrix Size: 10300, CPU処理時間: 18.0313秒
Matrix Size: 10300, GPU処理時間: 0.6489秒
Matrix Size: 10400, CPU処理時間: 18.0954秒
Matrix Size: 10400, GPU処理時間: 0.6321秒
Matrix Size: 10500, CPU処理時間: 18.4075秒
Matrix Size: 10500, GPU処理時間: 0.6758秒
Matrix Size: 10600, CPU処理時間: 19.6195秒
Matrix Size: 10600, GPU処理時間: 0.6869秒
Matrix Size: 10700, CPU処理時間: 20.3762秒
Matrix Size: 10700, GPU処理時間: 0.7030秒
Matrix Size: 10800, CPU処理時間: 19.8973秒
Matrix Size: 10800, GPU処理時間: 0.7861秒
Matrix Size: 10900, CPU処理時間: 20.6151秒
Matrix Size: 10900, GPU処理時間: 0.6890秒
具体例含めてもしっくりきましたね。行列計算のような単純な並列処理を必要とするタスクですと、GPUがCPUよりも圧倒的に処理時間が速いということがよく分かります。
最後に
さて今回は、CPUとGPUの処理速度の違いとその理由についてまとめました。
なぜそうなのか、実際どうなのか、気になった際に調べて知識として定着させるのはすごく重要ですね。
しかも記事としてアウトプットすることでより定着する!これぞ私が記事を書いている最大の要因です。
これからもこんな感じで気になったことはガンガンまとめていきます!冒頭にもお伝えしましたが、皆さんの一助になれば嬉しいです!!
コメント