CPU


1bit CPU はできるのか?



CPUの性能は一般的に、「bit数」「クロック数」で決められます。
RISCでは「パイプライン段数」「パイプラインハザード回避率」、VLIWやEPICでは「ユニット数」「コンパイラ性能」なども性能を決める要素になります。(RISCやCISCという呼び方もすでに前世紀のもので、最近ではそれぞれの特徴を併せ持つCPUが増えてきたこともあり、これらを区別することは無意味とされるようです。VLIWやEPICは区別されているようですが)
最近では「コア数」「キャッシュ容量」「キャッシュメモリの速度」「空いたコアをどこまで有効活用できるか」などもCPUの性能を大きく左右する要因になっています。

さて、もっとも基本的なbit数ですが、現在のWindowsマシンやMacでよく使われているCPUは64bitです。
世界初のマイクロプロセッサと言われる、Intel 4004は4bit。
すべてのマイクロプロセッサはここから始まりました。(マイクロプロセッサよりも昔に発明されたミニコンやそれよりも大きな演算装置は36bitや22bit、18bitなどから始まっています)
そしてマイコンブームを支えたZilog Z80やMotorola 6809、MOS Technology 6502などが8bit。
マイコンからパソコンへ呼び名が変わり、それが趣味のものから実用的な道具として普及し始めた頃のIntel 8086やMotorola 68000が16bit。
少し前までのWindowsマシンやMacなどの主流CPUだったIntel PentiumやIBM PowerPCが32bit。
これから先、128bitや256bitといったCPUが主流になってくることでしょう。

つまり、実用的なプロセッサは4bit以上であるということが分かります。
さて、ではそれよりも少ないbit数のプロセッサがもしあったとしたら、それは使い物になるのでしょうか。
例えば1bitのCPUを作ったとして、はたしてそれは実用として通用するのでしょうか。

その答えは、「CPUの『何が1bitなのか』によって使い物になることもあるし、使い物にならないこともある」です。

実はCPUのbit数というのは、大まかに以下の5項目あります。

1. ALU長(何bitまでの数値を一度に計算できるか)
2. レジスタ長(何bitまでの数値を一時的に保管しておくことができるか)
3. データバス長(メモリに対して何bitまでの数値を一度に読み書きできるか)
4. アドレスバス長(8bitを一単位として、何単位までのメモリをリニアに扱えるか)
5. 命令長(一つの命令が何bitで構成されているか(演算性能とは関係ないのでここでは扱いません))

このうちどれが1bitかによって、そのCPUが使えるか使えないかが分かれてきます。
例えば、8bit CPUとして有名なZ80ですが、それぞれの長さがどうなっているかというと、

1. 4bit
2. 8bit(命令によって16bit)
3. 8bit
4. 16bit

です。
同じ8bit CPUである6502は

1. 8bit
2. 8bit
3. 8bit
4. 16bit

さらに同じ8bit CPUである6809は

1. 8bit
2. 8bit(命令によって16bit)
3. 8bit
4. 16bit

同じ8bit CPUでも随分と違いがあることが分かります。
16bit CPUとして有名な8086は、

1. 16bit
2. 16bit(命令によって8bit/32bit)
3. 16bit
4. 20bit

同じ16bit CPUの68000はというと、

1. 32bit
2. 32bit(8bit/16bit/32bit 可変長)
3. 16bit
4. 24bit(配線は23本で常に偶数番地を16bit単位でアクセスし、上位バイトと下位バイトはCPU内部で判別している)

32bit CPUであるPentiumは、

1. 32bit
2. 32bit(命令によって8bit/16bit)
3. 64bit
4. 32bit

すなわち、「そのCPUが何bitか」というのは、この4項目のうちどこを見ているかで変わるということです。
ALU長を見ればZ80は4bit CPUであり、レジスタ長を見れば68000は32bit CPU、データバス長を見ればPentiumは64bit CPUです。
Z80は8bitの演算をするのに内部で2回ループをしていて、68000は32bitの値をレジスタに取り込むのに2回メモリを叩いています。

しかしどうやら長い歴史の中で、CPUのbit長はALU長でもなくアドレスバス長でもなく「レジスタ長とデータバス長のうち短い方」である、という常識が生まれたようです。
というわけで、今回は「データバス長が1bit」のCPUを「1bit CPU」と呼ぶことにします。
つまり「メモリに対して1度に読み書きできるデータの単位が1bit」のCPUということです。
1bitで表現できる数値は0か1のどちらかですので、それ以上の数値は複数回メモリにアクセスすることになります。

メモリにはアドレス番号があり、4bit CPUでは4bit(ニブル)単位、8bitのCPUでは8bit(バイト)単位でアドレス番号を割り振られています。
この考え方を延長すれば、16bit CPUが発明された時点でアドレス番号は16bit単位に、32bit CPUが発明された時点でアドレス番号は32bit単位になるのが自然といえます。
しかしアドレス番号の単位は8bitに据え置きにされ、64bitの時代になった今でもそのままです。
16bit CPUが開発された当時、メモリが非常に高価だったので可能な限り有効活用しようとされたのかもしれません。

さて。
データバスが1bitとなると、今までのこの常識を見直さないといけません。
1bit CPUでは、データは1bit単位でアクセスされるので、アドレス番号も1bit単位で割り振られることになります。
ということは、当然アドレスバス長はものすごく長くないと実用的とは言えません。
例えばアドレスバス長が16bitだった場合、8bit CPUなら64KiBまで扱えるのに、1bit CPUではその1/8、つまり8KiBまでしかアクセスできないことになります。
32bitでやっと512MiBです。
現在の32bit CPUがアクセス出来る範囲である、4GiBをカバーしようと思ったら35bit必要です。
そもそも1bit単位でアドレス管理ができるメモリコントローラが必要です。

ALU長は1bitでもまったく問題ありません。
大きな数値を計算するときは、延々ループさせればよいだけです。(もちろん遅いですが)

あとはレジスタ長です。
レジスタ長が1bitではさすがに使い物にならないでしょう。
C言語やJavaに例えるなら、1つの変数に格納できる数値が0か1のどちらかしかない、という状況です。
メモリ上にワークを用意して、キャリーフラグやボローフラグを挟みながらプログラムでループさせれば不可能でもないですが、私はそんなコーディングしたくありません。
さすがにレジスタ長は今の時代32bit程度は欲しいところです。


畢竟、実用的な1bit CPUとはこんな感じでしょうか。

1. ALU長 1bit
2. レジスタ長 32bit
3. データバス長 1bit
4. アドレスバス長 32bit

アドレスバス長35bitで4GiBの空間にアクセスできますが、そうするとデータレジスタ32bit、アドレスレジスタ35bitとなりますので、データレジスタとアドレスレジスタを分けて実装する必要があります。
なんか昔のCPUみたいで使いづらそうなので、512MiBの壁がありますが、同じ32bit長にしてみました。

つまり、レジスタに値をロードするのに32回メモリを読みに行き、演算するのに32回ループし、演算結果をストアするのに32回メモリを叩き・・というCPUになります。
なんだか、Z80と68000の悪いところを寄せ集めてそれを極めたようなCPUです。

ものすごく遅そうですが、今の技術で作ればZ80などよりはずっと速いCPUになりそうです。

ちなみにALUだけが1bitのCPU(レジスタとデータバスが32~64bitあるので、正確には1bit CPUではない)や、1bit CPUを構成するための主要ロジックを提供するチップと言えるMotorolaのMC14500 ICU(これ単体ではCPUとは呼べそうにない)などは実在しています。

といったところで、次回は1bit CPUを設計してみます。


2010/11/28 更新




[ 戻る ]