メモリ階層について久しぶりに考えてみた

FizzBuzzについて調べていたら,『http://d.hatena.ne.jp/scinfaxi/20080315』で次のような記述を発見(これ自体はFizzBuzzとは関係ない)。ちょっと考えてみた。

「スタックマシン向けのコンパイラより、レジスタマシン向けのコンパイラは複雑」というけれど、そんなことはない。無限レジスタモデルなら楽勝だ。難しいのは、レジスタ以外にメモリなんてものがあるからだ。あるいは、メモリ以外にレジスタなんてものがあるからだ。

L1/L2 キャッシュがキャッシュでよかったよ……。高速中速低速メモリと三段階に別れていたら……、と想像すると恐ろしい。まあ、キャッシュはキャッシュで色々な問題を生むのだが……。

レジスタを無くして、同等の速度の「 L0 キャッシュ」に置き換えるってのはどうでしょう?>ハード屋さん

普通に考えて問題となりそうなのは命令長が長くなることかなあ。32-bitアドレッシングで3オペランドだと最低でも96-bitの長さが必要。命令長が長いと命令キャッシュに入る命令数が少なくなるし,また,消費電力が上がりそうな気がするのであまりうれしくない。L0キャッシュへのアクセスはL0キャッシュの大きさが一般的なCPUの物理レジスタ数と同程度ならパイプラインで隠蔽できそうな気がするので,やはりネックは命令長サイズ。この対処法としては命令を圧縮するという方法が考えられるけど,そこまで頑張って得られる利点がコンパイラ作るのが簡単というだけではあまりメリットはなさそう。
と,ここまで書いて気づいた点がひとつ。これってハード屋といってもデバイス屋へのメッセージであってアーキテクチャ屋へのメッセージではないのではないか。すなわち,レジスタと同速度で動く大容量メモリ開発しろよってことなのではないかと。まあ,どっちでも良いけど(←投げやり。そろそろ眠らないのと明日きついので・・・)


ちなみに私も学生時代はレジスタいらないと考えてた。現在のテクノロジーではしょうがないからキャッシュとかレジスタとかあるけど,いつかはメモリ階層のない時代が来るはず,と。まあ,いつかは全く想像つかなかったけど。