В C, f у вас есть этот тип цикла:
for (i = 0; i < N; i++)
sum += a[i]
, где массив 'a' содержит целые числа (4 байта) и блок кэша может хранить, скажем, 32 байта, тогда я знаю, чтоКаждые 8 итераций цикла будут происходить холодные пропуски, поскольку процессор будет загружать 8 блоков в блок, а затем пропадать кеш до 9-й итерации.Правильно ли я понимаю, что когда он получает ошибку в кеше в [0], он загружает [0] -a [7] в блок кеша и не загружает ни одного из 'a' в кеш, пока не получитеще один холодный промах в [8]?
Если предположить, что ^^ правильно, мой реальный вопрос в том, что произойдет, если у вас что-то вроде этого:
for (i = 0; i < N; i++)
a[i] = a[i+1]
, где 'a' имеетне инициализирован?Получите ли вы что-то похожее на приведенное выше, где процессор ищет каждое последующее значение [i + 1] и пропускает только каждые 8?Или он также ищет в кеше [i], чтобы установить значение?Будут ли ошибки в кэше, связанные с [i] или просто [i + 1]?
И, наконец, что произойдет, если у вас будет
for (i = 0; i < N; i++)
b[i] = a[i]
Было бы это аналогичнопервый пример, где он ищет каждое значение a [i] и получает пропуски кэша на каждой 8-й итерации, или же установка значения b [i] incur также вызывает пропуски кэша?
Спасибо!