Имея некоторые проблемы с выяснением ставок хита и пропусков следующих двух фрагментов кода.
Данная информация: у нас есть 1024-байтовый прямой кеш с размером блока 16 байт. Таким образом, тогда получается 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 - порядок строк), что функция2 должна быть лучше. Но я не понимаю, как рассчитать процент попадания/промаха. По-видимому, функция1() пропускает 50% времени, а функция2() пропускает только 25% времени.
Может ли кто-нибудь пройти меня через то, как работают эти вычисления? Все, что я действительно вижу, это то, что не более половины сетки будет когда-либо помещаться внутри кеша сразу. Кроме того, легко ли распространить эту концепцию на k-образные ассоциативные кэши?
Спасибо.