キャッシュへの書き込み

キャッシュにデータを書き込むと、書き込んだアドレスでは、キャッシュライン上のデータと、メインメモリ上にあるデータが異なることになる。この状態を放置しておくと、どちらのデータが正しいのか分からないということになってしまう。

この問題の解決法として、キャッシュへの書き込みを行う場合には同時にメインメモリへも同じデータを書き込むライトスルー(Write Through、ストアスルーとも呼ばれる)方式がある。

ライトスルー方式は、キャッシュへのライトを行う場合に、メインメモリにも同時に書き込み要求を出すという制御を行えば良く、制御が簡単であるという利点がある。しかし、メインメモリは、例えば64ビット幅のデータを読み書きするようになっているのが普通であるが、プロセサからの書き込みはバイト単位の場合もあるので、書き込みに対してはバイト単位のマスクを持ち、64ビットのうちの必要な部分だけに書き込みを行い、その他の部分のデータは変更しないようにしなければならない。

また、ライトスルー方式では、ストア命令が実行されるたびにメインメモリへの書き込みが発生し、メインメモリへの書き込み時間で性能が制約されてしまうという欠点がある。

このため、最近のプロセサでは、メインメモリの直前のキャッシュとしてライトスルー方式にキャッシュが使われることはない。しかし、制御が簡単という利点を活かして1次データキャッシュにはライトスルー方式を用い、2次キャッシュは、次に述べるライトバック方式というプロセサも多く存在する。

メインメモリ(あるいは2次キャッシュなどの下位のキャッシュ)への書き込みの頻度を減らすには、書き込みはキャッシュラインだけに対して行い、追い出しが必要になった時点で、キャッシュラインの内容をメインメモリに対して書き戻す方式が考えられる。この方式をライトバック(Write Back、ストアインとも呼ばれる)方式という。

ライトバック方式の場合は、書き込み時点ではその内容はメインメモリには反映されない。単一プロセサの場合は、先にキャッシュをアクセスするのでこのことは大きな問題にはならないが、マルチプロセサの場合は大きな問題となり、複数のプロセサのキャッシュ間の整合を取るコヒーレンス制御が必要となるのであるが、これは稿を改めて述べる予定である。

ライトバック方式では、キャッシュラインの追い出し時点で、その内容が書き込みによって変更されていればメインメモリに書き戻しを行う。このため、タグにキャッシュラインに書き込みが行われたかどうかを示すModified(変更)ビットを設ける。そして、メモリからデータを読み込んだ時点ではModifiedビットをクリアし、キャッシュラインに対して書き込みが行われた場合にはModifiedビットをセットする。

そして、そのキャッシュラインを追い出す場合には、タグのModifiedビットをチェックし、ビットがセットされている場合はそのキャッシュラインのデータを読み出してメインメモリに書き戻す。一方、Modifiedビットがセットされていない場合は、そのキャッシュラインのデータはメインメモリから読まれたままであり、書き戻しの必要はなく、次のデータを上書きしてしまってよい。

ライトバック方式は、このように追い出しが発生するまでのキャッシュラインへの書き込みが、まとめて1回の書き込みでメインメモリに反映されるので、ライトスルー方式と比較してメインメモリへの書き込みの回数が減少し、メインメモリの書き込み性能がリミットとならず、性能を向上させやすい。

構造が簡単なダイレクトマップ方式を例に取ると、中位アドレスをインデックスとしてタグとデータアレイを読み出し、タグが一致すればヒットである。一方、タグが一致しない場合は、そのタグのModifiedビットがセットされていれば、そのデータをメインメモリに書き戻す。通常は書き戻し専用のバッファレジスタを備え、このバッファに書き戻しデータを格納して、そのキャッシュラインを空きにする。

一方、Modifiedビットがセットされていない場合は、キャッシュラインのデータはメインメモリの内容と同じであるので、データアレイから読み出したデータは捨てて良い。これで必要な空きスペースができる。

並行して、ミスが検出された時点で、アクセスを要求されたデータの読み出しをメモリに要求し、メインメモリからデータが到着すると、空けたキャッシュラインに書き込むという処理になる。そして、書き戻しデータがある場合は、バッファレジスタの内容をメインメモリに書き込む。

図4.13にダイレクトマップキャッシュの場合の、読み出しデータとライトバックデータを生成する回路を示す。この図のように、タグのヒット信号で、データアレイから読み出された情報を読み出しデータとしてプロセサのロードユニットに送るか、あるいはメモリへのライトバックデータとしてメインメモリ(あるいは下位のキャッシュ)に送るかを選択する。

図4.13 ダイレクトマップのライトバックキャッシュの構造

また、セットアソシアティブキャッシュの場合は、ヒットの場合は、タグが一致したwayのデータアレイからのデータを読み出しデータとしてロードユニットに送り、ミスの場合はLRU wayのデータをライトバックデータとして選択して下位のメモリに送れば良い。