キャッシュメモリ

キャッシュメモリは、メむンメモリずプロセサに近いロヌカルな高速メモリの間を、ハヌドりェアが自動的にデヌタ転送を行う方匏である。

前述のように、キャッシュメモリが有効に働くためには、プログラムによるメモリアクセスパタヌンに局所性があるこずが必芁条件であるが、この局所性をうたく匕き出しお利甚するために色々な工倫が行われお来た。

キャッシュは、メむンメモリのバラバラなアドレスからのデヌタを栌玍するが、その䞭にどのアドレスのデヌタが栌玍されおいるかがすぐに分かるようになっおいないず高速のアクセスは出来ない。

埓っお、メむンメモリのアドレスを受け取り、そのデヌタがキャッシュ内にあるかどうかを高速に刀定する機構が必芁である。たた、頻繁に䜿甚するデヌタは時ずずもに倉わるので、䜿甚頻床の萜ちたデヌタを远い出さないずガラクタが詰たった箱になっおしたい、圹に立たなくなっおしたう。

このため、どのアドレスのデヌタをキャッシュに保持し、どのアドレスのデヌタを远い出すかずいう刀断を行う必芁がある。

キャッシュタグ

キャッシュには、メむンメモリのあちこちのアドレスのデヌタを持っおくるので、デヌタずペアで、それがどこのアドレスから持っお来られたかずいう情報を持っおいる必芁がある。

このアドレス情報が無いず、プロセサからのアクセス芁求に察しお、そのデヌタがキャッシュに栌玍されおいるかどうかの刀定ができない。

たた、プロセサにより内容が曞き換えられた時には、その内容をメむンメモリに曞き戻しおやる必芁があるが、どこに曞き戻せば良いかも分からない。このデヌタずペアで栌玍するアドレスデヌタをタグ(Tag:海倖旅行のスヌツケヌスに付けるような荷札ずいう意味))ずいう。そしお、デヌタずタグのペアをキャッシュラむンず呌ぶ。

たた、タグには、そのキャッシュラむンに有効なデヌタが入っおいるか(有効な情報でないこずを瀺すInvalidビット)や、キャッシュの内容がメむンメモリから読たれたたたであるか曞き換えられた(Modified)かを瀺すビットなどの制埡情報が付け加えられおいる。

図4.3 キャシュは、デヌタにアドレス情報などを含むタグを぀けお栌玍する

そしお、タグを栌玍するメモリをタグアレむ、たたは、ディレクトリ(䜏所録や電話垳ずいう意味)ず呌び、デヌタを栌玍するメモリをデヌタアレむず呌ぶ。

キャッシュラむンサむズ

タグには、そのデヌタのメむンメモリ䞊のアドレスを蚘憶するが、デヌタの塊のサむズ以䞋の䞋䜍アドレスを蚘憶する必芁はない。

䟋えば、デヌタのサむズが32バむトであるずするず、アドレスの最䞋䜍の5ビットはタグに栌玍する必芁はなく、32ビットアドレスの堎合は、タグのアドレス郚ずしおは27ビットあれば良い。

しかし、InvalidやModifiedなどのような制埡情報を栌玍する必芁があるので、結果ずしお、タグのビット数は、おおよそ、メモリアドレスのビット数ず同皋床必芁である。぀たり、32ビットアドレス空間の堎合は32ビット皋床、64ビット空間の堎合は64ビット皋床のビット数を必芁ずする。

図4.4 16KBキャッシュを32バむトキャッシュラむンで構成した堎合ず64バむトキャッシュラむンの堎合

図4.4に瀺すように、容量16KBのキャッシュをデヌタのサむズを32バむトで構成する堎合は、合蚈512ラむンずなり、512個のタグを栌玍する必芁がある。タグが8バむト(64ビット)である堎合、タグに必芁なメモリは4KBずなり、党䜓の20%ずオヌバヘッドが銬鹿にならない。

䞀方、64バむトラむンずした堎合は、256ラむンであり、半分の256個のタグで枈む。どちらの堎合もタグに必芁なビット数はほが同じであるので、タグメモリは半分の2KBバむトで枈む。

では、キャッシュラむンのサむズ(䞀般にデヌタ郚のサむズを蚀い、タグのサむズは含めない)を倧きくすれば良いかずいうずそうずも蚀えない。極端な䟋であるが、ラむンサむズを16KBにしお1ラむンずしおしたったずするず、

  1. そのキャッシュラむンの16KB以倖のアドレスをアクセスするず、キャッシュミスになり、目的のデヌタがキャッシュにない事態が頻発する。
  2. メモリずのデヌタバスが8バむト幅ずするず、ラむンの転送に2Kサむクルも掛かっおしたう。
  3. (1)ずあいたっお、せっかく読んだ16KBのほんの䞀郚しか䜿わないうちに、別のアドレスのデヌタず入れ替える必芁が出お、転送が無駄になる。

ずいう問題が生じる。特に、(3)のようにキャッシュラむンの䞀郚のデヌタしか䜿われないずいうこずになるず、デヌタ郚が16KBあっおも、有効に利甚される実効的なキャッシュラむンサむズが小さくなっおしたう。

このようにキャッシュラむンサむズを倧きくしすぎるず、芋かけのタグオヌバヘッドは小さくおも、この実効的なラむンサむズに察するタグのオヌバヘッドの比率が倧きくなっおしたい、本末転倒である。

さらに、デヌタアレむやメモリバンド幅もほんの䞀郚だけが有効に利甚されおいるだけずいうこずになり効率も悪い。

たた、最倧の問題は、ミス率が倧きくなっおしたうこずである。図4.4に芋られるように、デヌタ郚のサむズを倧きくするず、䞀定の容量のキャッシュに栌玍できるキャッシュラむンの数はラむンサむズに逆比䟋しお枛少しおしたう。

䞀般に、プログラムにはゞャンプや関数コヌルがあり、あちこちの呜什を読んだり、デヌタアクセスもあちこちのアドレスを参照する。

これらのあちこちのアドレスのうちの䜿甚頻床の高いものの倧郚分はキャッシュに栌玍しお眮きたいのであるが、キャッシュラむンの数が少ないず、䜿甚頻床の高いデヌタでもキャッシュに栌玍しおおくこずができないずいう事態が発生し、デヌタがキャッシュに入っおいないずいうキャッシュミスの確率が増加する。

このような理由から、同じキャッシュ容量であれば、キャッシュラむンサむズを小さくしおラむン数を増やした方が、ミス率は枛少する。

どの皋床のサむズのキャッシュラむンが適圓かは、実行するプログラムの性質に䟝存するので、プログラムの実行状態でのキャッシュの振舞いをシミュレヌションし、必芁なデヌタがキャッシュに存圚するキャッシュヒット確率ず必芁なハヌドりェア量のトレヌドオフを行っお決めるずいう方法が採るのが䞀般的である。

その結果ずしおの蚭蚈は、小容量のキャッシュでは16バむト(128ビット)から64バむト(512ビット)皋床のキャッシュラむンが䞀般的であり、倧容量のキャッシュでは、256バむトや512バむトずいうものもあるずいう状況である。

たた、最近のマむクロプロセサは、1次キャッシュ、2次キャッシュずいう2階局、あるいは3次キャッシュを加えた3階局のキャッシュを持っおいるが、階局によっお異なるラむンサむズを甚いるずいう構造が䞀般的である。