/ / Організація кеш-пам'яті - c, кешування, комп'ютерна архітектура

Організація кеш-пам'яті - c, кешування, комп'ютерна архітектура

я хотів би зрозуміти, як працює наступна програма з точки зору оновлення основної пам'яті.

int main() {
short a[256], b[256];
register i;

for (i=0 ; i < 256 ; i++)
a[i] = i;
for (i=0 ; i < 256 ; i++)
b[i] = 255 - i;
for (i=0 ; i < 256 ; i++)
b[i] = b[i] - a[i];
return 0;
}

У мене є адресна шина 16 біт, основна пам’ять організована в байти, кеш-пам’ять 512 двосторонній асоціативний набір, розмір блоку 16 байт, і центральний процесор може зчитувати інформацію лише з кеш-пам'яті.

що трапляється, коли ми використовуємо політику «Написати через відсутність розподілу запису» а що, коли ми використовуємо політику розподілу записів на зворотний запис?

Відповіді:

0 для відповіді № 1

Я припускаю

обсяг кеш-пам'яті 512

ти маєш на увазі 512 byte.

І давайте припустимо, що кеш порожній і в ньому немає нічого, що було б зіставлене a[] або b[] область.

Якщо ваш код працює із функцією зворотного запису, тоді перший цикл буде повністю пропущений в кеш. Третій цикл отримає 16 байт після a[i] і b[i] коли трапляється промах, продовжуйте бити, доки не буде досягнуто наступний блок (1 промах за 8 ітерацій).

За допомогою функції розподілу записів перші дві матимуть промах кожні 8 ітерацій, а третій цикл повністю вдарений.

В цьому випадку, a[] і b[] знаходяться в одному наборі, тому для "двосторонньої асоціативної" частини це чудово. Але якщо ви заявите більше 4 масивів розміру short[256], у вас буде конфлікт.

int main() {
short a[256], b[256], c[256], d[256], e[256];
register i;

for (i=0 ; i < 256 ; i++)
a[i] = i;// a in set0
for (i=0 ; i < 256 ; i++)
c[i] = 255 - i; //c in set 1
for (i=0 ; i < 256 ; i++)
e[i] = c[i] - a[i]; // e/c/a evacuates each other
return 0;
}