ライトアロケートとノーライトアロケートの違い:書き込みミス時の動作・通信量・組み合わせを比較
ライトアロケートとノーライトアロケートは、書き込みでキャッシュミスしたときに、そのラインをキャッシュに入れるかどうかを決める方針です。ライトアロケートは、ラインを下の階層から読み込んでから、キャッシュの中で書き込みます。ノーライトアロケートは、ラインを読み込まずに、書き込みを下の階層へ直接送ります。ヒットした書き込みをいつ下の階層へ伝えるかを決めるライトバックとライトスルーとは別の軸ですが、一般にライトアロケートはライトバックと、ノーライトアロケートはライトスルーと組み合わせます。
| 項目 | ライトアロケート | ノーライトアロケート |
|---|---|---|
| 書き込みミスのときの動作 | ライン全体を下の階層から読み込んでキャッシュに置き、そこへ書き込む | キャッシュには手を付けず、書き込みを下の階層へ直接送る |
| ラインの読み込み | 必要。マルチコアでは排他的な所有権を取る読み込み(RFO)になり、ほかのコアのコピーを無効にしてから書く。そのためストアのミスは、メモリバスの上では読み出しのように見える | 不要。書き込むデータだけを下の階層へ送る |
| よく組み合わせる書き込み方式 | ライトバック。取り込んだラインへのその後の書き込みは、メモリへの通信なしでヒットとして吸収されるので、最初の読み込みのコストを回収できる | ライトスルー。書き込みはどのみち下の階層へ伝わるので、ラインを取り込んでも書き込みの通信は減らない |
| 下の階層との通信量 | 同じラインに何度も書く場合や、書いたデータを読み返す場合に少なくなる | ミスした書き込みは、そのたびに下の階層へ出る。そのかわり、余分な読み込みは発生しない |
| 書くだけの大きなデータ(メモリのクリアや出力の書き出し) | 上書きするだけのラインをまず読み込み、あとでまた書き戻すので、通信量がおよそ2倍になる。有用なデータもキャッシュから追い出してしまう | 読み込みもキャッシュの汚染も起きないので、このようなデータに向く |
| 書いた直後の読み出し | ラインがキャッシュにあるので、ヒットする | ラインはキャッシュにないので、ミスして改めて読み込む |
| 実装の工夫 | 書くだけのデータには、キャッシュを通さずに書き込みをまとめて主記憶へ送るノンテンポラル(ストリーミング)ストアを使う。ISAによっては、古い内容を読まずにライン全体をゼロにする命令もある | 書き込みバッファで書き込みの遅れを隠す。バッファは、同じラインへの複数の書き込みを1回の転送にまとめることもよくある |
| 使われる場面 | ライトバック方式のキャッシュで一般的。CPUのL1〜L3キャッシュの多くはライトバック方式 | ライトスルー方式のキャッシュで一般的。たとえば、ライトバック方式のL2を背後に持つ小さなL1キャッシュや、単純な組込みプロセッサ |
数値は代表的な目安で、世代や製品によって異なります。