x86命令の所要クロック計測スレ

このエントリーをはてなブックマークに追加
231
VB高速化のため、VCの__asmで書きDLL化したのをVBから呼び出している漏れ。
21の言っていることがよくわからない。
悔しいのでキャッシュの仕組みでも書いてみる。
話がPIIIなのは昔考えたことだから。


キャッシュというのはアドレスを言われたらすぐそのデータを差し出さなければならない。
PentiumIIIのL1キャッシュでのこの時間はわずか3clk。
キャッシュのどこにどのアドレスのデータがあるかを把握していなければならないのは当然だが、
突然言われたアドレスのデータが16KBものデータの中からどこにあるのかを調べて
データを転送するまでたったの3clkで完了させるというのは、
データの配置に制限をかけて検索しやすいようにしなければできないことである。

そこでL1キャッシュは4ウェイ・セット・アソシエイティブ、キャッシュラインサイズ32byte、
キャッシュライン512本で容量が16KBのキャッシュになっている。
まずL1キャッシュは512個のキャッシュラインに分かれている。
16KB÷512個でそれぞれが32byte。

ここには必ず32byte境界にアライメントされた連続データが入る。
これが4個ずつ128グループになっている。
アドレス値の5〜11bitには、7bitあるので128通りがあるが、
各グループがその128通りに割り当てられる。
そのグループ内のキャッシュラインには必ず割り当ての7bitをアドレス値の5〜11bitに持つデータが入る。
すると、このアドレスのデータがほしいと言われたときに、アドレスの5〜11bitからグループを特定し、
その中4つのキャッシュラインについて一致するアドレスがないか調べればいいことになる。
これなら3clkでできそうだ。