Какой тип ошибок кэша происходит при доступе к последовательным элементам массива? - PullRequest
0 голосов
/ 02 февраля 2019

В 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 также вызывает пропуски кэша?

Спасибо!

1 Ответ

0 голосов
/ 03 февраля 2019

Это зависит от кода asm, вы должны прочитать его и посмотреть, читает ли ваша программа сначала [i] или сначала [i + 1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...