92466


以下の記事について、疑問点があります。

[コンピュータアーキテクチャの話(139) ダイレクトマップキャッシュとその注意点 |
TECH+（テックプラス）](https://news.mynavi.jp/techplus/article/architecture-139/)

キャッシュのデータを書き換えるときは、そのキャッシュラインに入っているすべてのデータを同時に書き換えるのでしょうか？上記のサイトでは、`a[0] ~
a[7]` を読み込んだ後、キャッシュミスが発生するため、`b[0] ~ b[7]` をすべて読み込んで、書き込む形をとっていますが、単に `b[0]`
1個だけ読み込んで（これと同時に、キャッシュラインにすでにある `a[0] ~ a[7]`
のいずれか1つが上書きされて、データがキャッシュから消える）書き込み、次に、`b[1]`
を読み込んで…というふうに、1つずつ読み込むことはできないのでしょうか。  
この理由が分かる方がいらっしゃいましたら、教えていただけると幸いです。


CC BY-SA 4.0
2022-11-27T16:14:42.183
92465
2022-11-28T02:13:18.793
2022-11-28T02:13:18.793
4236
55639
question
ハードウェア cpu
キャッシュの書き込みは、キャッシュ内の全てのデータが同時に上書きされるのでしょうか。キャッシュの中の1行ずつ上書きすることは可能でしょうか。


> キャッシュのデータを書き換えるときは、そのキャッシュラインに入っているすべてのデータを同時に書き換えるのでしょうか？

そうです

> 1つずつ読み込むことはできないのでしょうか。  
>  この理由

理由というか「データを同時に書き換える」単位をキャッシュラインと定義しています

>
> データとペアで格納するアドレスデータをタグ(Tag:海外旅行のスーツケースに付けるような荷札という意味))という。そして、データとタグのペアをキャッシュラインと呼ぶ。

とそのサイトに有るようにキャッシュラインは上位アドレスが共通で  
下位アドレスだけでアクセスできる連続領域である必要があります

> 単に b[0] 1個だけ読み込んで（これと同時に、キャッシュラインにすでにある a[0] ~ a[7] のいずれか1つが上書き

これをやろうとすると 0 番が &a のアドレスで 1-7 が &b と混ざった状態とするにはキャッシュタグが a b
どっちをもてばいいかわからないですよね

* * *

じゃあキャッシュラインサイズ１にして全部のキャッシュに別々のアドレスもてばいいじゃん  
って考えるんですがハードウェアの世界でそんな柔軟なことをすると回路効率が著しく悪くなります

たとえばキャッシュラインサイズは１６～２５６が多いですが  
１６の場合に比べてキャッシュラインを１にすると  
アドレスマッチング回路も１６倍必要になるし  
データ１６個に対して上位アドレス１つもてばいいのが  
データ１つに上位アドレス１つ保つ必要があり、  
データに使える記憶領域が半分になってしまいます

* * *

おそらくこの先の説明に出てくるんだと思うんですが  
インテルの i7 なんかは 4way セットアソシアティブっていって  
下位アドレスが共通なキャッシュラインを４つまでもつことができます

さらにAMDの場合はビクティムキャッシュって言って  
キャッシュミスしたキャッシュラインを  
全下位アドレス共通で使える少量のフルアソシアティブ領域でもっておくっていう方法でキャッシュミスを緩和してます


CC BY-SA 4.0
2022-11-27T18:49:43.827
92466
2022-11-27T19:01:42.143
2022-11-27T19:01:42.143
92465
answer