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

アクセスカウンタ

zoom RSS LL/SC命令

<<   作成日時 : 2014/11/21 03:48   >>

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


 Load-Linked/Store-Conditionalの動作について。またはLoad&Reserved/Store-Conditionalとも。自分の理解のために整理したのでツッコミ歓迎。

Load-Link/Store-Conditional[Wikipedia]

 リードモディファイライトで私が最初に知ったのは68000のCAS命令。当時は1つのバスに複数のプロセッサ、DMAデバイス、メモリが接続されていて、バス使用権を持ったデバイスがリードまたはライトの動作をする。プロセッサはバス使用権を獲得した後でリード(ロード命令)やライト(ストア命令)を行う。CAS命令はバス使用権を握ったままでリードとライトの動作を行ってからバスを解放するので、ほかのデバイスが途中でメモリを触ることはできない。

 さてLL/SC命令だがこれはキャッシュメモリの管理を前提にしている。以下を参考に考えてみる。

R4000のll/sc命令

LL [addr],RegA
...
RegA +1などの操作
...

SC [addr],RegA

 この操作の間にメモリ上のaddrにある値が変わっているとSC命令は失敗と判断される。これを変えることが出来るのはマルチプロセッサ構成にしている時の他プロセッサ、またはDMAデバイス。

 ではどうやって検出しているか?これはキャッシュメモリの管理にまかせてある。キャッシュメモリが扱うデータは汎用レジスタが扱うデータの幅よりも大きいのが一般的。そうしないとバス帯域を大きくできない。例として64bitレジスタに対して8倍の64バイトサイズ単位でキャッシュが管理されていると考える。この単位をキャッシュラインと呼ぶ。
 キャッシュラインの状態はキャッシュタグで管理されている。自プロセッサでメモリを読み書きする場合は必ず自分のキャッシュ上に対して行うので、最初はメモリ上からキャッシュラインのサイズで取り込む。この時最初に読み込んだ場合はタグの状態がExclusive、他プロセッサがすでに読みこんでいた場合はSharedとなる。
 他のプロセッサがそのキャッシュラインを読み込んでいたり修正していたりするのはキャッシュタグを参照するとわかる。他プロセッサが持つキャッシュタグの状態は、すべてのプロセッサが接続されるシステムコントローラ(Intel系で言うところのチップセット)で管理しているので即座に参照できる。このおかげで各プロセッサのプログラムからみたメモリの状態は矛盾することなく見える。

MESIプロトコル[Wikipedia]

 LL/SC命令の動作に戻る。LL命令でロードしたアドレスをどこかに記憶しておき、SC命令が来た時にキャッシュラインに対応するキャッシュタグを参照する。このタグがSharedなら問題ないが、他プロセッサが書き換えたと思われるDirty状態になっていればSC命令を失敗とする。Dirtyになっているかどうかの判断は、他プロセッサのキャッシュタグのうちどれかひとつでもModifiedになっているかどうかでわかる。

 LL/SC命令は参照するアドレスの前後、キャッシュラインに載っている関係ないアドレスの書き換えでも失敗する。もしこのような影響を避けたければLL/SC命令は近辺のアドレス参照がないような箇所で行わないといけない。
 また、LL/SC命令はアクセスするアドレスをいったん保存するが、この領域がどれくらいあるかで動作も異なる。アドレスを保存する内部レジスタが1つしかなければ、LL/SC命令がネストするようなコードでは常に内側から判定され外側にあるものはアドレスが異なるので失敗することになる。この部分がスタックのような構成になっていれば誤った失敗は減る。

 また、他プロセッサとのやりとりでは仮想アドレスが同じ物理アドレスに対応するわけではないので、アクセスするアドレスは物理アドレスで記憶しておかないといけない。キャッシュメモリはタグの管理をアドレス変換後の仮想アドレスで行うVirtual-Tagと物理アドレスで行うPhysical-Tagがあるが、二次キャッシュや三次キャッシュでのPhysical-Tagで管理している部分で書き換えを判定することになる。



 ここからはおまけだがLL/SC命令にアドレスを汎用レジスタで指定するようなやり方で管理できないだろうか。そしてSC命令は失敗/成功のステータスをストア元のレジスタに返すが、別のレジスタに失敗/成功を返せないだろうか。

LL [RegX],RegA
...
RegA ++などの操作
...
SC [RegX],RegA,RegS

 RegXは汎用レジスタで、LL〜SC命令の間では値を変えない。もし変えたらSC命令で即座に失敗となる。RegXの書き換えがあったかどうかは汎用レジスタにすこし追加する程度で管理できる。このあたりLEA命令と混ぜられそうね。
 RegSは成功/失敗が戻るレジスタ。が、RegAの操作は毎回内容を壊しても構わなさそうなのでいらないかも。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




LL/SC命令 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる