もう少し知りたいCPUの仕組み
初めに
プログラミングをしていく上で C や C++ は早い、Python は比較的遅いという話をよく聞きます。具体的に何がコンピューターの性能を決めているのか気になったため、今回は処理の中核をなす CPU について調査しました。
CPUとは
CPUとは『Central Processing Unit』の略で中央処理装置とも呼ばれます。これは、コンピュータの頭脳にあたる部品です。日々使用するOSやアプリケーションは、最終的にCPUによって命令が実行され、計算・制御が行われます。
具体的には以下のようなタスクを実行します。
- メモリや入出力デバイス、キャッシュ、その他のハードウェアの制御
- 命令の取得・デコード
- プログラムの実行
- キャッシュメモリとの高速データやり取り etc…
CPUの命令実行サイクルとは?
上記の通り、CPUには多種多様で膨大な数の命令が与えられ、CPUはそれを一つずつ処理していきます。CPUはそのような命令を「命令実行サイクル(Instruction Cycle)」と呼ばれる手順に従って実行します。基本的には以下の3つのステップに分けられます。
- フェッチ(Fetch)
- デコード(Decode)
- 実行(Execute)
1. フェッチ(Fetch):命令の取り出し
まず最初に、CPUは実行すべき命令をメモリ(RAM)から取り出します。具体的には、プログラムカウンタ(PC)という特殊なレジスタが現在実行すべき命令のアドレスを保持しており、そのアドレスに基づいて命令をメモリから読み出します。
2. デコード(Decode):命令の解読
次に、取り出した命令を解読します。CPU内のデコーダが命令を解析し、どのような操作が必要かを判断します。例えば、データの加算なのか、メモリへのアクセスなのかなど、具体的なアクションを特定します。
3. 実行(Execute):命令の実行
最後に、解読した命令に基づいて実際の操作を行います。CPUは算術論理演算ユニット(ALU)などを使ってデータの計算を行ったり、メモリからデータを読み書きしたりします。実行が完了すると、次の命令を実行するために再びフェッチのステップに戻ります。
命令実行サイクルの繰り返し
このフェッチ・デコード・実行のサイクルは、CPUが動作している限り繰り返されます。高速で連続的に命令が処理されることで、スムーズにアプリケーションを実行することができます。
命令実行サイクル
パイプラインと並列処理
ただ素直に命令実行サイクルを繰り返していると、無駄な待ち時間が生じるため効率が悪いです。現代のCPUでは、命令実行サイクルをさらに効率化するために「パイプライン」や「並列処理」といった技術が採用されています。この結果、複数の命令を同時進行で処理し、全体のパフォーマンスを向上させています。例えば、ある命令のデコードをしながら別の命令のフェッチを行うことで、処理速度が格段に速くなります。
非パイプライン処理
パイプライン処理
処理能力は
次にCPUの処理能力を分ける要素について見ていきましょう。
CPUの処理能力を語る上で特に重要な要素が「周波数」「コア数」「MIPS(Million Instructions Per Second)」が挙げられます。
周波数
CPUの周波数(クロック周波数)は、1秒間に何回の「クロック信号」に基づいて処理サイクルを実行できるかを示したものです。言い換えると1秒間に何回計算することができるかを表しています。
一般的には「○○GHz(ギガヘルツ)」という単位で表され、1GHzは1秒間に10億回の処理サイクルを意味します。数値が大きいほど、理論上1秒間でこなせる処理回数が多く、高速な動作が期待できます。
ただし、周波数が高ければ必ずしもCPU全体の性能が高いとは限りません。CPUの内部アーキテクチャ(命令パイプラインの効率、キャッシュメモリの構造、同時に実行できる命令数(IPC: Instructions Per Cycle)など)や、省電力設計・発熱対策などの要素が総合的に性能を左右します。
コア数
コア数は、CPU内部に存在する独立した演算ユニット(コア)の数を指します。言葉どおり核(コア)となる部分で、実際にデータを処理する中央処理ユニットとなります。かつては1つのCPUチップにコアが1つ(シングルコア)だけでしたが、技術の進歩により1つのCPUパッケージ内に複数のコアを内蔵する「マルチコアCPU」が主流となりました。
- デュアルコア:2つのコア
- クアッドコア:4つのコア
これ以外にも、6コア、8コア、16コアといった多コアCPUが一般的になっています。コア数が増えると、CPUは複数のタスクを物理的に同時に処理できるようになります。たとえば、1コアの場合はプログラムAとプログラムBを交互に素早く切り替えて処理していたため、負荷が増えれば処理速度が低下しやすい状況でした。一方、4コアCPUならコア1でプログラムA、コア2でプログラムB、コア3でプログラムC…といった形で並行処理が可能です。
MIPS(Million Instructions Per Second)
MIPS(Million Instructions Per Second)は、CPUが1秒間に処理できる命令数を「百万単位」で示す指標です。たとえば「100 MIPS」であれば、1秒間に1億回の命令を実行可能であると理論上は解釈できます。かつてはコンピュータの絶対的な性能を表す代表的な値として使われてきましたが、近年では以下の理由から、MIPSだけではCPUの性能を評価しにくいとされています。
- 命令の種類と複雑さ: 命令の複雑さや長さはCPUのアーキテクチャによって異なり、同じ「1命令」でも実行にかかる負荷や時間が変わる場合がある。
- パイプライン処理や並列処理: モダンCPUは命令をパイプラインで並行実行したり、分岐予測やスーパースカラなど高度な技術を使って効率を高めている。こうした仕組みを単純な「命令数」に置き換えて比較するのは難しい。
- 実アプリケーションでの差: ベンチマークとしてのMIPS値が高くても、実際のアプリケーションで同等のパフォーマンスが出るとは限らない。OSやプログラムの最適化、メモリやストレージ性能など、多角的な要因が影響する。
CPUとプログラムの実行速度について
プログラムの実行速度は、「CPUの周波数」「コア数」「CPUアーキテクチャ」といったハードウェア要因だけでなく、「ソフトウェア側の最適化」「メモリ速度」「ストレージ性能」など、多くの要素によって決まります。以下のような点が、CPUとプログラム実行速度の関係を理解する上で参考になります。
-
シングルスレッド性能:
単一の処理をできる限り短時間で実行する能力を指す。たとえば、古いプログラムやゲームなど、マルチスレッド最適化が行われていないソフトウェアでは、コア数が増えてもあまり効果が得られず、1コアあたりの実行効率や周波数の高さがより重要となる。
-
マルチスレッド性能:
プログラムが複数のスレッド(並行して走る処理の流れ)に分割される場合、コア数の多さが重要となる。コア数が多ければ、多くのスレッドを同時並行的に実行でき、処理時間が短縮される。
-
メモリ・ストレージとのバランス:
CPUがいくら高速でも、メモリやストレージのアクセスが遅ければ、CPUは計算待ちでアイドル状態になることが増え、結果としてプログラムが遅くなる。高速なメモリやSSDと組み合わせることで、CPUの性能をより引き出すことが可能。
-
ソフトウェア最適化:
ソフトウェアが最新CPUの機能(拡張命令セットやマルチスレッディング最適化など)を有効に活用しているかどうかによっても、実行速度は変わる。プログラマーがアプリケーションを並列処理に最適化すれば、多コアCPUで大幅な速度向上が見込まれる。
参考リンク
-
The Fetch-Execute Cycle: What's Your Computer Actually Doing?
-
The Journey InsideSM: Microprocessors Student Handout: Fetch, Decode, and Execute
Discussion