ふと表題のようなお馬鹿なことを考えてみた。
ロードストア命令や分岐命令は普通にあり、レジスタも例えば32bit汎用レジスタが16本とか普通にあるが、なぜか算術演算だけはNANDしかないというプロセッサだ。
算術命令は任意のレジスタの任意のビットを2つ指定して、任意のレジスタの任意のビットに書き出す命令のみとする。
当然、NANDは万能なので一応は一通り何でも演算できるはずだ。
加算ひとつで数百命令使いそうだが、それでも例えばGHzクラスで動けば、MHz時代のCPUの性能は出るはずだ。
ここで、さすがにこれをマクロ命令でやるのはバカらしいので、マイクロコード方式の命令実行を考えてみる。
そうすると、マイクロコードを書き換えればどんな演算命令も自在に定義できるではないか!
って、当たり前だ、というか別に普通のプロセッサでも原理的には何でも出来る。
だがここでちょっと考えてみたい。上記の任意のビットにNANDを適用するのは現在のCPUでも何命令かを組み合わせなければ実現できない。
早い話が、近代的な非常に高度で多機能なALUも、演算の用途によってはNANDゲート1個に性能で負けるケースがありうるわけだ。
もちろん一般のCPUの命令は多くのケースで非常に高い効率で演算できるように非常に良く考えられて設計されている。
一方で極々まれにCPUでは非効率になってしまう演算もあって、例えばFPGAなりの方がまだ適しているケースがあったりする。
ここで、もう一歩踏み込んで考えて見る。
FPGAのようにLUT方式的なALUを用意して、テーブルやマイクロコードを自由に入れ替える命令を有したらどうなるだろうか?
普通のCPUは扱いやすい形式の演算だけが異様なまでに早い(IEEE754形式とか)。
でも、CPUの得意なデータ型ではないデータ型を効率よく扱いたい場合も極々稀にある。
自らの演算器自体を再定義しながら動くCPUとかあったら面白いかもなぁ などと考えて見るも、やっぱりノイマン型をとる限りは、どんな演算でもはハードマクロな既存演算の組み合わせでやったほうが早いかもなとも思ってみたりして。
また時間のあるときにでも再考察して見たい。
コメント