я хотів би зрозуміти, як працює наступна програма з точки зору оновлення основної пам'яті.
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;
}