次の2つのコードスニペットのヒット率とミス率を理解するのに問題があります。
与えられた情報:16バイトのブロックサイズを持つ1024バイトの直接マップされたキャッシュがあります。つまり、64行(この場合はセット)になります。キャッシュが空から始まると仮定します。次のコードを検討してください。
struct pos {
int x;
int y;
};
struct pos grid[16][16];
int total_x = 0; int total_y = 0;
void function1() {
int i, j;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[j][i].x;
total_y += grid[j][i].y;
}
}
}
void function2() {
int i, j;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
total_x += grid[i][j].x;
total_y += grid[i][j].y;
}
}
}
いくつかの基本的なルール(つまり、C配列は行優先の順序)から、function2の方が優れている必要があることがわかります。しかし、ヒット/ミスのパーセンテージを計算する方法がわかりません。どうやらfunction1()は50%の確率で失敗しますが、function2()は25%の確率で失敗します。
誰かがそれらの計算がどのように機能するかを私に教えてもらえますか?私が実際に見ることができるのは、グリッドの半分以下が一度にキャッシュ内に収まるということです。また、この概念はk-wayアソシアティブキャッシュに簡単に拡張できますか?
ありがとう。