ライトアロケートとノーライトアロケートの違い:書き込みミス時の動作・通信量・組み合わせを比較

ライトアロケートとノーライトアロケートは、書き込みでキャッシュミスしたときに、そのラインをキャッシュに入れるかどうかを決める方針です。ライトアロケートは、ラインを下の階層から読み込んでから、キャッシュの中で書き込みます。ノーライトアロケートは、ラインを読み込まずに、書き込みを下の階層へ直接送ります。ヒットした書き込みをいつ下の階層へ伝えるかを決めるライトバックとライトスルーとは別の軸ですが、一般にライトアロケートはライトバックと、ノーライトアロケートはライトスルーと組み合わせます。

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

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

ライトアロケート
書いたデータを近いうちにまた読み書きするとき。配列の要素を更新するループのように、時間的局所性のある書き込みに向きます。
ノーライトアロケート
一度書いたら当分読み返さないデータを大量に書くとき。むだな読み込みを省き、キャッシュを有用なデータのために空けておけます。
プログラムでの工夫
ライトアロケートのキャッシュでも、書くだけの大きなバッファにはノンテンポラルストアを使うと、読み込みを避けられます。ただし書いたデータはキャッシュに残らないので、すぐ読み返す場合はかえって遅くなります。

よくある質問

ライトアロケートとノーライトアロケートの違いは何ですか?

書き込みミスのとき、ライトアロケートはラインをキャッシュに読み込んでからキャッシュに書き込みます。ノーライトアロケートはラインを読み込まずに、下の階層へ直接書き込みます。

ライトスルー方式では、必ずノーライトアロケートを使うのですか?

必ずではありません。ヒットした書き込みの伝え方(ライトバックかライトスルーか)と、ミスしたときにラインを取り込むかどうかは別々の選択です。ただし一般には、ライトスルー方式はノーライトアロケートと、ライトバック方式はライトアロケートと組み合わせます。ライトスルー方式では、ストアがヒットするとキャッシュのコピーを更新すると同時に下の階層にも書き込み、ミスすると通常はラインを読み込まずに下の階層へそのまま送ります。

書くだけのデータで、ライトアロケートが遅くなるのはなぜですか?

上書きするだけのラインを、まず主記憶から読み込むからです。読み込みとあとの書き戻しで通信量がおよそ2倍になり、再利用するほかのデータもキャッシュから追い出されます。ノンテンポラルストアを使うと、この読み込みを避けられます。

理解度チェック

書き込みでキャッシュミスしたときに、そのラインを読み込まず、下の階層へ直接書き込む方式はどれか。

  1. Aライトアロケート
  2. Bライトバック
  3. Cノーライトアロケート
答えと解説を見る

正解:C. ノーライトアロケート

書き込みミスのときにラインを読み込まずに下の階層へ直接書く方式はノーライトアロケートで、ライトスルー方式と組み合わせることが多い方式です。一度書いたら読み返さないデータでは、無駄な読み込みを省けます。ライトアロケートは逆にラインを読み込んでから書き込む方式で、書いたデータをすぐまた使う場合に有利なため、ライトバック方式と組み合わせることが多くあります。ライトバックはヒットした書き込みの扱いを決める方式で、ミス時の読み込みの有無とは別の軸です。

一度書いたあと当分読み返さない大きなデータを書き出すとき、キャッシュを通さないストア(ノンテンポラルストア)を使う主な利点はどれか。

  1. A書いたデータがキャッシュに長く残り、あとで読むときに速くなる
  2. B再利用しないデータでキャッシュを埋めずに済む
  3. C書き込みの順番が保証されなくなるので、プログラムの誤りが見つけやすくなる
答えと解説を見る

正解:B. 再利用しないデータでキャッシュを埋めずに済む

通常の書き込みでは、ライトアロケートによりラインを主記憶から読み込んでから書くため、書くだけのデータでも読み込みの通信が発生し、再利用するほかのデータを追い出してしまいます。ノンテンポラルストアは書き込みをまとめて直接主記憶へ送り、キャッシュを汚さず、不要な読み込みも省けます。書いたデータはキャッシュに残らないので、すぐ読み返す場合はかえって遅くなります。順番の扱いが変わるのは副作用で、利点ではありません。

同じラインに何度も書き込む処理で、ライトスルー方式よりライトバック方式の方が有利になる主な理由はどれか。

  1. A書き込みがキャッシュの中で済み、主記憶へは追い出すときに1回書けばよいから
  2. B書き込みのたびに主記憶も最新になるので、追い出すときの処理が要らないから
  3. Cキャッシュと主記憶の内容が常に一致するので、一貫性の管理が要らないから
答えと解説を見る

正解:A. 書き込みがキャッシュの中で済み、主記憶へは追い出すときに1回書けばよいから

ライトバック方式では、同じラインへの何度もの書き込みをキャッシュの中だけで済ませ、追い出すときにダーティなラインを1回書き戻すだけです。そのため主記憶への通信量と電力を大きく減らせます。書き込みのたびに主記憶も最新にするのはライトスルー方式の性質で、同じラインに何度も書くとその都度通信が発生します。キャッシュと主記憶が常に一致するのもライトスルーの性質で、ライトバックでは一致しない期間があります。

  1. キャッシュの書き込み方式で、ライトバック方式の説明として正しいものはどれか。
  2. ライトスルー方式のキャッシュで、書き込みバッファを設ける主な目的はどれか。
  3. ライトバック方式のキャッシュで、各ラインに付けるダーティビットの役割として正しいものはどれか。

メモリ階層と性能の練習問題へ

関連する用語の解説

ライトアロケート
書き込みでキャッシュミスしたとき、そのラインをキャッシュに読み込んでから書き込む方式。ライトバック方式と組み合わせることが多い。読み込まずに下の階層へ直接書く方式はノーライトアロケートという。
ライトスルー方式
キャッシュへの書き込みと同時に、下の階層(主記憶など)にも書き込む方式。下の階層が常に最新に保たれるが書き込みの通信量が多く、書き込みバッファと組み合わせて使う。
キャッシュライン
キャッシュと下の階層の間でデータを読み書きする単位。キャッシュブロックともいう。多くのCPUでは64バイトで、アドレスの下位ビットがライン内の位置(オフセット)を表す。
キャッシュメモリ
CPUの近くに置く高速・小容量のメモリ。よく使うデータを保持して主記憶との速度差を緩和する。主にSRAMでつくられる。
時間的局所性
一度アクセスしたデータや命令に、近いうちに再びアクセスしやすい性質。ループの中で繰り返し使う変数などが例で、キャッシュが効く理由の一つ。
キャッシュコヒーレンシ
マルチコアのCPUで、各コアのキャッシュに同じアドレスのデータがあるとき、その内容の一貫性を保つ仕組み。あるコアが書き換えると、他のコアの古いコピーを無効にするなどして実現する。

関連する比較