コンピュータ・アーキテクチャ



コンピュータシステムの基礎

プログラム内蔵方式計算機 (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の設計によって、機械語命令は

の2通りの場合があります。

プロセッサの内部構造

プロセッサ内部では、内部バスが以下の構成要素を接続しています。

プロセッサの動作

これらの動作は、さらに細かい連続したステップに分解できます。 制御ユニットは、各ステップを開始する信号を正しいタイミングで 生成してCPUを正しく動作させます。 この制御ユニットの制御方法としては2種類があります。

マイクロプログラムを使う方式は1951年に提唱されましたが、 実際に使われるようになったのは高速なプロセッサ内 制御メモリが作れるようになった1960年代からです。 しかし、1980年代にRISC(簡単な命令セットのみを持つ)が登場し、 現在ではマイクロプログラムを使う方式は廃れています。


性能の改善方法

プロセッサの実装技術

1970年代は TTL/CMOS か ECL のどちらを用いるかが技術的選択の 大きな問題でした。 MOSは1980年代中頃動作速度が大きく改良されて速くなったため、 現在では多くのチップがMOS技術を採用しています。

計算速度

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

クロック周波数


マイクロプロセッサシステム

マイクロプロセッサファミリの開発過程

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 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
Memory37434341
Immeidiate71158
Register55465251
Memory Addressing
Indirect1291512
Absolute36183430
Displacemen52735159
Instruction type data transfer
MOV30302129
PUSH/POP1218812
LEA3603
Arithmetic/logical
CMP 9337
SAL/SHR/RCR03125
INC/DEC 3335
ADD 33313
OR/XOR 1.54.533
その他 ---3
Control/call
JMP 31.51.52
LOOP 00124
CALL/RET 3634
条件分岐1212610

オペランドへのアクセスはほとんどがレジスタへのアクセス(51%)であり、 命令の中では転送命令の割合が高い(MOVが29%, PUSH/POPが12%,条件分岐が10%) ことが判りました。

CISC では、以下のような使用頻度の高い命令は短くコード化しています。

このような「使用頻度が高い命令は短くコード化する」という 不規則なコード化を行なったために、 命令をデコード(decode = 命令解読) するためには 複雑な論理演算が必要となります。 そのため、たいていのCISCでは命令をマイクロコードを 用いて実行しています。 命令のデコードは逐次処理となります。 命令の長さは最初の部分をデコードするまでわからないし、 デコードは残りの部分をデコードするまで完了しないからです。

次のような疑問について、基本に立ち戻ってプロセッサを設計し直すと RISCの概念に辿り着きます。

RISCは、「全体として性能が向上するならば複雑さをソフトウェアに 押し込む(=ハードウェアを簡単にすることによって処理速度を向上させる)」 という思想に基づいています。 頻繁に使われる基本演算はハードウェアで実現する一方、 あまり使われない複雑な演算は他の演算の実行速度に悪影響を 及ぼす場合は用意しないわけです。

RISCに対する反論:「機械語命令が単純であればプログラムは大きくなり (キャッシュに入りきらなくなるなどの原因で)遅くなる」
反論への反論:「最適化されたコードが生成されるのでそんなに プログラムは大きくはならない」

CISCにもRISCの長所を採り入れる動きがあります (多数のレジスタ、プロセッサの内部情報を利用する 最適化コンパイラ、など)。 最近は、CISCの機械語を採用していても、CPUの内部では RISCに基づく高速なハードウェアで命令を処理している例もあります。 例えば Pentium では、CISCのi486の命令コードを RISC86 という RISC命令に内部で変換してRISCに基づくハードウェアで 処理しています。

RISCの特徴

RISCの例

IBM 801

RISC方式に基づいて設計された最初のコンピュータ (1975〜1979年に設計、1982年公表, Radin 1983)。 プロジェクトの重点課題は「最適化コンパイラの設計」。

大学での初期の研究によるプロトタイプ --- RISC I/II と MIPS

RISCをVLSI上に初めて実装。
RISC IRISC IIMIPS
レジスタ数7813816
命令数313955
アドレシングモード222
命令フォーマット224
パイプラインステージ235
RISC I/IIの流れをくむ SPARC アーキテクチャのCPUは、 1990年代にSun のWorkStationなどで採用されました。 2010年代に日本(冨士通と理研)が開発した スーパーコンピュータ京 ではSPARCベースの64bit版CPUが使われています。 MIPS アーキテクチャの流れをくむ R3000, R4000 などのCPUは、 SGI のWorkStation やNintendo64, Sony PlayStation などで採用されました。