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

アクセスカウンタ

zoom RSS メモリアクセスとロード・ストア

<<   作成日時 : 2013/03/12 16:54   >>

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

メモリアクセスとロード・ストア

 ロード・ストア命令は、数が限られている高速なレジスタと低速だが大容量のメモリとの間でのデータをやりとりする。命令列を順次フェッチするのはロード命令の連続とも考えられる。
 アキュームレーターアーキテクチャの頃。保存したい・されたいデータはアキュームレータA上にあり、そのデータはインデックスレジスタXで示されるアドレスにロード・ストアされた。汎用レジスタではどのレジスタもアキュームレータ、インデックスレジスタになりうる。
インデックスレジスタに記録するアドレスは、演算命令とその他の汎用レジスタで計算しセットする。アキュームレータ役の汎用レジスタを指定して、メモリロード・ストアを行う。
基本、レジスタのロードとストアはレジスタのbit幅そのままをメモリ上に保存する。この時、プロセッサによっては保存するデータがバイト単位で前後が入れ替わることがある。(big-endian,little-endian問題)
 エンディアンの順序はデフォルトの値はプロセッサ固有で決まっているが、設定により変えることもできる。古いプロセッサは順序が固定。
 ストア命令のペナルティ。ストア命令を発行するとストアバッファに一旦蓄積され、あとでメモリに書き込まれる。ストアバッファに投げた時点でストア命令は完了とみなされ、次の命令が実行できる。
 ロード命令のペナルティ。ロード命令は遠いメモリからデータを持ってこなくてはならない。このため、命令が完了するまでに時間がかかり、次の命令実行まで待たされることがある。
これを改善するのが予測されるアドレスに対して事前にアクセスしておくプリフェッチ、ロードミスを発生しずらいよう広大な二次キャッシュメモリ、メモリオーダリング。

 メモリオーダリングとは、メモリへのロード・ストアアクセスを乱順序に発行することでストールをできるだけ防ぐもの。ただし同一アドレスに対するロード・ストアの順序が入れ替わらないようソフト側の記述で気をつける。これを支援するバリア命令があり、バリア命令が発行されるとそれ以前のロード・ストアのトランザクションが完了するまでロード・ストアの発行は抑止される。
簡単なものではSPARCのTSO(Total Store Ordaring)ロード命令はロード命令を追い越すことはできるが、ストア命令を追い越すことはできない。また、SO(Strong Ordering)というモードもあり、これは順序を必ず守る。副作用のあるI/O空間に対して行われる。一般にメモリーオーダリングを決めたらシステムが終了するまで変更しない。

 レジスタの一部をストアする場合は、下位8bit、下位16bit、下位32bit、…という具合に選択してメモリに書き込む。アライメントはそれぞれ揃える必要がある(ものが多い)。16bitなら2バイトバウンダリ、32bitなら4バイトバウンダリに合わせていないとアライメントエラーが発生する。エラーが出ずに操作を完了するプロセッサはこの場合はメモリに対して二回のアクセスを行なっている。
 レジスタにメモリの一部をロードする場合は、下位8bit、下位16bit、下位32bit、…という具合に選択してレジスタに書き込む。この時、設定によってはレジスタ幅いっぱいに符号拡張を行った値をセットする場合がある。レジスタの一部だけを置き換えるようなロード命令はない。これは、書き換えのために対象レジスタをいったんリードし、一部書き換えののち書き戻す操作が必要になるため。(16bit幅レジスタの上位8bitがAレジスタ、下位8bitがBレジスタというような構成のプロセッサでは可能)

 レジスタの値をあるアドレスに保存するときのアドレス計算方法の色々をアドレッシングモードと呼ぶ。RISC系は演算命令でアドレスを計算するのが基本で、便利なように[B+X]や[B+即値]といった簡単な加減算ができるような拡張がしてある。また、LEA(Load Effective Address)命令といってアドレッシングモードで計算したアドレスの値そのものを得る命令があり、うまく使うと演算器系の加減算とは別にロードストア専用の加減算を計算目的に行えることがある。

 キャッシュメモリによくヒットするようにプリフェッチ機構を使うことがある。これは命令なら連続していること、データなら局所性があること、といった性質を利用する。明示的に次にアクセスしそうなデータ領域に対して ld [B+X],%g0の様に空読みをしてキャッシュメモリ上に近辺のデータを載せ、本番アクセスではすべてキャッシュにヒットするようなやり方ができる。またはハードウェアで適切に次メモリアクセスがきそうな所にダミーアクセスを行ってミスヒットを減らす方法もある。推定しやすいのは命令アクセス、分岐先など命令実行に関するもの。

 ストアバッファ、ロードバッファを内部に持つプロセッサはストアを投げっぱなしにして次命令実行、ロードはプリフェッチが効いていればロードバッファから即転送することができる。スタックポインタを介してデータを出し入れする操作は、キャッシュメモリに掃き出す前に完結することが期待できる。事実上のハードウェアスタック。

 メモリアクセス関係ではハードウェア異常による例外が発生する場合がある。例えばアドレス空間の範囲外、物理的にメモリが存在しない領域へのアクセス、メモリ素子そのものの異常など。これらが発見され例外が発生するのはだいぶ後で、例えば書き込まれたデータを後で読み込んだ時などに検出する。こうなるとメモリや CPUの状態は変わってしまっているので元の状態に巻き戻すのは困難な上、故障ならば回復する手段がないのでバスエラーとしてOSを停止させることになる。

 マルチプロセッサシステムではメモリ空間を複数のプロセッサが共有しており、それぞれのプロセッサが通信するのに排他制御を行う。メモリ上ではTAS、CAS、LL/SCなど。リードモディファイライトといってプロセッサがバスを掴んだまま他のプロセッサを入れることなくメモリの読み書きを1回で行う、など。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




メモリアクセスとロード・ストア 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる