Я читал о пространственный а также временной населенные пункты.
В двух словах.
Временная местность:
Программы часто обращаются к одним и тем же ячейкам памяти неоднократно.
Пространственная местность:
Программы также часто обращаются к смежным областям памяти неоднократно.
Теперь я пытаюсь проанализировать следующий код, чтобы найти все случаи временной и пространственной привязки.
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++
,Так я прав во всех этих и я пропустил что-то еще?
Определения наоборот.
Пространственная локация — локация в пространстве, доступ к близлежащим ячейкам памяти.
Временная локализация — локация во времени, доступ к одной и той же локации несколько раз.
Использование пространственной локальности при проектировании кэшей таково, что когда ваша программа нуждается a[i]
, кеш просто не извлекается a[i]
из памяти. Получает несколько записей a[i], a[i+1], a[i+2] ...
столько, сколько размер кешлайна. Таким образом, кеш ожидает, что вы, вероятно, получите доступ a[i+1]
скоро. И когда вы делаете это, кешу не нужно извлекать его из памяти, он уже существует благодаря использованию пространственной локальности.
Временная местность приходит, когда вы получаете доступ i
а также j
, Каждый раз, когда вам нужно i
а также j
нет необходимости извлекать его из памяти, так как он кешируется. Кешируя, i
а также j
, кеш думал, что вы получите доступ к нему снова, поэтому экономит время, чтобы извлечь его из памяти.
И чтобы ответить точно, да, вы определили места для пространственной и временной местности. Единственное, что не правильно, это ваше утверждение «Инструкции, чтобы сделать все это хранятся рядом друг с другом в памятиMsgstr «Там не будет отдельной инструкции для доступа a[i]
, a[i+1]
, Это будет одна инструкция, используемая внутри цикла, с использованием адреса памяти, вычисляемого каждый раз. Как я объяснил выше, преимущество заключается в том, что кешу не нужно извлекать данные для следующей итерации, поскольку он, вероятно, извлекается как часть ранней итерации в цикле.
Других решений пока нет …