やかんです。
今回も、来週に試験が控えているコンピュータアーキテクチャについて復習していこうと思います。
※内容は僕のパブリックなメモでしかないです。
1. 修正ハーバードアーキテクチャとは?
プロセッサ自体は基本的にノイマンのプログラム内蔵方式に準拠しつつ、キャッシュについては命令とデータを分けて管理するという手法。
そもそもハーバードアーキテクチャとはプログラム内蔵方式と対をなす考え方で、命令メモリとデータメモリを分けて管理する手法。これをキャッシュについてのみ適用しよう、というのが修正ハーバードアーキテクチャ。
2. キャッシュミスを判定するのにも遅延時間が発生する?
通常は、キャッシュミスの判定に数クロックかかるらしい。それでも、キャッシュがヒットした時の速さがメモリアクセスよりも数段速いから許容の範囲内なのだろう。
3. 連想検索について
キャッシュを作ってメインメモリのサブセットをキャッシュに格納したとしても、メインメモリのどの部分がキャッシュのどの部分にあるのか、あるいはそもそもキャッシュに所望のサブセットが存在しているのか、という情報がパッとわかる必要がある。
→メモリアドレス(メインメモリのアドレスね)からキャッシュの情報がパパッと割り出せることが望ましい。
主記憶の「空間」からキャッシュの「空間」への瞬間移動
4. キャッシングにおいては、該当するメインメモリの下位bitの方が情報として重要らしい。なぜ?
キャッシュラインとキャッシュブロックについての理解が大事だと思われる。あと、メモリアレイについての理解も必須だよな。
→メモリアレイについて改めて考えてみたら、割と理解できた気がする。メモリラインにおける「行」のサイズが、キャッシュの「行」のサイズよりも大きい、というケースを考えれば、上位bitに強く依拠してキャッシングすると追い出しが多発することがわかる。これを下位bitに依拠してキャッシュしていれば、追い出しは発生するにしても不要な追い出しは少なくなるよね。
→正確ではないが、ダイレクトマップ方式の場合はメモリアレイの「列」がキャッシュの「行」(つまりキャッシュライン)に相当するイメージを持っていると理解しやすいかもしれない。
↑全部違う!!!間違いです。理解間違ってます。
(改めて)4. キャッシングにおいては、該当するメインメモリの下位bitの方が情報として重要らしい。なぜ?
メモリアレイについての理解はやっぱ必要で、でもこれは例えばアドレス幅が8bitなら「データのライン」みたいなものが2^8行存在するということでしかない。
N * Mのメモリアレイ、という場合は非常にシンプルで、アドレス幅がNbit(つまり2^N行)、データ幅がMbitのメモリということだ。
これに鑑みて、改めてキャッシングとメモリアドレスの下位bitについて考えてみる。下位bitが同じメモリアドレスを具体的に考えてみると、例えば「8’b10000001」と「8’b00000001」などがある。この2つは10進数にしたときに129(10)と1(10)であることからわかるように、値としてかなり離れている。つまり、メモリアレイ上では「遠く離れた行」ということになる。
ん、、、?
いや、合ってるはずなんだけど、だからと言って下位bitの方が重要、ということにはならなくないか???
これわからんわ。頭の中であっためます。
5. やっぱりキャッシュについての理解はメモリアレイへの習熟度に左右されると思う。メモリアレイの構造について考えよ。
これはさっき述べた通り。
6. ダイレクトマップ方式におけるインデックスやオフセットのbit位置について考えて。
ダイレクトマップ方式では、
- オフセット→メモリアドレスの下位bit
- インデックス→メモリアドレスの「中位」bit
- タグ→メモリアドレスの余った上位bit
でキャッシュラインに溜められる。
例えば32bitの場合0~5が下位、6~14が「中位」、それ以上が上位みたいなイメージ。雑ですみません。
これ、すごい基本的な疑問だけど、なんで下位bitがオフセットで次の下位bitがインデックスなんだ???
7. ダイレクトマップ方式において、なぜ下位bitがオフセットで次の下位bitがインデックスなんだ???
GPT4oにヘルプもらいました。
https://chatgpt.com/share/0d7a20cc-bcd1-421f-b56e-a571debd4df3
なるほど。確かに、下位bitをオフセットじゃなくてインデックスに使用した場合は、連続したメモリアクセスに対応するのが困難だよな。次の下位bitをインデックスに使用することで、下位bitが連続したメモリをキャッシュすることができる。
これは、メモリアクセスの空間的局所性を考えれば非常にありがたいことだとわかる。
感覚的な表現だけど、「中位」bitでインデックスし、下位bitを遊ばせることで連続したメモリアクセスについてキャッシュすることが可能。で、それにタグとして上位bitを利用することで、キャッシュが一意に定まる。タグについては、「こうすると便利だからタグを導入しよう」というモチベよりも、ダイレクトマップ方式においては導入せざるを得ない、という方が適切なように感じる。
口説いようだけど、インデックスに下位bitを使うと、連続したメモリアクセスをキャッシュする際に困難が生じる。これだと思う。
今日のところはこんな感じで。まあでもキャッシュについてだけ考えればいいわけじゃないからな。キャッシュもうちょっと詰めたら今度は仮想記憶かな。
ということで、最後までお読みいただきありがとうございます。