キャッシュコヒーレンシとは
キャッシュコヒーレンシとは、同じ番地のデータの写しが複数の場所にあるとき、その内容をそろえておくことです。 写しは速さのために作られ、書き込んだ時点で原本とずれます。そろえる役目をハードウェアとソフトウェアのどちらが負うかは同じチップの中でも箇所ごとに決まっていて、コアと共有キャッシュが増えるほど、そろえる相手も増えます。
写しは速さのために作られ、書き込んだ時点で原本とずれる
Section titled “写しは速さのために作られ、書き込んだ時点で原本とずれる”キャッシュは、速くするために写しを持つ仕組みです。いちど参照した番地の中身を速い記憶装置へ写しておけば、同じ番地を次に参照するときが速くなります1。写す単位をある程度の大きさの塊にしておくと、その近くの番地を参照するときも速く済みます。
原本は主記憶にあり、読み出しだけなら写しと原本は同じ内容のまま並びます。キャッシュへ書き込みが起きた時点で新しい値はキャッシュ側だけにあり、主記憶には書き込み前の値が残ります。同じ番地に新旧2つの値が並ぶので、キャッシュ側の変更を主記憶へ反映させる決まりが要ります。
ライトスルーは書くたびに返し、ライトバックは追い出すときに一度だけ返す
Section titled “ライトスルーは書くたびに返し、ライトバックは追い出すときに一度だけ返す”ストアスルー(ライトスルー)は、キャッシュを書き換えると同時に、主記憶へも同じ書き換えを流す方式です。原本がすぐ最新になり、制御も比較的単純です。そのかわり主記憶への書き込みが毎回発生して性能が落ちるため、主記憶の待ち時間から切り離すにはライトバッファのような受け皿が要ります。
ライトバックは、書き込みの時点ではキャッシュだけを直し、その塊が主記憶とずれていることを覚えておく方式です。塊がキャッシュから追い出されるときに、はじめて内容を主記憶へ返します。同じ塊を何度書き換えても主記憶へ返すのは一度で足り、主記憶への書き込み回数を抑えられます。代償は、最新の値がキャッシュにしかない時間です。その間は同じ番地に新旧2つの値が並び続けます。
写しを捨てる操作と原本へ返す操作は、別の命令になっている
Section titled “写しを捨てる操作と原本へ返す操作は、別の命令になっている”ルネサス エレクトロニクスのSH-4Aコアでは、キャッシュと外部メモリとのコヒーレンシはソフトウェアで保証するよう求められます2。そのための命令は6つです。OCBIはオペランドキャッシュを無効にし、写しをそのまま捨てます。OCBPは内容を外部メモリへ返したうえで無効にし、OCBWBは内容を外部メモリへ返すだけです。MOVCA.Lはオペランドキャッシュを確保し、ICBIは命令キャッシュを無効にし、SYNCOはデータ転送の完了を待ちます。
同じコアは、オペランドキャッシュのコヒーレンシ制御のために、SuperHywayバスから届くPURGEとFLUSHのトランザクションも受け付けます。PURGEではオペランドキャッシュを検索して当たった行を無効にし、その行が書き換え済み(ダーティ)なら内容を外部メモリへ返します。FLUSHでは、当たった行が書き換え済みなら内容を外部メモリへ返し、行そのものは有効なまま残します。
無効にすることと、内容を外部メモリへ返すことは別の操作です。写しを捨てたいのか、写しの内容を原本へ返したいのかで目的が違い、命令がこの2つを区別している点に、コヒーレンシの考え方がよく表れています。
同じチップの中でも、保証する側は箇所ごとに違う
Section titled “同じチップの中でも、保証する側は箇所ごとに違う”外部メモリとの一致はソフトウェアの仕事でも、内蔵メモリには別の決まりがあります。Uメモリの読み出しバッファは、DMACなどのバスマスタがUメモリを書き換えた場合もハードウェアが無効化を行うため、ソフトウェアでの保証は要りません。命令を置くILメモリでは、ソフトウェア側の手順が1つ増えます。命令を書き込んだあと、書き換え後の命令に進む前にSYNCOとICBIを実行します。
保証には対象外になる条件もあります。SH-4Aコアでは、命令TLB多重ヒット例外やデータTLB多重ヒット例外が発生するとリセットになり、キャッシュのコヒーレンシは保証の対象外です。コヒーレンシは、どこまでを誰が引き受けるかの線引きでもあります。プログラムを書く側は、その線がどこに引かれているかを箇所ごとに知っておく必要があります。
コアとキャッシュが増えるほど、そろえる相手が増える
Section titled “コアとキャッシュが増えるほど、そろえる相手が増える”写しのある場所は増える一方です。マルチコアでは仕事を複数のコアへ割り振って進め、コアどうしは基本的に別々に動くものの、2次キャッシュのように共有される部分もあります3。チップマルチプロセッサ(マルチコアプロセッサ)は1つのチップに複数のコアを載せた形で、演算器やレジスタといった計算資源はコアごとに別々に持ちます4。
実機でも同じことが起きます。理化学研究所のスーパーコンピュータ「富岳」は、1ノードに計算コアが48個あり、L1データキャッシュがコアあたり64KiB、L2がCMG(Core Memory Group)あたり8MiBで、CMGが4つあります5。同じ番地のデータが、あるコアのL1にも、CMGのL2にも、主記憶にも同時に存在し得ます。そこへDMACのような転送装置も加わり、写しの数だけ、そろえる相手が増えます。
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”キャッシュコヒーレンシとは何ですか?
同じ番地のデータの写しが複数の場所にあるとき、その内容をそろえておくことです。代表はキャッシュと外部メモリとのコヒーレンシで、マルチコアではコアごとのキャッシュと共有キャッシュの間にも同じ問題が生じます。
なぜ写しができるのですか?
速くするためです。いちど参照した番地の中身を速い記憶装置へ写しておけば、同じ番地を次に参照するときが速くなり、塊で写せば近くの番地も速く読めます。
キャッシュと主記憶の値は、いつずれるのですか?
書き込んだときです。キャッシュへ書き込みが起きると新しい値はキャッシュ側だけにあり、主記憶には書き込み前の値が残ります。
ライトスルーとライトバックの使い分けはどうなりますか?
主記憶へ反映する時点が違います。ライトスルーは書くたびに主記憶も更新して制御が単純な代わりに毎回の書き込みを負い、ライトバックはキャッシュだけを更新してブロックが追い出されるときに一度だけ主記憶へ返します。
一致は誰が保証するのですか?
箇所ごとに決まっています。SH-4Aでは、キャッシュと外部メモリとのコヒーレンシはソフトウェアが6つの命令で保証するよう求められ、バスから届くPURGEとFLUSHや、Uメモリの読み出しバッファの無効化はハードウェアが引き受けます。
マルチコアでは何が変わりますか?
写しのある場所が増えます。コアどうしは基本的に別々に動くものの、2次キャッシュのように共有される部分もあり、富岳の1ノードでは48コアそれぞれのL1と、4つのCMGのL2と、主記憶に同じ番地の写しが並び得ます。
保証に条件が付くことはありますか?
あります。SH-4Aでは、命令TLB多重ヒット例外やデータTLB多重ヒット例外が発生するとリセットになり、キャッシュのコヒーレンシは保証の対象外です。
比較・違いを学ぶ
Section titled “比較・違いを学ぶ”5件を表示
- 1電子情報通信学会:知識の森 6群4編4章「記憶」ieice-hbkb.org ↩
- 2
- 3JEITA 半導体部会:半導体用語集semicon.jeita.or.jp ↩
- 4電子情報通信学会:知識の森 6群5編2章「スレッドレベル並列コンピュータ」(2010年時点の記述)ieice-hbkb.org ↩
- 5理化学研究所 計算科学研究センター:システム紹介r-ccs.riken.jp ↩