プログラム内蔵方式計算機 (stored program computer) --- 2進数で生成されたプログラムをメモリに内蔵し、これを定義された方法で 実行するコンピュータのことです。 ノイマン型コンピュータ(= von Neumann Computer)とも呼ばれます。
(注)非ノイマン型コンピュータには、
コンピュータの発展
基本的なノイマン型コンピュータの特徴
プロセッサ(CPU = Central Processing Unit, 中央処理装置) は、 2進数で表現された機械語命令(machine instructions)を処理します。 この機械語命令の列がプログラムです。 ユーザは希望する計算を行なわせるために、命令を命令セット (instruction set) から選んでプログラムとして並べます。 通常はプログラムは高級言語で書かれ、コンパイラによって アセンブリ言語(asembly language)へと翻訳され、 さらにアセンブラによって機械語に変換されます。 機械語プログラムはハードディスクなどの2次記憶装置上に ファイルとして置かれていて、 必要に応じて主記憶に読み込まれて、 さらに必要に応じて部分的にCPUに読み込まれて実行されます。 このように、
主記憶は連続したアドレス(Address、番地)からなる記憶場所であり、 通常8bit(=1byte)単位でデータを記憶します。 ASCII文字は1byteの中におさまりますが、もっと大きなデータは 連続する複数の記憶場所を用いて記憶します(2byte, 4byte, 8byte単位など)。 このとき、その(複数バイトの)データのアドレスはその中の最も小さな アドレスで表します。
(例) 0x12345678 という32ビットデータを100番地〜103番地に記憶する場合 100 101 102 103 (番地) 0x78 0x56 0x34 0x12 ← little endian 0x12 0x34 0x56 0x78 ← big endian通常はbig endianであろうとlittle endianであろうと気にする必要はありませんが、 通信によって異なるシステムの間でデータを転送するときには注意が必要となります (big endianに変換してから送るべきです)。
機械語命令では、演算の種類(operation, 加算や減算など)と、 オペランド(=演算の対象を指定します。 直接の値、レジスタ、メモリ中の番地など) を指定する必要があります。
[一般的な命令のフォーマット] 命令の種類 第1オペランド 第2オペランド 結果を格納する場所この他に、次に実行されるべき命令のアドレスを必要とする アーキテクチャもありました(EDVAC, 1940年代)。 しかし、現在では次のアドレスに置かれた命令を次に実行する (次に実行する命令を変えるには分岐命令を使う)のが一般的ですので、 そのため第4オペランドは使われません。
オペランドを保持する目的でレジスタ(register)が導入されました。 オペランドや計算結果を全てレジスタに保持するようにしても 構いません (レジスタ対レジスタ演算、register-register operation)。
オペランドの場所を指定するために、いろいろな アドレッシングモード (addressing modes)が使われます。 アドレスの計算がすべて終ってからオペランドの 実際のアドレスが決定されます。 このアドレスを実効アドレス(effective address)と呼びます (以下の5種類がよく使われます)。
CPUの設計によって、機械語命令は
プロセッサ内部では、内部バスが以下の構成要素を接続しています。
これらの動作は、さらに細かい連続したステップに分解できます。 制御ユニットは、各ステップを開始する信号を正しいタイミングで 生成してCPUを正しく動作させます。 この制御ユニットの制御方法としては2種類があります。
マイクロプログラムを使う方式は1951年に提唱されましたが、 実際に使われるようになったのは高速なプロセッサ内 制御メモリが作れるようになった1960年代からです。 しかし、1980年代にRISC(簡単な命令セットのみを持つ)が登場し、 現在ではマイクロプログラムを使う方式は廃れています。
IPS (instructions per second) -- 「1秒間に何回基本的な機械語命令を実行できるか」を表します。 MIPS (mega instructions per second) = 10^6 IPS GIPS (giga instructions per second) = 10^9 IPS (M --> million という場合もある) FLOPS (floating point operations per second) --- 「1秒間に何回浮動小数点演算を実行できるか」 を表します。 MFLOPS (mega instructions per second) = 10^6 FLOPS GFLOPS (giga instructions per second) = 10^9 FLOPS
クロック周期 10ns → クロック周波数 100MHz
1960年代後半から、集積回路技術の発展によって同じ面積により多くの回路を 実現することが可能になり、 小規模集積回路(SSI: Small scale integration, 1〜12ゲート), 中規模集積回路(MSI: Medium scale integration, 12〜100ゲート), 大規模集積回路(LSI: Large scale integration, 100〜1,000ゲート), 超大規模集積回路(VLSI: Very large scale integration, 1,000ゲート以上) へと発展してきました。 この過程においてVLSIでマイクロプロセッサが開発されました。
1971年 Intel 4004 1970年代中旬 Intel 8080, Motorola MC6800, Zilog Z-80 1978年 Intel 8086, Motorola MC68000 1980年代 Intel 80286, Motorola MC68010 80386 MC68020,MC68030 1990年代 486 MC68040 Pentium MC88000(RISC) ... ...
回路の集積度をあげるには最小線幅を小さくしていく 必要があります。 細い線幅を利用できれば、同じ面積に多くの トランジスタを作り込むことができますし、 またゲート伝播遅延(gate propagation delay time)も 小さくできます。 素子の高密度化とそれにともなうゲート伝播遅延の縮小化によって、 プロセッサのクロック周波数はどんどん増大(高速化)しています。 (PentiumIII: 〜1.2GHz、Pentium4: 〜2GHz)。
マイクロプロセッサ開発過程における重要な特徴は、クロックスピードの 高速化です。
70年代 80年代 90年代前半 90年代後半 2000年台 ... 1-8MHz 8-20MHz 50-100MHz 200-800Mhz 1GHz-..クロック2倍化技術も90年代初頭に実現されました(例,intel 486DX2)。 クロック3倍化、4倍化も行なわれています。
初期のマイクロプロセッサでは、平均して1クロックで 高々1命令を実行するだけでした。 このような、1度に1つの命令だけが実行可能であるプロセッサを スカラ・プロセッサ (scalar processor) とよびます。 これにたいして、1サイクルで複数の命令を実行するプロセッサ (90年代前半に登場しました)を スーパースカラ・プロセッサ (super scalar processor) とよびます。 ALUなどの演算ユニットを複数持つことで実現されています。 スーパースカラのユニット数は2〜3の場合がほとんどです (これ以上の命令が並列に実行可能である可能性は少いので)。
(例) スカラプロセッサ スーパースカラ・プロセッサ Intel 486 → Intel Pentium (2並列、u,vユニット) Micro SPARC → SuperSPARC (3並列)
マイクロプロセッサシステムの基本アーキテクチャにおいては、 バス(bus,共通線の集合)によって
バスには次の3種類があります。
(例) Intel 8080 (8bit CPU) ---- 8本線 Intel 8085 (16bit CPU) ---- 8本線 Intel 8086 (16bit CPU) ---- 16本線 MC68000 (32bit CPU) ---- 16本線 MC68020 (32bit CPU) ---- 32本線 Intel 486 (32bit CPU) ---- 32本線 Intel Pentium (32bit CPU) ---- 64本線
(例) Intel 8080 (8bit CPU) --- 16本線 (2^16=64Kbyteアクセス可能) Intel 8086 (16bit CPU) --- 20本線 (2^20=1Mbyteアクセス可能) MC68020/30/40 --- 32本線 (2^32=4Gbyteアクセス可能) Intel 386/486/Pentium (32bit CPU) --- 32本線 (2^32=4Gbyteアクセス可能)
Intel 8086 ファミリや Motorola MC68000 ファミリなどの プロセッサが発達していく中で、80年代に全く新しい発想で 設計されたプロセッサが出現しました。
CISCの発想→「複雑な動作やアドレスモードを持つ命令を用いて ハードウェアで実行すれば、同じことを基本的な命令だけで 組み合わせて行なうよりも速い」
「複雑な命令」や「複雑なアドレッシングモード」CISCでは 100〜300種類の命令と、8〜20種類のアドレッシング・モードを 持ちます。
CPU 命令数 アドレッシング・モード VAX-11/780 303 16 MC68020 109 18 80386 111 8 486 117 11
複雑な命令を採用すると、たくさんの種類の命令やアドレッシング・ モードを表すために、一般に命令コードが長くなります。 しかし、頻繁に使用される命令のコードが長いと実行速度に 悪影響を与えます、頻繁に使用される命令は短いコードで 表現することになります。こうして、命令語長を可変とする 必要がでてくるわけです。
(例) MC68000: 1〜5 word(2byte), 8086: 1〜6 byte, VAX11-780: 2〜57byte
1970年代下旬に生まれた疑問 →
「複雑な命令はプロセッサの動作にどのような影響を与えるのだろうか。
また、追加された命令はシステムの速度を本当に向上させるのだろうか?」
調査で判明→
「使われているのは単純な命令や単純なアドレッシングモードがほとんど。
複雑な命令はあまり使われていないし、実行速度の向上には役立っていない。」
Hennessy & Patterson (1990) は数種類のCPUの命令の使用頻度を調べました。 8086に関する結果は以下の通りです。
Programm | (1) | (2) | (3) | 平均 |
---|---|---|---|---|
Operand Access | ||||
Memory | 37 | 43 | 43 | 41 |
Immeidiate | 7 | 11 | 5 | 8 |
Register | 55 | 46 | 52 | 51 |
Memory Addressing | ||||
Indirect | 12 | 9 | 15 | 12 |
Absolute | 36 | 18 | 34 | 30 |
Displacemen | 52 | 73 | 51 | 59 |
Instruction type data transfer | ||||
MOV | 30 | 30 | 21 | 29 |
PUSH/POP | 12 | 18 | 8 | 12 |
LEA | 3 | 6 | 0 | 3 |
Arithmetic/logical | ||||
CMP | 9 | 3 | 3 | 7 |
SAL/SHR/RCR | 0 | 3 | 12 | 5 |
INC/DEC | 3 | 3 | 3 | 5 |
ADD | 3 | 3 | 31 | 3 |
OR/XOR | 1.5 | 4.5 | 3 | 3 |
その他 | - | - | - | 3 |
Control/call | ||||
JMP | 3 | 1.5 | 1.5 | 2 |
LOOP | 0 | 0 | 12 | 4 |
CALL/RET | 3 | 6 | 3 | 4 |
条件分岐 | 12 | 12 | 6 | 10 |
オペランドへのアクセスはほとんどがレジスタへのアクセス(51%)であり、 命令の中では転送命令の割合が高い(MOVが29%, PUSH/POPが12%,条件分岐が10%) ことが判りました。
CISC では、以下のような使用頻度の高い命令は短くコード化しています。
次のような疑問について、基本に立ち戻ってプロセッサを設計し直すと RISCの概念に辿り着きます。
RISCは、「全体として性能が向上するならば複雑さをソフトウェアに 押し込む(=ハードウェアを簡単にすることによって処理速度を向上させる)」 という思想に基づいています。 頻繁に使われる基本演算はハードウェアで実現する一方、 あまり使われない複雑な演算は他の演算の実行速度に悪影響を 及ぼす場合は用意しないわけです。
RISCに対する反論:「機械語命令が単純であればプログラムは大きくなり
(キャッシュに入りきらなくなるなどの原因で)遅くなる」
反論への反論:「最適化されたコードが生成されるのでそんなに
プログラムは大きくはならない」
CISCにもRISCの長所を採り入れる動きがあります (多数のレジスタ、プロセッサの内部情報を利用する 最適化コンパイラ、など)。 最近は、CISCの機械語を採用していても、CPUの内部では RISCに基づく高速なハードウェアで命令を処理している例もあります。 例えば Pentium では、CISCのi486の命令コードを RISC86 という RISC命令に内部で変換してRISCに基づくハードウェアで 処理しています。
RISC I | RISC II | MIPS | |
---|---|---|---|
レジスタ数 | 78 | 138 | 16 |
命令数 | 31 | 39 | 55 |
アドレシングモード | 2 | 2 | 2 |
命令フォーマット | 2 | 2 | 4 |
パイプラインステージ | 2 | 3 | 5 |