Библиотека сайта rus-linux.net
Что каждый программист должен знать о памяти.
Часть 2: Кэш-память процессора
Оригинал: "Memory part 2: CPU caches"Автор: Ulrich Drepper
Дата публикации: October 1, 2007
Перевод: Н.Ромоданов
Дата перевода: апрель 2012 г.
Назад | Оглавление | Вперед |
3.1 Кэш процессора — общая картина
Прежде, чем погружаться в технические детали реализации кэш-памяти процессора, для некоторых читателей может быть полезным сначала рассмотреть некоторые особенности того, как кэш-память вписывается в "общую картину" современной компьютерной системы.
Рис 3.1: Минимальная конфигурация кэш-памяти
На рис.3.1 показана минимальная конфигурация кэш-памяти. Она соответствует архитектуре, которую можно найти в ранних системах со встроенной кэш-памятью процессора. Здесь ядро процессора уже не напрямую связано с основной памятью. {В самых ранних системах кэш-память была присоединена к системной шине точно также, как процессор и оперативная память. Это больше смахивало на некотрое приспособление, а не на реальное решение}. Загрузка всех данных и их запоминание в памяти должны осуществляться через кэш-память. Соединением между ядром процессора и кэш-памятью представляет собой специальное быстрое соединение. В упрощенном представлении оперативная память и кэш-память подключаются к системной шине, которая также может использоваться для подключения к другим компонентам системы. Мы будем называть системную шину "шиной FSB", т. е. так, как она называется сегодня, смотрите раздел 2.2. В данном разделе мы будем игнорировать наличие северного моста Northbridge; предполагается, что он используется для того, чтобы облегчить обмен данными между процессором (процессорами) и основной памятью.
Несмотря на то, что в компьютерах в течение последних нескольких десятилетий используется архитектура фон Неймана, опыт показывает, что использование отдельной кэш-памяти для кода и для данных дает преимущество. Фирма Intel с 1993 года использует отдельную кэш-память для кода и для данных и не намеревается от этого отказываться. Области памяти, используемые под код и под данные, в значительной мере независимы друг от друга и, следовательно, отдельная кэш-память будет работать лучше. В последние годы появилась еще одна особенность: в наиболее распространенных процессорах шаг декодирования инструкций выполняется медленно; кэширование декодированных инструкций может ускорить выполнение, особенно в тех случаях, когда конвейер пуст из-за неправильного предсказания инструкций или из-за невозможности выполнить само предсказание.
Вскоре после добавления кэш-памяти система стала еще более сложной. Снова увеличилась разница по скорости между кэш-памятью и основной памятью, и из-за этого был добавлен еще один уровень кэш-памяти, который был больше по размеру, но работал медленнее, чем кэш-память первого уровня. Просто увеличить размер кэш-памяти первого уровня не удалось по экономическим причинам. Сегодня есть даже машины, в которых регулярно используется три уровнями кэш-памяти. Система с таким процессором показана на рис.3.2. Поскольку количество ядер в одном процессоре увеличивается, в будущем количество уровней кэш-памяти может увеличиться еще больше.
Рис.3.2: Процессор с тремя уровнями кэш-памяти
На рис.3.2 показаны три уровня кэш-памяти и приведены обозначения, которыми мы будем пользоваться в оставшейся части статьи. L1d является кэш-памятью 1-го уровня для данных, L1i является кэш-памятью 1-го уровня для инструкций и т.д. Заметьте, что это только схема; поток данных на самом деле может на пути от ядра к оперативной памяти не проходить через кэш-память высокого уровня. Разработчикам процессоров предоставлено достаточно свободы в проектирования интерфейса кэш-памяти. Для программистов эти проектные решения невидимы.
Кроме того, у нас есть процессоры, у которых есть несколько ядер, и каждое ядро может иметь несколько "потоков" ("threads"). Разница между ядром и потоком в том, что в отдельных ядрах имеются отдельные копии (почти {в более ранних многоядерных процессорах даже имелась отдельная кэш-память второго и третьего уровня}) всех аппаратных ресурсов. Ядра в случае, если они не используют одни те же ресурсы, например, если одни одновременно к внешней шине, могут работать полностью самостоятельно. Потоки, с другой стороны, разделяют почти все ресурсы процессора. Фирма Intel реализует потоки так, что для потоков отдельно реализованы только регистры, причем и здесь есть ограничения, поскольку некоторые регистры являются общими. Поэтому "общая картина" современного процессора будет выглядеть так, как это показано на рис.3.3.
Рис.3.3: Много процессоров, много ядер, много потоков
На этом рисунке у нас есть два процессора, каждый с двумя ядрами, каждое из которых имеет два потока. Потоки совместно используют кэш-память 1-го уровня. В ядрах (показаны темно-серым цветом) есть отдельная кэш-память 1-го уровня. Все ядра процессора совместно используют кэш-память более высокого уровня. Два процессора (два больших прямоугольника, показанных светло серым цветом), конечно, не разделяют (не используют одновременно — прим.пер.) какую-либо кэш-память. Все это будет важно в случаях, когда речь пойдет о вилянии кэш-памяти в приложениях с несколькими процессами или несколькими потоками.
Назад | Оглавление | Вперед |