Каково поведение кэша L1 / L2 для LUT и тому подобного? - PullRequest
3 голосов
/ 03 декабря 2010

Принимая LUT, скажем, 512 КБ 64-битных двойных типов.Вообще говоря, как процессор кэширует структуру в L1 или L2?

Например: я получаю доступ к среднему элементу, пытается ли он кэшировать весь LUT или только некоторые из них - скажем, средний элемент, а затем n последующих элементов?использование процессора для определения того, что он хранит в кеше L2?Есть ли какая-то стратегия прогнозирования, которой она следует

Примечание: я предполагаю, что x86, но мне было бы интересно узнать, как работают другие архитектуры POWER, SPARC и т. Д.

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

Это зависит от структуры данных, которую вы используете для LUT (справочная таблица?)

Кэши лучше всего работают с вещами, которые расположены непрерывно в памяти (например, в виде массивов или std :: vectors), а не разбросаны по всему.

Проще говоря, когда вы обращаетесь к области памяти, в нее загружается блок оперативной памяти («строка кэша» - 64 байта на x86), возможно, некоторые ранее-кэшированные данные.

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

Да, есть перспектива, ограниченная довольно упрощенными алгоритмами и невозможностью пересекать границы страницы (размер страницы памяти на x86 обычно составляет 4 КБ.)

Я предлагаю вам прочитать Что каждый программист должен знать о памяти .В нем много полезной информации по этому вопросу.

1 голос
/ 03 декабря 2010

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

Кэш-память ЦП обычно использует некоторый механизм вытеснения LRU (используется не так давно, как при удалении самой старой строки кэша при пропадании кэша), а также имеет некоторое отображение адреса памяти в конкретный набор строк кэша. (Это приводит к одной из многих ложных ошибок совместного использования в x86, если вы пытаетесь читать с нескольких адресов, выровненных по границе 4k или 16M.)

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

...