Сколько байтов контроллер кэша извлекает из основной памяти в кэш L2? - PullRequest
8 голосов
/ 22 марта 2012

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

first one утверждает, что мы получаем размер страницы раз

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

Чтобы дать вам реальный пример, если ЦП загрузил данные, хранящиеся в адресе 1000, контроллер кэша загрузит данные с «n» адресов после адреса 1000.Этот номер «n» называется страницей;если данный процессор работает с страницами размером 4 КБ (что является типичным значением), он будет загружать данные с 4096 адресов ниже текущей загружаемой позиции в памяти (адрес 1000 в нашем примере).На следующем рисунке мы иллюстрируем этот пример.

enter image description here

second one утверждает, что мы получаем sizeof (строка кэша) + sizeof(prefetcher) время

Таким образом, мы можем суммировать, как работает кэш памяти:

  1. ЦП запрашивает инструкцию / данные, хранящиеся по адресу «a».
  2. Поскольку содержимое с адреса «а» не находится внутри кеша памяти, ЦП должен извлекать его напрямую из ОЗУ.
  3. Контроллер кеша загружает строку (обычно 64 байта)начиная с адреса «а» в кэш-память.Это больше данных, чем запрашивается ЦП, поэтому, если программа продолжает работать последовательно (т.е. запрашивает адрес a + 1), следующая инструкция / данные, которые запрашивает ЦП, будут уже загружены в кэш-память.
  4. Схема под названием prefetcher загружает больше данных, расположенных после этой строки, то есть начинает загружать содержимое с адреса a + 64 в кеш.Чтобы дать вам реальный пример, процессоры Pentium 4 имеют 256-байтовый предварительный выборщик, поэтому он загружает следующие 256 байтов после строки, уже загруженной в кэш.

1 Ответ

9 голосов
/ 23 марта 2012

Полностью зависит от аппаратной реализации.Некоторые реализации загружают одну строку из основной памяти за раз - и размеры строк кэша сильно различаются между разными процессорами.Я видел размеры строк от 64 до 256 байт.По сути, размер «строки кеша» означает, что когда ЦП запрашивает память из основной ОЗУ, он делает так n байт за раз.Таким образом, если n равно 64 байта, и вы загружаете 4-байтовое целое число в 0x1004, MMU фактически отправит 64 байта через шину, все адреса от 0x1000 до 0x1040.Весь этот кусок данных будет храниться в кэше данных в виде одной строки.

Некоторые MMU могут извлекать несколько строк кэша по шине за запрос - так что выполнение запроса по адресу 0x1000 на машине с 64-байтовыми кэшами фактически загружает четыре строки от 0x1000 до 0x1100. Некоторые системы позволяют вам делать это явно с помощью специальных предварительных выборок кэша или кодов операций DMA.

Однако статья по вашей первой ссылке совершенно неверна.Это путает размер OS страницы памяти с аппаратным строкой кэша .Это совершенно разные понятия.Первый - это минимальный размер виртуального адресного пространства, которое ОС будет выделять сразу.Последнее является деталью того, как процессор взаимодействует с основной оперативной памятью.

Они похожи друг на друга только в том смысле, что когда в операционной системе заканчивается физическая память, она выводит на диск некоторую неиспользуемую недавно виртуальную память;затем, когда вы снова используете эту память, ОС загружает всю эту страницу с диска обратно в физическую память.Это аналогично (но не относится) к тому, как процессор загружает байты из ОЗУ, поэтому автор «Аппаратных секретов» был озадачен.

Хорошее место, чтобы узнать все о памяти компьютера и почему кэши работают так, как они это делают, - статья Ульриха Дреппера, Что каждый программист должен знать о памяти .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...