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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU ロードストア命令

<<   作成日時 : 2009/07/11 01:20   >>

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

 従来の32ビット以上のプロセッサはバイト、ワード長も扱っていた。さらに符号拡張付き、符号拡張なしもあったので命令数が増えていた。思い切ってレジスタ幅の単位でしかロードストアはやらないことにする。

・命令
LD [Rs1+Rs2],Rd (Rs1+Rs2)番地からRdへ128ビット(16バイト)ロード
ST Rd,[Rs1+Rs2] Rdの128ビットを(Rs1+Rs2)番地にストア
LDF [Rs1+Rs2],FRd 浮動小数点レジスタロード
STF FRd,[Rs1+Rs2] 浮動小数点レジスタストア

・アドレッシングモード
[Rs1+Rs2] レジスタ2本の和
[Rs1+imm] レジスタ1本+符号付き即値
[Rs1+Rs2]++ Rs2をポストインクリメント
--[Rs1+Rs2] Rs2をプリデクリメント
※アドレスは16バイト境界にないといけない。ポストインクリメント、プリデクリメントではRs2の値が±16される。Rs1はベースレジスタということで変化しない。

 うーん、しかしここまで思い切っていいのだろうか。32ビット(4バイト)、64ビット(8バイト)の境界もサポートしたほうがいいだろうか。サポートするにしても8ビット、16ビットはやらない。32ビットが浮動小数点の単精度のサイズなのでここまでにしておく。
これについてはメリット・デメリット検討ということで保留。

 メモリコンシステンシモデルはSO(StrongOrdering)とRMO(Relax Memory Ordering)の二つをサポートする。
SOはロード/ストアは命令発行順を守る。主にI/Oアクセスに使用する。
RMOはロード/ストアの順序は入れ替わってもよい。ロードの発行とストアの発行が準備ができた順に出せる。ハードの実装は楽になる。
そのかわり、先行するロード/ストア命令が完了するまで待ち合わせるメモリバリア命令に相当するものを入れなければならない。SPARCではmembar命令、IA-64ではmf命令、その他POWERにも存在するはず。
専用命令でなくロード/ストア命令中に埋め込む方向で検討する。2命令に分けて指定してもどのみちロードストアユニットに行くことになるのでコード長の無駄。
例:
LD [Rs1+Rs2],Rd,#LoadStore ←先行するロード命令とストア命令が完了するまで待つ。

 リードモディファイライトまたはコンペアアンドスワップ命令については、マルチプロセッサについてもうちょっと勉強してから定義する。

 できれば命令セットやレジスタモデルは簡潔でありたい。気に入っているのはSPARCのASI空間の指定である。ロード/ストア命令にASI番号を指定すると、別に割り当てた空間を参照できる。例えばあるASI番号でキャッシュの診断アクセスのためのキャッシュタグやデータをロード/ストア命令で参照できる。
プロセッサのステータスを参照するためには専用のレジスタセットが用意されているのが普通。(SPARCのASRアクセス) だが、これでは数が足らない。そこですべてASI空間に押し込めてしまう。また、余計な命令(POWERのTLB操作命令)もロード/ストアで代用できる。これらも別途検討。
 ASI空間の応用例として、参照アドレスを計算するLEA命令が実現できる。これはSPARCにはない。
例:
 LD #LEA,[Rs1+Rs2],Rd #LEAはあるASI番号、この番号を指定するとRd ← Rs1+Rs2 が代入される。
 ASI番号はプレフィックス命令で指定したほうがよい。おそらくユーザーモードではほとんど使わず、主に特権/ハイパーバイザモードで使うことになるだろう。

 リトルエンディアンでのアクセスもASI空間の指定もしくはモードの設定(ビッグかリトルか)で可能。これもASI空間の定義で検討する。

ロードストアに関する宿題:
・128ビット(16バイト)以下のアライメントアクセスを許可するかどうか
・メモリバリアの種類
・マルチプロセッササポート命令の検討
・ASI空間の定義

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


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

タイトル
本 文

コメント(6件)

内 容 ニックネーム/日時
>思い切ってレジスタ幅の単位でしかロードストアはやらないことにする。

C言語の char (1byte), int(事実上4byte) を高速に扱いたいときに不便(性能が出にくい)でしょうか。

あと、現実問題としては、I/O アクセスは byte read/write できないと困るケースがあります。


>参照アドレスを計算するLEA命令

2-source アドレッシングでは実現しても直接的なメリットがない(add命令と同等なので)と思います。
x86 などでは add 単独では出来ないような加算が出来るので重宝がられますが。
m.ukai
2009/07/13 15:57
>思い切ってレジスタ幅の単位でしかロードストアはやらないことにする。
→これはまだ検討中です。Alphaの初期はバイトアクセスがなくて面倒でしたが、後にバイトロード/ストアが追加された経緯があります。

>参照アドレスを計算するLEA命令
このアドレッシングモードは普通のRISC相当ですので演算としてみればたいしたことはありません。しかしALU×2、LD/ST×2といった内部構成だと加算命令が4個同時発行可能です。
http://keisanki.at.webry.info/200809/article_1.html

確かに重要度は低いですが、実装が容易なことから入れています。ASI空間を使うので追加の命令ではありません。
ざっと調べてみましたが確かにアドレッシングが単純なRISC系にはLEA命令は見当たらないですね。
houmei
2009/07/13 22:55
>といった内部構成だと加算命令が4個同時発行可能
...というのは μアーキ の範疇でありこそすれ ISA で規定する話ではない気がします。add 命令を認識して LD/ST pipe に投入する実装は現に存在したはずです。
あと、スループット1τの実装は容易でしょうが、レイテンシ1τの実装はそれほど簡単では無いでしょう。
m.ukai
2009/07/14 17:41
>...というのは μアーキ の範疇でありこそすれ ISA で規定する話ではない気がします。add 命令を認識して LD/ST pipe に投入する実装は現に存在したはずです。

add命令を認識してLEA操作を行うのではなく、コンパイラ屋さんやテストプログラム屋さん等が実装を意識して明示的に使うことを想定しています。

例:ALU×2,LD/ST×2の実装で4命令同時実行(in-order)とすると、以下の命令列は1サイクルで同時にissue可能。異なる実装(ALU×1,LD/ST×1)でもコードを変更することなく動作。

LD #LEA,[R1,R2],R3
ADD R4,R5,R6
LD #LEA,[R7,R8],R9
ADD R10,R11,R12
--

ところで、add 命令を認識して LD/ST pipe に投入する実装について、差し支えなければどのプロセッサで行われているのか教えていただけないでしょうか。
houmei
2009/07/14 22:28
>ところで、add 命令を認識して LD/ST pipe に投入する実装

そのものを忘却してしまったのですが(ひょっとしたら製品じゃなく研究レベルのものだったかもしれません)、
Sun の UltraSPARC II は ALU の後ろに LD/ST pipe がある構造(LD/ST の AGen と ALU が共有)だったと記憶しています (現行プロセッサもそうなのかは知りませ)
m.ukai
2009/07/16 09:20
ありがとうございました。
houmei
2009/07/16 15:55

コメントする help

ニックネーム
URL(任意)
本 文




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