Запутанный между временным и пространственным местоположением в реальном коде жизни - PullRequest
12 голосов
/ 18 октября 2011

Я читал этот вопрос , я хотел спросить больше о коде, который он показал, т.е.

for(i = 0; i < 20; i++)
    for(j = 0; j < 10; j++)
        a[i] = a[i]*j;

Вопросы,

  1. Iпонять временную местность, я думаю, что ссылки на i и j должны быть временной местностью.Я прав?
  2. Я также понимаю пространственную локальность, так как на вопрос, на который я связал ответы, ссылки на [i] должны быть пространственной.Я прав?
  3. Человек сказал:

    "Внутренний цикл будет вызывать один и тот же адрес памяти при обращении к [i] десять раз, так что это пример временной локализации, я думаю. Ноесть ли пространственная локальность также в указанном цикле? "

    Я не согласен с его предположением.Поскольку ссылки, сгенерированные [i], должны быть пространственными (они будут ссылаться на следующий элемент в блоке).Я прав?

Ответы [ 4 ]

23 голосов
/ 18 октября 2011

Во-первых, ссылки на var могут быть локально во времени или локально в пространстве не временная локализация , что является неправильной грамматикой.Незначительная точка

Теперь перейдем к вашим вопросам.

  1. Принцип Временная локализация гласит, что две инструкции ссылаются на одно и то же местоположение в течение относительно короткого периода времени.Например, в данном коде часто указывается a[i], а инструкции типа a[i] = a[i] * 2 и a[i] = a[i] * 3 выполняются очень близко друг к другу.Если мы посмотрим на эту область, мы могли бы сказать, что ссылки на j и a[i] временно локальны.Ссылки на i также временно локальны, потому что на i ссылаются каждый раз, когда a[i].Однако, если в последней строке данного кода читается что-то вроде a[j] = a[j] * j, то ссылки на i не будут локально временными, по крайней мере, в контексте внутреннего цикла [1] .

  2. Принцип Пространственная локальность гласит, что две инструкции ссылаются на смежные области памяти.Ссылки на a[i] являются хорошим примером этого, поскольку можно предположить (большую часть времени), что a[0] и a[1] будут находиться рядом друг с другом в памяти.

  3. Первые два в основном охватывают это, но цитируемый текст является правильным, и код также демонстрирует пространственную локальность.

[1] - Как правило, когда вы говорите о локальности, это будетбыть в контексте данного уровня в иерархии памяти, будь то ОЗУ или кэш-память L1 или что у вас есть.Во всех отношениях, кроме самого ограниченного, ссылки на i и j являются локально временными.

3 голосов
/ 21 июля 2018

Написание этого ответа, поскольку я не получил его даже после прочтения других ответов на этот вопрос, нескольких других вопросов и википедии (это более запутанно.)

Я думаю, что мы тратим много времени иэнергия, чтобы понять терминологию, которая немного запутана / сложна в этом случае.Мне было легче понять, когда я не обращал внимания на термины «пространственный» и «временный».

Давайте начнем с основ.

Давайте попробуем понять, что такое кеш - место, к которому доступ быстрее, чем к основной памяти.Это круто.Но это место ограничено и дорого, поэтому его нужно использовать с умом.Но как бы вы (или ОС) решили, что поместить в кеш, а что нет?Должен быть какой-то способ узнать, что нам нужно в будущем ... ах, будущие прогнозы!(Отчет меньшинства! Позвоните в несколько звонков?).

Должен быть какой-то способ определить, что понадобится программе в будущем.Используя здравый смысл и код, мы можем сказать, что некоторые части кода повторяются по своей природе - пример - циклы!Если внутри цикла есть переменная i, вы знаете, что к ней в ближайшем будущем снова и снова будут обращаться.Это принцип временной локализации.я могу быть введен в кэш, так как он временно локальный.

В другой области, если код использует какую-либо линейную структуру данных (например, массив) и это тоже в цикле с приращением индекса, легко заметить, что хотя текущая потребность только 3-яместоположение (например) этой структуры данных, очень скоро также потребуются следующие местоположения, потому что индекс увеличивается на 1 для этой линейной структуры данных.Так что было бы здорово, если бы мы вводили данные и в следующие несколько мест.Это принцип пространственной локации.Следующие несколько местоположений могут быть введены в кэш, поскольку они локально локальны.

Концепция локальности в основном состоит в том, чтобы идентифицировать данные и инструкции для внесения в кэш, чтобы мы могли уменьшить количество ошибок в кеше и эффективно использовать это специальное место.

2 голосов
/ 15 февраля 2019

Давайте начнем с определения как временного, так и пространственного местоположения.

Временная локализация - Временная локализация означает, что в скором времени могут потребоваться текущие данные или инструкция, которые извлекаются. Поэтому мы должны хранить эти данные или инструкцию в кэш-памяти, чтобы избежать повторного поиска в основной памяти тех же данных и, таким образом, сэкономить время.

Пространственная локальность - Пространственная локальность означает инструкцию или данные рядом с текущей ячейкой памяти, которая выбирается, и может понадобиться в ближайшее время.

sum = 0;
for (i = 0; i < arr.length; i++)
  sum += arr[i];
return sum;

Теперь, посмотрев на этот пример, здесь снова и снова используется переменная sum, которая показывает Temporal Locality , а затем к значениям массива arr обращаются по порядку, т.е. arr [0], arr [1] , arr [2], ... и т. д. и показывает Пространственная локальность в виде массивов Непрерывные (смежные) блоки памяти, поэтому данные, находящиеся рядом с текущей ячейкой памяти, выбираются.

Теперь рассмотрим этот пример

for(i = 0; i < 20; i++)
    for(j = 0; j < 10; j++)
        a[i] = a[i]*j;

Здесь мы видим временную локализацию, поскольку [i] во втором цикле используется снова и снова, а затем осуществляется доступ к переменной j в порядке, который показывает пространственную локализацию.

2 голосов
/ 18 октября 2011

Внешний цикл является примером пространственной локации. Он последовательно увеличивает адрес, который вызывает внутренний цикл for.

Внутренний цикл демонстрирует временную локальность. Один и тот же адрес памяти доступен десять раз подряд и умножается на j каждый раз.

Что касается ваших первых двух вопросов, то и i, и j (счетчики циклов) являются очень хорошими примерами временной локализации.

Локальность - это мера, применяемая кешем для минимизации обращений к памяти. Если инструкция должна знать значение адреса памяти, которого еще нет в кэше, она получит доступ к памяти и сохранит все окружающие области памяти в кэше.

...