Почему вычисления с высокой временной локальностью, как правило, имеют меньше истинных пропусков общего кэша?

#caching #memory #operating-system

Вопрос:

В настоящее время я пытаюсь понять концепцию истинного обмена.

Я наткнулся на следующий ресурс, который объясняет, что такое истинные промахи в кэше общего доступа:

Истинные промахи в кэше общего доступа возникают всякий раз, когда два процессора обращаются к одному и тому же слову данных. Для истинного совместного использования требуется, чтобы задействованные процессоры явно синхронизировались друг с другом для обеспечения корректности программы. Считается, что вычисление имеет временную локальность, если оно повторно использует большую часть данных, к которым оно получало доступ; программы с высокой временной локальностью, как правило, имеют менее достоверный общий доступ. Объем истинного совместного использования в программе является критическим фактором производительности на многопроцессорах; высокие уровни истинного совместного использования и синхронизации могут легко превзойти преимущество параллелизма.

Источник: https://suif.stanford.edu/papers/anderson95/node2.html

Часть, которая меня смущает, заключается в следующем:

…программы с высокой временной локализацией, как правило, имеют менее реальный общий доступ.

Почему программы с высокой временной локальностью имеют меньше истинных пропусков общего кэша?

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

Например, как я понимаю, следующий фрагмент псевдокода имеет высокую временную локальность в том смысле, что я ссылаюсь на одну и ту же переменную sum в каждой итерации моего цикла.

 int sum = 0
for (i = 0; i < n; i  ) {
    sum  = 1;
}
 

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

Разве я только что не продемонстрировал программу, которая имеет высокую временную локальность и большое количество истинных пропусков общего кэша?