Все вхождения временной и пространственной привязки в данном фрагменте кода
Я читал о пространственных и временных местностях.
В двух словах.
Временная локализация: Программы часто обращаются к одним и тем же ячейкам памяти неоднократно.
Пространственная локальность: Программы также часто обращаются к смежным областям памяти неоднократно.
Теперь я пытаюсь проанализировать следующий код, чтобы найти все случаи временной и пространственной привязки.
for (int i = 0, j = 10; i < 100; i++)
a[i] = j++;
Я понял только следующие.
пространственная
a[i] = j++;
После ссылкиa[i]
мы собираемся ссылатьсяa[i+1]
,- Инструкции сделать все это хранятся рядом друг с другом в памяти.
височный
i
по сравнению с 100.i
увеличивается на единицу:i++
,- Назначение
a[i] = j++
использованияi
как индекс массива. - База массива
a
используется для индексации каждогоa[i]
, j
увеличивается на единицу в назначенииa[i] = j++
,
Так я прав во всех этих и я пропустил что-то еще?
1 ответ
Определения наоборот.
Пространственная локация - локация в пространстве, доступ к близлежащим ячейкам памяти.
Временная локализация - локация во времени, доступ к одной и той же локации несколько раз.
Использование пространственной локальности при проектировании кэшей таково, что когда ваша программа нуждается a[i]
, кеш просто не извлекается a[i]
из памяти. Получает несколько записей a[i], a[i+1], a[i+2] ...
столько, сколько размер кешлайна. Таким образом, кеш ожидает, что вы, вероятно, получите доступ a[i+1]
скоро. И когда вы делаете это, кешу не нужно извлекать его из памяти, он уже существует благодаря использованию пространственной локальности.
Временная местность приходит, когда вы получаете доступ i
а также j
, Каждый раз, когда вам нужно i
а также j
нет необходимости извлекать его из памяти, так как он кешируется. Кешируя, i
а также j
, кеш думал, что вы получите доступ к нему снова, поэтому экономит время, чтобы извлечь его из памяти.
И чтобы ответить точно, да, вы определили места для пространственной и временной местности. Единственное, что не правильно, это ваше утверждение: "Инструкции сделать все это хранятся рядом друг с другом в памяти". Там не будет отдельных инструкций для доступа a[i]
, a[i+1]
, Это будет одна инструкция, используемая внутри цикла, с использованием адреса памяти, вычисляемого каждый раз. Как я объяснил выше, преимущество заключается в том, что кешу не нужно извлекать данные для следующей итерации, поскольку он, вероятно, извлекается как часть ранней итерации в цикле.