Временная местность в горе памяти - PullRequest
3 голосов
/ 23 июня 2019

В учебнике csapp описание горы памяти означает, что увеличение рабочего размера ухудшает временную локализацию, но я чувствую, что факторы size и stride способствуют только пространственной локализации, так как пропускная способность уменьшаетсякогда больше данных редко хранится в кешах более низкого уровня.

Где здесь временная локализация?Насколько я знаю, это означает, что в ближайшем будущем снова будет использоваться тот же конкретный адрес памяти, как показано в этом ответе: Что такое месторасположение ссылки?

memory mountain chart

1 Ответ

2 голосов
/ 28 июня 2019

Этот график создается путем последовательного обхода элементов массива фиксированного размера. Параметр шага определяет количество элементов, которые должны быть пропущены между двумя последовательно доступными элементами. Параметр size указывает общий размер массива (включая элементы, которые могут быть пропущены). Основной цикл теста выглядит следующим образом (вы можете получить код из здесь ):

for (i = 0; i < size / sizeof(double); i += stride*4) {
    acc0 = acc0 + data[i];     
    acc1 = acc1 + data[i+stride];
    acc2 = acc2 + data[i+stride*2]; 
    acc3 = acc3 + data[i+stride*3];
}

Этот цикл показан в книге на рис. 6.40. В книге не показано и не упомянуто, что этот цикл выполняется один раз для прогрева иерархии кэша, а затем измеряется пропускная способность памяти для ряда запусков. Минимальная пропускная способность памяти для всех запусков (в разогретом кеше) - это та, которая отображается.

Как размер, так и параметры шага вместе влияют на временную локальность (но только шаг влияет на пространственную локализацию). Например, конфигурация 32k-s0 имеет временную локальность, аналогичную конфигурации 64k-s1, поскольку первый доступ и последний доступ к каждой строке чередуются с одинаковым количеством строк кэша. Если вы удерживаете размер на определенном значении и идете вдоль оси шага, некоторые линии, к которым многократно обращаются на более низком шаге, не будут доступны на более высоких шагах, что делает их временную локализацию практически нулевой. Можно определить временную местность формально, но я не буду этого делать, чтобы ответить на вопрос. С другой стороны, если вы держите шаг на определенном значении и идете вдоль оси размера, временная локальность для каждой доступной линии становится меньше с более высокими размерами. Однако производительность ухудшается не из-за равномерно более низкого временного местоположения каждой доступной линии, а из-за большего размера рабочего набора.

Я думаю, что ось размера лучше иллюстрирует влияние размера рабочего набора (объем памяти, к которому будет обращаться цикл во время его выполнения) на время выполнения, чем на временную локальность. Чтобы наблюдать влияние временной локализации на производительность, пропускная способность памяти первого запуска этого цикла должна сравниваться с пропускной способностью второго запуска того же цикла (тот же размер и шаг). Временная локальность увеличивается на ту же величину для каждой строки кэша, к которой осуществляется доступ, во втором прогоне цикла, и, если иерархия кэша оптимизирована для временной локализации, пропускная способность второго прогона должна быть лучше, чем у первого. В общем, пропускная способность каждого из N последовательных вызовов одного и того же цикла должна быть нанесена на график, чтобы увидеть полное влияние временной локализации, где N> = 2.

Кстати, горы памяти на других процессорах можно найти здесь и здесь . Вы можете создать трехмерный горный участок, используя этот или этот скрипт.

...