CPU
出典: フリー百科事典『ウィキペディア(Wikipedia)』
CPU(シーピーユー、Central Processing Unit - セントラルプロセッシングユニット)は、プログラムによって様々な数値計算や情報処理、機器制御などを行うコンピュータにおける中心的な電子回路である。中央処理装置(ちゅうおうしょりそうち)あるいは中央演算処理装置(ちゅうおうえんざんしょりそうち)とも言われる。
目次 |
[編集] 概要
CPUは記憶装置上にあるプログラムと呼ぶ命令列を順に読み込み、解釈し、その結果に従ってデータの移動や加工を行う。CPU外部にはバスやインタフェースを介して表示装置や通信装置、補助記憶装置などの周辺機器や主記憶装置が接続され、データやプログラムのやりとりを行う。このようなCPUを用いたプログラムによるコンピュータの逐次動作をプログラム内蔵方式と言い、ほとんどのコンピュータアーキテクチャの基本原理となっている。
現在では概して1チップのLSIに集積されており、MPU(Micro Processing Unit)またはマイクロプロセッサと呼ぶこともある。また、算術演算機能を強化し信号処理に特化したDSPや、DA/AD,GPIO,シリアルコントローラ,タイマー,DMAC,メモリなどの周辺機器を搭載し組込み機器制御を目的としたマイクロコントローラ(マイコン)などの展開種も登場している。
各種専用回路と比べ実行速度は遅いが、比較的簡易な構造でもプログラム次第で多様な処理を行えることから、非常に多岐にわたる用途に用いることが可能である。また、プログラムの命令には条件分岐などのプログラム制御命令も含まれるため、自律動作なども可能となる。以上のような特徴を持つため、CPUはおよそあらゆるシステムに内蔵され、現代の産業や生活の屋台骨を支える存在にまで普及している。現在最も普及しているCPUアーキテクチャの一つにARMアーキテクチャが挙げられる。ARMアーキテクチャは、2006年第2四半期までの一年間だけで20億2,600万以上の製品に搭載される[1]など、家電製品から工業製品、携帯機器などに至るまで様々なシステムに組み込まれ、機器制御を司っている。また、PCなど現在の汎用コンピュータ製品における殆どのメインCPUにインテル社のx86シリーズやAMD社等のチップが用いられており、特にインテルのx86系CPU出荷数は1978年6月9日の8086リリースから2003年までの25年で10億個を越えた[2]。
CPU(Central Processing Unit)という用語は、特定のクラスのプログラム可能論理マシンを表す用語である。この定義は "CPU" という用語が広く使われるようになる前の初期のコンピュータにも適用可能である。この用語が一般に使われるようになったのは1960年代になってからだが、CPUの構造は1949年に世界最初のストアードプログラム方式コンピュータであるEDSACが発表された時点で現在とほぼ同じ仕組みが完成しており、CPUの発達史はスケールアップと高速化が中心となっている。
[編集] 構造と動作
[編集] 構造
CPUは演算をするALU、データを一時記憶するレジスタ、メモリーや周辺機器との入出力を行うバスインターフェース、CPU全体を制御する制御部分などで構成される。その他 浮動小数点演算を行うFPU(浮動小数点演算ユニット)、レジスタより多くの情報を一時記憶するキャッシュメモリ、DMAコントローラ、タイマー、シリアルインターフェースなどの機能をCPUと同一IC内にもつものもある。また、メモリから読み込んだ命令語を内部的なオペレーションに置き換える変換部を持つものもある。
CPUを構成する各部の動作はクロック信号によって規則正しいタイミングで統制されている。同じCPUであればクロック周波数が高い方が一定時間に多くの処理を行え、高速に動作する。1クロックで行える処理の内容はCPUの設計により異なり、1つの機械語命令を実行するのに複数クロックかかるものから1クロックで複数の命令の実行を同時に行えるものまである。クロック周波数1GHzのCPUであれば、1秒間に10億回の基本動作を行う事ができる。
多くのCPUでは、大まかに言って制御部が命令の解釈とプログラムの流れの制御を行い、演算部が実行を行うので、同時に実行されるのは1命令だけであるが、非ノイマン型のCPUや画像処理など高速性が要求される用途向けのCPUでは、同時に複数の命令を実行できるように複数の実行部を同一IC内に持っているものがある。
[編集] 動作
CPUの基本的な動作は、その実装に関わらずプログラムと呼ばれる命令列を順番に実行することである。プログラムは数値列として何らかのメモリに格納されている。CPUでは、フェッチ、デコード、実行という3つのステップがほぼ必ず存在する。
最初の段階であるフェッチとは、実行すべき命令(ある数値または数値の並び)をプログラムの置かれたメモリから取り出すことである。メモリ上の実行すべき命令の位置はプログラムカウンタで指定される。プログラムカウンタはCPUが今現在見ているプログラム上の位置を示しているとも言える。命令フェッチに使用されると、プログラムカウンタはフェッチしたぶんだけ増加させられる。
CPUがメモリからフェッチした命令によってCPUの次にすべきことが決定される。デコードでは、命令をCPUにとって意味のある形式に分割する。命令を表す数値をどう分割するかは、予めそのCPUの命令セットで決定される。命令の一部の数値は命令コードと呼ばれ、実行すべき処理を指定する。その他の部分はオペランドと呼ばれ、その命令で使用する情報を示している。たとえば加算命令のオペランドは加算すべき数値を示している。オペランドには数値そのものが書かれていたり、数値のある場所(メモリのアドレスかレジスタの番号)が書かれている。古い設計では、デコーダ(デコードを行う部分)は変更不可能なハードウェア部品だった。しかし、より複雑で抽象的なCPUや命令セットではマイクロプログラム方式がしばしば使われ、命令を様々な信号に変換するのを助けている。このマイクロプログラムは書き換え可能な場合があり、製造後でも命令デコード方法を変更することができる。
フェッチとデコードの次は、実行ステップが行われる。このステップでは、CPUの多くの部分が接続され(たとえばマルチプレクサを切り替えるなどして)指定された操作を実行する。たとえば、加算を要求されている場合、ALUが所定の入力と接続され、出力と接続される。入力は加算すべき数値を提供し、出力には加算結果が格納される。加算結果が大きすぎてそのCPUに扱えない場合、算術オーバーフローフラグをフラグレジスタ(ステータスレジスタ)にセットする(RISCではフラグレジスタが存在しない場合もある)。入力や出力にはいろいろなものが使用される。演算結果が一時的かあるいはすぐに利用される場合にはレジスタと呼ばれる高速で小さなメモリ領域に格納される。メモリも入力や出力に使われる。レジスタ以外のメモリは低速だが、コスト的には一般的なメモリの方が安価であり大量のデータを格納できるため、コンピュータには必須である。
いくつかの命令はプログラムカウンタを操作する。それらは一般にジャンプ命令と呼ばれ、ループを構成したり、条件分岐をしたり、サブルーチンを実現するのに使われる。また、多くの命令はフラグレジスタを変化させる。それらのフラグはプログラムの動作に影響を与える。たとえば比較命令は二つの値を比較してフラグレジスタにその大小を示す値をセットする。そして、その値を使用してその後の処理の流れを決定するのである。
命令を実行後、同じ流れが繰り返されて次の命令をプログラムカウンタにしたがってフェッチする。もっと複雑なCPUでは、複数の命令をフェッチし、デコードし、同時に実行することもできる。しかし、基本的にどんなCPUでもやっていることはここで説明した流れと同じである。
[編集] 歴史
今日(2008年)の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程度であった。これは、当時のスイッチ部品(真空管)の切り替えに要する時間によって限定されていたのである。
[編集] トランジスタ製CPU
CPUの設計と複雑さの進化は、さらに小型で信頼性の高い電子部品を使うことで達成された。その最初の進化はトランジスタの発明である。これによって、1950年代から1960年代には、かさばって信頼性の低い真空管やリレーは使われなくなり、トランジスタ製CPUが主流となった。この改善によってさらに複雑で信頼性のあるCPUを一枚から数枚のプリント基板で構成できるようになったのである。
1964年、IBMが発表した「システム/360」アーキテクチャは、いろいろな性能と大きさのコンピュータとして実装され、それらのシリーズではプログラムを変更することなく動作させることができた。当時、たとえ同じメーカーであっても、サイズの違うコンピュータは互換性がないのが普通だったのである。この改善を成し遂げるため、IBMはマイクロプログラム方式を採用した。これは現在のCPUでも広く使われている手法である。システム/360は大変な成功を収め、その後数十年間汎用コンピュータ市場を支配し続けた。
同じ1964年、DECも、「PDP-8」という後世に影響を与えたミニコンピュータを、科学分野や研究分野に向けてリリースした。DECは、後にさらに広く使われることとなる「PDP-11シリーズ」を発表したが、このシリーズは、後に集積回路(IC)が使えるようになると、それを使ったバージョンも製造されている。トランジスタを使ったCPUでは、新たな設計上の工夫をする余裕が生じ、SIMDやベクトル計算機と呼ばれるものが出現した。そのような初期の実験的設計は、後にクレイ社の製造したスーパーコンピュータのベースとなっている。
トランジスタを使ったコンピュータは、それ以前のものと比較していくつかの明確な利点があった。信頼性向上と消費電力低下はもちろん、トランジスタによるスイッチは切り替え時間が劇的に短縮されたため、CPUが高速化されたのである。トランジスタによるコンピュータでは動作周波数は数十MHzまで高速化された。
[編集] マイクロプロセッサ
詳細はマイクロプロセッサを参照
CPUの実装と設計を大きく変えた最近の技術革新は、1970年代中頃に登場したマイクロプロセッサである。世界初のマイクロプロセッサは1970年(Intel 4004)であり、広く使われるようになったのは1974年(Intel 8080)であるが、このクラス(8ビット)のCPU実装方法は完全にマイクロプロセッサだけになってしまった。それ以前のCPUが一枚から数枚の基板で実装されていたのに対して、マイクロプロセッサではそれを小さな集積回路(IC)にまとめ、多くの場合シングルチップでCPUを実現している。トランジスタのサイズが小さくなることによってゲートの静電容量が減るので、スイッチとしてもさらに高速化した。そのため、同期式マイクロプロセッサの動作周波数は数十MHzから数GHzが可能となった。また、IC上のトランジスタは技術の向上にしたがって小さくなっていき、CPUを構成するトランジスタ数は飛躍的に多くなって機能も複雑化していった。この傾向はムーアの法則と呼ばれ、CPU(IC)の高速化・集積化を正確にモデル化していた。
複雑さ、大きさ、構造、一般的な形状はこの60年間で劇的に変化したが、CPUの基本的な機能とデザインはほとんど変化していない。今日のCPUのほとんどはフォン・ノイマンが描いたプログラム内蔵方式を採用している。
先に触れたムーアの法則は未だに現実に即しているが、トランジスタの集積技術の限界が近づきつつあることが懸念されている。電子回路をあまりに縮小すると、エレクトロマイグレーションや閾値下リークのような現象の効果が大きくなるためである。これらの新たな懸念があるため、研究者は量子コンピュータのような新たな技術を模索するとともに、並列性などの手法の活用でノイマン型をさらに高速化する技術も研究している。
CPU年表も参照
[編集] デザインと実装
[編集] ビット幅
CPUが数値を表現する方法は設計時に選択され、装置の機能を大きく左右する。初期のデジタルコンピュータは十進記数法で数値を表現するのが普通だった。他には三進数を採用したものもある。それ以降は二進記数法を採用するのが一般化した。二進数では各桁はふたつの値(1 と 0)しかとらないので、高い電圧と低い電圧でそれを表すことができる。
数値表現方法に関連して、CPUが扱える数値の範囲(サイズと精度)も設計時に選択される。二進数を採用したCPUでは、ビットがひとつの桁を意味する。CPUが数値として扱うビット数を「ビット幅」あるいは「データパス幅」、「整数精度」(そのビット数が整数を表現するサイズである場合)などと言う。この数はアーキテクチャによって異なり、非常に近いCPUでもここだけを変更する場合がある。たとえば、8ビットCPUが扱う数の範囲は、8桁の二進数で表せる範囲であり、28 あるいは 256種類の値を表せる。ビット幅は、CPUが指定できるメモリ位置の範囲をも限定する。たとえば、二進数のCPUが 32ビットでメモリアドレスを表現し、あるアドレスによってオクテット(8ビット)を指定できるとすると、そのCPUがアドレス指定できるメモリ量は、232オクテットつまり 4ギガバイトとなる。これはCPUのアドレス空間の非常に簡単な見方であり、多くの設計ではもっと複雑なアドレス指定方法を使用して、同じビット幅でも広いアドレス指定ができるようにしている。
CPUの持っているビット数には下記の要素がある。
- アドレスbit幅
- 外部データバス幅
- 内部データバス幅
- レジスタのbit幅
- ALUbit幅
- 命令長
しかしこれらの要因を以て×bitCPUと断ずる事はできない。 アドレスbit幅は8bitCPUに於いては16bit幅以上ある事が通常で、32bitCPUでは24bitなど、×bitCPUと称する場合のbit数と一致しない事が多数ある。 外部データバス幅は16bitCPUで外部データバス8bit、32bitCPUで外部バス16bitなど、これも×bitCPUと称する場合のbit数と一致しない事が多数ある。 内部データバス幅は32bitCPUで内部データバス64bitの例がある。 レジスタのbit幅では16bitCPUで32bitレジスタを持つCPUがある。 ALUは8bitCPUで4bitALUのCPUがある。 命令長はCISCに於いては複数のbit幅が混在しており、RISCに於いても32bitCPUで16bitなどがある。
現在は4ビットから64ビットなど多様なビット幅のCPUが製品化されている。これは高ビット幅のCPUは機能や性能が高い反面、高集積化や回路の複雑度から高価格で消費電力も大きいが、低ビット幅のCPUは機能や性能が制限される代わりに安価で低消費電力であるなど特色があるためであり、状況に応じて使い分けられている。
以下に、現在主に使用されているCPUのビット数を挙げる。
- 8, 16bit:家電製品など小規模な装置の制御用、低性能携帯型ゲーム機
- 32bit:多くのパーソナルコンピュータ、組み込みシステムで携帯電話やPDAなど比較的性能が要求される装置、高性能携帯型ゲーム機、代表的なコンシューマーゲーム機
- 64bit:サーバなど大量のデータを処理するコンピュータ。AMDのAthlon64やIntel 64に対応したIntelのPentium4などと、Windows XP Professional x64 Editionを組み合わせると家庭でも64bitを体感できるが、パフォーマンスもあまり向上せず、現時点でx64 Editionを使用する理由はほとんどない。だが次世代Windowsやさらに次の世代には64bitが標準となる見通しである。またAppleのMacintoshでは64bitのPowerPC970(G5)が一部機種に使われている。
またかつて、互いに結合し自由にビット長を増やす事が出来る方式のCPUがあり、これはビットスライスプロセッサと呼ばれた。代表的な製品にAMDのAM2900シリーズなどが挙げられる。AM2901は、スイス連邦工科大学のLilithワークステーション等に使用されていた。
またデータをバイト単位で扱うCPU(バイトマシン)の他、ワード単位で扱うCPU(ワードマシン)も現存する(日本電気のACOS-6など)。
[編集] クロック周波数と発熱
ほとんどのCPU(もっと言えばほとんどの順序論理回路)は同期式である。つまり、CPUは同期信号にしたがって動作するよう設計されている。この信号は「クロック信号」として知られていて、一定周期の方形波の形であることが多い。電気信号の速度からCPU内の信号経路の長さを考慮してクロック信号の周波数が決定される。この周波数は信号伝播の最悪ケースを考慮して決めなければならない。最悪ケースを考慮して周波数を決定すれば、CPU全体が波形のエッジ部分で動作するよう設計でき、CPUの設計を簡略化できると同時にトランジスタ数も減らすことができる。しかし、この設計手法の欠点としてCPU全体が最も遅い部分を待つように設計しなければならず、全体の高速化がその遅い部分によって制限される。この制限に対処するために命令パイプラインやスーパースケーラといった手法が採られてきた。
パイプラインだけでは同期式CPUの問題を全て解決することはできない。たとえば、クロック信号は他の電気信号の遅延に影響される。クロック周波数が高くなり、さらに複雑なCPUを動作させようとしたとき、全回路を同期させるのが困難になってきた。このため、多くの最近のCPUではひとつのクロック信号でCPU全体を同期するのではなく、いくつかのクロック信号で各部分を個別に同期させるようにしている。また、クロック周波数が高くなるにつれてCPUの発熱が大きな問題となってきた。クロックがON/OFFを繰り返すことで多くのスイッチがON/OFFを繰り返すため、その回路が使われていようがいまいが、発熱してしまうのである。一般に、スイッチ部品は切り替えをしていないときよりも切り替えをしたときの方がエネルギーを消費する。そのため、クロック周波数が高くなると発熱も多くなり、CPUをもっと効率よく冷却する必要が生じるのである。
不要な部分でのスイッチ切り替えに対処する方法としてクロックゲートと呼ばれる方法がある。これは使わない部分へのクロック信号供給を切ってしまう方法である。しかし昨今のプロセステクノロジでは消費電力に対するリーク電流の比率が大きくなり、クロック信号をカットしただけでは大きな効果が期待できなくなりつつある。そこで別の解決法として動作していないモジュール等への電源供給を絶てるよう制御する方法もある。しかしこの方法も最近のCPUが消費する大電流を制御することは容易ではなく、また効果的にモジュールをON-OFFすることも困難である。 他にはクロック信号をなくしてしまう方法もある。クロック信号をなくすると、設計は非常に難しくなるがクロック無し(あるいは非同期)設計は消費電力と発熱の面で大きな利点がある。あまり一般的ではないが、クロックを無くしたCPUも存在する。たとえば、ARMアーキテクチャ互換のAMULETとMIPS R3000 互換の MiniMIPS がある。クロックを完全に無くするのではなく、部分的に非同期化したCPU設計も存在する。たとえば、非同期ALUを使ってスーパースカラーのパイプラインを構成することで演算性能を上げようとした設計などがある。全体を非同期化したときに、同期動作するCPUに比較して性能が向上するかどうかは定かではないが、少なくとも単純な数値演算では効果がある。
[編集] 並列化
詳細はスーパースケーラ、マルチコア、並列コンピューティングをそれぞれ参照
[編集] 企業および製品
CPU製品一覧を参照
[編集] 関連項目
- CPU年表
- キャッシュメモリ
- ALU、FPU、スタックマシン、マイクロコントローラ
- CISC / RISC
- バス (コンピュータ)
- ソフトウェア工学
- CPUの冷却装置
- CPUのデザイン
- パイプライン処理
- 命令セット
- マイクロプロセッサ
- マイクロプログラム方式
- スーパースケーラ
- ベクトル計算機
- オーバークロック
- 自作パソコン
[編集] 参考文献
- ジョン・L・ヘネシー/デイビッド・A・パターソン著、富田眞冶/村上和彰/新實治男訳、『コンピュ-タ・ア-キテクチャ 設計・実現・評価の定量的アプローチ』、日経BP社、ISBN 4-8222-7152-8
- デイビッド・A・パターソン/ジョン・L・ヘネシー著、成田光彰訳、『コンピュータの構成と設計 ハードウエアとソフトウエアのインタフェース 第3版(上/下)』、日経BP社、ISBN 4-8222-8266-X/ISBN 4-8222-8267-8
- マイク・ジョンソン著、村上和彰監訳、『スーパスカラ・プロセッサ- マイクロプロセッサ設計における定量的アプローチ -』、日経BP社、ISBN 4-8227-1002-5
- 中森章著、『マイクロプロセッサ・アーキテクチャ入門 RISCプロセッサの基礎から最新プロセッサのしくみまで TECHI Vol.20』、CQ出版社、ISBN 4-7898-3331-3