ぼくのかんがえたさいきょうCPU レジスタを覗く窓

 ぼくのかんがえたさいきょうCPUは最大長で32768バイトの汎用レジスタを定義しているが仮に実現したとして演算器をどうするか。もうなんかドリフのコント「もし汎用レジスタが異常に長かったら」みたいなタイトルになってきてるが。

 レジスタの領域をチップ内に持つのはそう難しくないだろうが、32Kバイト長と32Kバイト長を入力として演算して32Kバイト長の結果を1サイクルで返すALUはどう考えても無理だ。ではどうするか。現実的なサイズのALUを使って複数サイクルで効率よく結果が出せるよう工夫するしかない。

 ここで長い内部のレジスタのうちの一部分を読み書きできる窓を考える。8バイトのレジスタについて1バイトの窓が空いていると考えると、1バイト幅でしか加算ができない演算器でも窓を動かしながらキャリーを伝搬させつつ結果を書いていけば8サイクルで8バイト長の加算ができる。同様にその他の演算もよりサイクル数がかかる場合があるが演算は可能。このあたりのしくみはソロバンや機械式計算機と同じ。

 次は実装だがこのメカニズムはチップ内部にハードとして実装してもよいが、それでもレジスタ自体が入らないことを考えるとエミュレーションの仕組みを考えていたほうがよい。
 内蔵している汎用レジスタの幅よりもALUが扱う幅が小さいとして以下の様に動作。
 命令が直接扱えるデータ幅を越えるオペランドを扱うとトラップが発生する。汎用レジスタをローテートしながら扱える幅の演算を繰り返し、結果を書き込んでエミュレーショントラップから戻る。これによりソフトウェアからは内蔵している汎用レジスタの幅のアーキテクチャとして見える。
 注意点はロード/ストアで、ここを汎用レジスタ幅よりも小さく分割すると途中で他のプロセッサから一部を書き換えられる恐れがある。アトミックな動作を保証しなければならない。または汎用レジスタの幅と同じロードストアのサイズと決めてそれを上限とする。

 先ほど、汎用レジスタを参照する窓を提案したが、トラップハンドラ内で通常のローテート命令で汎用レジスタ全体をローテートしながらできる範囲を演算することにより特に窓を意識しなくても処理できる。

 さて内蔵している汎用レジスタのサイズよりも大きいデータを扱うには?
トラップハンドラ内で処理するのは同じだが、レジスタに入るべき大きなデータは特定のメモリ上に保管する。そちらからロード/ストアしつつ演算を行い、結果を返す。これを行うにはレジスタが扱っているデータのサイズの管理とメモリ上に退避する領域の確保が必要。動作としてはレジスタウィンドウを持つアーキテクチャのSpill/Fill動作に類似。また、レジスタ参照ごとにメモリアクセスが発生するので相当遅くなることが予想される。

 このように極端な例を考えて対処があれば、将来の拡張性については問題がなさそうだと言えるのではないかな。


東芝(TOSHIBA)  窓用換気扇 【VFW-20X2】東芝(TOSHIBA) 窓用換気扇 【VFW-20X2】

東芝 1999-06-01
売り上げランキング : 454

Amazonで詳しく見る
by G-Tools

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック