竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU レジスタの属性、タグアーキ

<<   作成日時 : 2015/03/19 02:33   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

 大和改できました。現在Lv62です。

 レジスタの属性について。メモリからデータをロード、汎用レジスタ間で演算して加工し、データをストア。これがロードストアアーキテクチャの動きになる。汎用レジスタが多ければ加工の中間データを汎用レジスタ上で保持したまま効率よく処理できるのだが、コンテキスト切り替えが発生した場合は保存するコストが大きくなってしまう。
 汎用レジスタの内容も使ってしまえば役割を終える。ではいつのタイミングでおわるのか?大抵の場合は加工が終わってメモリに反映した後、つまりストア命令が完了したら用済みになるはずである。

 あるデータが有効になるのはロード命令で汎用レジスタに値をセットした時、または即値を生成してセットした時になる。演算命令はこれら有効なフラグがセットされていないと妥当な入力とはみなされない。不当入力データとしてトラップを発生させる。演算が済んで必要がなくなったデータは、ストア命令でメモリに反映すると同時に破棄する。このデータを継続して使う場合はストアのみ行い有効なままとする。汎用レジスタの内容を単に破棄したい場合はダミーのメモリ空間にストアしソースとして指定した汎用レジスタをクリアする。

例えばこうなる:

LD R0,[addr] # R0有効
SET R1,1234 # 即値ロードでR1有効
ADD R0,R1,R2 # ADD命令のデスティネーションとしてR2有効
ST R2,[addr] # R2を保存してR2の内容破棄

または ST_K R2,[addr] # R2の内容をキープしたまま保存

 一度有効化した汎用レジスタの再代入を禁止することも可能。この場合は明示的に内容を破棄する命令または演算命令のオプションとしてその機能が必要になる。

 汎用レジスタはデータを加工するだけではない。そのデータをどこから持ってきって何処に保存するのかを指し示すアドレスを保存するインデックスレジスタとしての用途がある。ある汎用レジスタはアドレスを保持しているという情報を付加しておけば、そのレジスタ内のアドレスをヒントとして先にプリフェッチを行いキャッシュ上にデータを補充しておくことが可能になる。

 このような感じで汎用レジスタに一対一に対応するフラグ的なものがあってもよい。ただしコンテキスト切り替えで保存の対象にしなければならない。


 次は主記憶側にデータの属性(または型)を表すタグを付ける方法を考えてみる。

ぼくのかんがえたさいきょうCPU エンディアンとタグ付きデータの扱い


(1)レジスタで扱うデータ幅ごとにタグbitを割り当てる。例えば36bitアーキ=32bitのデータ+4bitのタグ。LispマシンやPrologマシンといった専用マシンで使われていた。

(2)別の空間に、データに対応したタグを割り当てる(64bitARMのAarch64がそうらしい)。

(3)メモリ空間ではタグを扱わず、CPUの内部でのみ属性を付ける。キャッシュメモリ内までは属性を持ってもよい。

(4)レジスタの上位または下位の一部をタグ、残りをデータとして扱う。

 (1)は現在の主記憶のメモリ幅単位で考えると扱いが難しくなる。8bitに対し1bit、64bitに対し8bitのエラー訂正のためのbitが付いているが、あくまでも信頼性確保のためであり勝手に使うのは望ましくない。
 (2)の別空間に割り付けるのが無難だが、(1)(2)ともにメモリが余計に必要なのでコストアップする。
 (3)はMill CPUで採用している方式で、ロード時のbit幅でデータの属性を決める。演算後のオーバーフローなどでデータサイズが変わった時には属性を変える。これらの属性はキャッシュメモリ内に持つので、余計なコストはごくわずかになる(チップに入れてしまえば問題ない)。ただしMill CPUでは型は扱わないと言っている。
 (4)はSPARCで採用されていた。30bitのデータ+下位2bitのタグで、タグ不一致の時トラップを起こす。この方法はデータ幅が8/16/32/64といったよく使われている長さより短くなってしまう。

 データの幅に関する情報はロード命令のバイト/ワードなどのサイズ指定で付けることができる。しかしこれは情報としては不足している。
 タグを別空間に持てば、それらのロードする番地と共にタグを内部にロードすることができる。CPU内部のタグ情報はコンテキスト切り替えの時も保存されなければならないので、できれば明示的なソフトから見えるレジスタに保存したい。

 ではどうするか。2つの方法を考える。

ひとつは(4)方式の延長で、一部をタグとして扱う。これはSIMD命令の一部として定義し、タグ部分は8bit、残りを通常の演算対象とする。
もうひとつはデータ長は汎用レジスタのサイズのまま、対応するタグを別の汎用レジスタに保存する。
例えば:
32bit長汎用レジスタの場合
R0,R1,R2,R3のタグ → R32に8bitずつ保存
R4,R5,R6,R7のタグ → R33に8bitずつ保存
R8,R9,R10,R11のタグ → R34に8bitずつ保存
R12,R13,R14,R15のタグ → R35に8bitずつ保存
...
R28,R29,R30,R31のタグ → R39に8bitずつ保存

 この方法ではロード命令が2つ必要になる。どのみち汎用レジスタのサイズ以上が必要なので1命令で二箇所からロードするような命令は複雑になるだけ。タグ専用レジスタを用意してもいいが、もうちょっと考えないといけない。また、汎用レジスタを1つつぶしてタグとして扱うのだが、タグ一致の検査を通常の比較命令でやったのではせっかくのタグアーキを高速に実行できない。

汎用レジスタの幅よりはみ出した8bitの領域について、専用のローテート命令でアクセスする方法を考える。

LDB R0,[TAGADDR] # タグをロード
PUSHT R0 # R0の不可視8bitにR0[7:0]をタグとして保存
LD R0,[DATA] # 実際のデータをロード

実質汎用レジスタが+8bit分長くなるのだが、こんな定義をすると間違いなく裏をかくコードが書けてしまうんだなあ。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
SIMDのマルチレイヤー表現
 ぼくのかんがえたさいきょうCPUは今のところレジスタの幅が32KBで四倍精度浮動小数点をSIMDで扱うと同時に2048個も扱える。が、ここまでのサイズがあると同種のデータだけ扱うのではなく構造体やタグも付加したい。ではどうやって表現しようか? ...続きを見る
竹下世界塔の計算機よもやま話
2017/06/04 23:44

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU レジスタの属性、タグアーキ 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる