CPU(シーピーユー、Central Processing Unit、中央演算処理装置)は、様々な数値計算や情報処理、機器制御などを行うコンピュータにおける中心的な回路で、記憶装置上にあるプログラムと呼ぶ命令列を順に読み込み、解釈し、その結果に従ってデータの移動や加工を行う。CPU外部にはバスやインタフェースを介して表示装置や通信装置、補助記憶装置などの周辺機器や主記憶装置が接続され、データやプログラムのやりとりを行う。このようなCPUを用いたプログラムによるコンピュータの逐次動作をストアードプログラム方式と言い、ほとんどのコンピュータアーキテクチャの基本原理となっている。
cpu_package_1.jpgcpu_package_2.jpg現在では概して1チップのLSIに集積されており、MPU(Micro Processing Unit)またはマイクロプロセッサと呼ぶこともある。また算術演算機能を強化し信号処理に特化したDSPや、DA/ADやDMACなどの周辺機器を搭載し組込み機器制御を目的としたマイクロコントローラ(マイコン)などの展開種も登場している。
各種専用回路と比べ実行速度は遅いが、比較的簡易な構造で多様な処理を行えるため、プログラムを入れ替えるだけで様々な用途に用いることが可能である。またプログラムの命令には条件分岐などのプログラム制御命令も含まれるため、自律動作なども可能となる。以上のような特徴を持つため、CPUはおよそあらゆるシステムに内蔵され、現代の産業や生活の屋台骨を支える存在にまで普及している。現在最も普及しているCPUはインテル社のx86シリーズで、1978年6月8日に8086をリリース以来2003年にPentium4で10億個を突破した。これらはほとんどがPCに搭載されている。
CPU(Central Processing Unit)という用語は、特定のクラスのプログラム可能論理マシンを表す用語である。この定義は "CPU" という用語が広く使われるようになる前の初期のコンピュータにも適用可能である。この用語が一般に使われるようになったのは1960年代になってからだが、CPUの構造は1949年に世界最初のストアードプログラム方式コンピュータであるEDSACが発表された時点で現在とほぼ同じ仕組みが完成しており、CPUの発達史はスケールアップと高速化が中心となっている。
CPUを構成する各部の動作はクロック信号によって規則正しいタイミングで統制されている。同じCPUであればクロック周波数が高い方が一定時間に多くの処理を行え、高速に動作する。基本的にはクロック信号の1周期でCPUの単位動作が1回行われる。1クロックで行える処理の内容はCPUの設計により異なり、1つの機械語命令を実行するのに複数クロックかかるものから1クロックで複数の命令の実行を同時に行えるものまである。クロック周波数1GHzのCPUであれば、1秒間に10億回の基本動作を行う事ができる。
多くのCPUでは、大まかに言って制御部が命令の解釈とプログラムの流れの制御を行い、演算部が実行を行うので、同時に実行されるのは1命令だけであるが、非ノイマン型のCPUや画像処理など高速性が要求される用途向けのCPUでは、同時に複数の命令を実行できるように複数の実行部を同一IC内に持っているものがある。
最初の段階であるフェッチとは、実行すべき命令(ある数値または数値の並び)をプログラムの置かれたメモリから取り出すことである。メモリ上の実行すべき命令の位置はプログラムカウンタで指定される。プログラムカウンタはCPUが今現在見ているプログラム上の位置を示しているとも言える。命令フェッチに使用されると、プログラムカウンタはフェッチしたぶんだけ増加させられる。
CPUがメモリからフェッチした命令によってCPUの次にすべきことが決定される。デコードでは、命令をCPUにとって意味のある形式に分割する。命令を表す数値をどう分割するかは、予めそのCPUの命令セットで決定される。命令の一部の数値は命令コードと呼ばれ、実行すべき処理を指定する。その他の部分はオペランドと呼ばれ、その命令で使用する情報を示している。たとえば加算命令のオペランドは加算すべき数値を示している。オペランドには数値そのものが書かれていたり、数値のある場所(メモリのアドレスかレジスタの番号)が書かれている。古い設計では、デコーダ(デコードを行う部分)は変更不可能なハードウェア部品だった。しかし、より複雑で抽象的なCPUや命令セットではマイクロプログラム方式がしばしば使われ、命令を様々な信号に変換するのを助けている。このマイクロプログラムは書き換え可能な場合があり、製造後でも命令デコード方法を変更することができる。
フェッチとデコードの次は、実行ステップが行われる。このステップでは、CPUの多くの部分が接続され(たとえばマルチプレクサを切り替えるなどして)指定された操作を実行する。たとえば、加算を要求されている場合、ALUが所定の入力と接続され、出力と接続される。入力は加算すべき数値を提供し、出力には加算結果が格納される。加算結果が大きすぎてそのCPUに扱えない場合、算術オーバーフローフラグをフラグレジスタ(ステータスレジスタ)にセットする(RISCではフラグレジスタが存在しない場合もある)。入力や出力にはいろいろなものが使用される。演算結果が一時的かあるいはすぐに利用される場合にはレジスタと呼ばれる高速で小さなメモリ領域に格納される。メモリも入力や出力に使われる。レジスタ以外のメモリは低速だが、コスト的には一般的なメモリの方が安価であり大量のデータを格納できるため、コンピュータには必須である。
いくつかの命令はプログラムカウンタを操作する。それらは一般にジャンプ命令と呼ばれ、ループを構成したり、条件分岐をしたり、サブルーチンを実現するのに使われる。また、多くの命令はフラグレジスタを変化させる。それらのフラグはプログラムの動作に影響を与える。たとえば比較命令は二つの値を比較してフラグレジスタにその大小を示す値をセットする。そして、その値を使用してその後の処理の流れを決定するのである。
命令を実行後、同じ流れが繰り返されて次の命令をプログラムカウンタにしたがってフェッチする。もっと複雑なCPUでは、複数の命令をフェッチし、デコードし、同時に実行することもできる。しかし、基本的にどんなCPUでもやっていることはここで説明した流れと同じである。
今日(2006年)のCPUのような装置が出てくる以前、「ENIAC」のような計算機は、実行するタスク毎に物理的に配線を変更していた。このような機械では、プログラムを変更するために物理的に再構成する必要があることから「プログラム固定計算機」と呼ばれることがある(なお、ENIACは後に機能と性能を限定すれば、プログラム内蔵方式でも動作した)。
CPU は、一般にソフトウェア(プログラム)を実行する装置として定義されるため、CPUと呼べる最初の装置はプログラム内蔵方式のコンピュータからである。プログラム内蔵方式の考え方は、ENIACの設計時にすでに存在していたが、性能を考慮してENIACでは採用されなかった。ENIACが完成する以前の1945年6月30日、数学者のジョン・フォン・ノイマンは、First Draft of a Report on the EDVAC という論文を発表した。この中で、彼はプログラム内蔵方式のコンピュータの設計について概説し、「EDVAC」は1949年8月に完成した(ノイマンは単に発表しただけである。実際の設計者についてはEDVAC参照)。EDVACは様々な命令の集まりを実行するよう設計されていた。命令を組み合わせることで実用的なプログラムを構成し、EDVACで動作させることができたのである。殊にEDVACではプログラムは高速なメモリに格納されており、物理的に配線を変更することで指定されるものではない点が重要である。ノイマン型の設計では、EDVACで動作させるプログラムを変更するにはメモリを書き換えればよかったのである。
ただし、プログラム内蔵方式という点で何が最初かといえば、EDSAC(1949年)やManchester Mark Iの試作機 Baby (1948年)である。EDVACは先に設計が始まっているが、設計者間のごたごたがあって完成が遅れた。また、アイデアレベルではZuse Z3を後に開発したコンラッド・ツーゼもプログラム内蔵方式を考案していた(1936年に特許申請しているが、アメリカに出願した際にチャールズ・バベッジの解析機関との類似を指摘され、特許は成立していない。ツーゼはこのときまでバベッジの業績を知らなかったと思われる)。データとプログラムを同じ記憶装置に格納するノイマン型と全く異なる方式として、ハーバード・アーキテクチャと呼ばれるものがある。これはEDVAC以前に完成したHarvard Mark Iの方式であり、さん孔テープにプログラムを格納した。ノイマン型とハーバード型の大きな違いは、後者が命令とデータの格納場所と扱いを完全に分離していることであり、前者はどちらも同じ記憶領域に格納していた。最近のCPUは基本的にノイマン型であるが、ハーバード・アーキテクチャも部分的に採用されている(キャッシュメモリなど)。
デジタル機器としてのCPUは、状態を変更したり表現したりするために、何らかのスイッチを必要とする。電気機械式から電子式への移行期には、リレーや真空管がスイッチとして使われた。これらは、従来の完全な機械式よりも高速にスイッチを切り替えられたが、信頼性が低かった。例えば、直流順序論理回路をリレーで構築するには、チャタリングと呼ばれる問題を補正する追加のハードウェアが必要だった。一方、真空管はチャタリングは起こさないが、機能するには熱が必要であり、動作中にカソードの電子放射能力が減退(エミッション減退)して動作不能になってしまう。真空管が故障したら、故障した部位を特定して交換しなければならない。したがって、初期の電子計算機は高速化は実現したものの、電気機械式計算機よりも信頼性が低かった。EDVACのような真空管計算機は故障と故障の間の平均時間(MTBF = Mean Time Between Failure)は約 8 時間であったが、Harvard Mark Iのようなリレー式計算機はほとんど故障しなかった。しかし、信頼性よりも性能が重視され、真空管式計算機が主流となっていった。当時の同期式CPUの動作周波数は現在のCPUに比較すると非常に遅く、100kHz~4MHz程度であった。これは、当時のスイッチ部品(真空管)の切り替えに要する時間によって限定されていたのである。
1964年、IBMが発表した「システム/360」アーキテクチャは、いろいろな性能と大きさのコンピュータとして実装され、それらのシリーズではプログラムを変更することなく動作させることができた。当時、たとえ同じメーカーであっても、サイズの違うコンピュータは互換性がないのが普通だったのである。この改善を成し遂げるため、IBMはマイクロプログラム方式を採用した。これは現在のCPUでも広く使われている手法である。システム/360は大変な成功を収め、その後数十年間汎用コンピュータ市場を支配し続けた。
同じ1964年、DECも、「PDP-8」という後世に影響を与えたコンピュータを、科学分野や研究分野に向けてリリースした。DECは、後にさらに広く使われることとなる「PDP-11シリーズ」を発表したが、このシリーズは、後に集積回路(IC)が使えるようになると、それを使ったバージョンも製造されている。トランジスタを使ったCPUでは、新たな設計上の工夫をする余裕が生じ、SIMDやベクトル計算機と呼ばれるものが出現した。そのような初期の実験的設計は、後にクレイ社の製造したスーパーコンピュータのベースとなっている。
トランジスタを使ったコンピュータは、それ以前のものと比較していくつかの明確な利点があった。信頼性向上と消費電力低下はもちろん、トランジスタによるスイッチは切り替え時間が劇的に短縮されたため、CPUが高速化されたのである。トランジスタによるコンピュータでは動作周波数は数十MHzまで高速化された。
複雑さ、大きさ、構造、一般的な形状はこの60年間で劇的に変化したが、CPUの基本的な機能とデザインはほとんど変化していない。今日のCPUのほとんどはフォン・ノイマンが描いたプログラム内蔵方式を採用している。
先に触れたムーアの法則は未だに現実に即しているが、トランジスタの集積技術の限界が近づきつつあることが懸念されている。電子回路をあまりに縮小すると、エレクトロマイグレーションや閾値下リークのような現象の効果が大きくなるためである。これらの新たな懸念があるため、研究者は量子コンピュータのような新たな技術を模索するとともに、並列性などの手法の活用でノイマン型をさらに高速化する技術も研究している。
数値表現方法に関連して、CPUが扱える数値の範囲(サイズと精度)も設計時に選択される。二進数を採用したCPUでは、ビットがひとつの桁を意味する。CPUが数値として扱うビット数を「ビット幅」あるいは「データパス幅」、「整数精度」(そのビット数が整数を表現するサイズである場合)などと言う。この数はアーキテクチャによって異なり、非常に近いCPUでもここだけを変更する場合がある。たとえば、8ビットCPUが扱う数の範囲は、8桁の二進数で表せる範囲であり、28 あるいは 256種類の値を表せる。ビット幅は、CPUが指定できるメモリ位置の範囲をも限定する。たとえば、二進数のCPUが 32ビットでメモリアドレスを表現し、あるアドレスによってオクテット(8ビット)を指定できるとすると、そのCPUがアドレス指定できるメモリ量は、232オクテットつまり 4ギガバイトとなる。これはCPUのアドレス空間の非常に簡単な見方であり、多くの設計ではもっと複雑なアドレス指定方法を使用して、同じビット幅でも広いアドレス指定ができるようにしている。
整数精度を上げると桁が増えた分だけ回路が増え、複雑になり、電力を消費し、コストが高くなる。これは、32ビットや64ビットのマイクロプロセッサがあるのに、4ビットや8ビットのマイクロコントローラが何故今でも組み込みシステム用に使われているかを考えれば明らかである。単純なマイクロコントローラは安価で、低消費電力で、発熱が少なく、電子部品として扱いやすい。しかし、ビット幅を増やすことで利益を得られる分野(特にアドレス空間が広いことが有益となる場合)もあり、そのような分野のためにビット幅の大きなCPUが作られてきた。以上のことから、小さなビット幅のCPUから大きなビット幅のCPUまで、様々なCPUが製造されている。たとえば、IBM のシステム/370は 32ビットのCPUを使っているが、内部には 128ビット精度の浮動小数点数ユニットがあって、浮動小数点演算の精度と範囲を高めている。後のCPUデザインでも同様のビット幅の混合をしていて、特に汎用プロセッサは整数と浮動小数点数のビット幅のバランスをとる必要がある。
以下に、現在主に使用されているCPUのビット数を挙げる。
パイプラインだけでは同期式CPUの問題を全て解決することはできない。たとえば、クロック信号は他の電気信号の遅延に影響される。クロック周波数が高くなり、さらに複雑なCPUを動作させようとしたとき、全回路を同期させるのが困難になってきた。このため、多くの最近のCPUではひとつのクロック信号でCPU全体を同期するのではなく、いくつかのクロック信号で各部分を個別に同期させるようにしている。また、クロック周波数が高くなるにつれてCPUの発熱が大きな問題となってきた。クロックがON/OFFを繰り返すことで多くのスイッチがON/OFFを繰り返すため、その回路が使われていようがいまいが、発熱してしまうのである。一般に、スイッチ部品は切り替えをしていないときよりも切り替えをしたときの方がエネルギーを消費する。そのため、クロック周波数が高くなると発熱も多くなり、CPUをもっと効率よく冷却する必要が生じるのである。
不要な部分でのスイッチ切り替えに対処する方法としてクロックゲートと呼ばれる方法がある。これは使わない部分へのクロック信号供給を切ってしまう方法である。しかし昨今のプロセステクノロジでは消費電力に対するリーク電流の比率が大きくなり、クロック信号をカットしただけでは大きな効果が期待できなくなりつつある。そこで別の解決法として動作していないモジュール等への電源供給を絶てるよう制御する方法もある。しかしこの方法も最近のCPUが消費する大電流を制御することは容易ではなく、また効果的にモジュールをON-OFFすることも困難である。 他にはクロック信号をなくしてしまう方法もある。クロック信号をなくすると、設計は非常に難しくなるがクロック無し(あるいは非同期)設計は消費電力と発熱の面で大きな利点がある。あまり一般的ではないが、クロックを無くしたCPUも存在する。たとえば、ARMアーキテクチャ互換のAMULETとMIPS R3000 互換の MiniMIPS がある。クロックを完全に無くするのではなく、部分的に非同期化したCPU設計も存在する。たとえば、非同期ALUを使ってスーパースカラーのパイプラインを構成することで演算性能を上げようとした設計などがある。全体を非同期かしたときに、同期動作するCPUに比較して性能が向上するかどうかは定かではないが、少なくとも単純な数値演算では効果がある。
Централен процесор | Procesor | Procesor | Central Processing Unit | Central Processing Unit | Central processing unit | Procezilo | CPU | پردازنده | Suoritin | Processeur | מעבד | Procesor | CPU | CPU | CPU | 중앙처리장치 | Processor centralis | Procesorius | Procesors | Unit Pemproses Pusat | Processor | CPU | Jednostka centralna (procesor) | CPU | Центральный процессор | CPU | Procesor | Процесор | CPU | หน่วยประมวลผลกลาง | CPU | 中央处理器