Кэш-память и ее уровни

26 Дек 2017

Статическая память, использующая в качестве ячейки хранения полу­про­вод­ни­ко­вый триггер — транзисторную схему с двумя устойчивыми состояниями, востребована современными процессорами в качестве сверхоперативного запоминающего устройства. В русском языке такому устройству соответствует устоявшийся термин — кэш-память (от англ. cache — запасник).

Функционально кэш-память — это транзитный буфер бы­стро­дей­ству­ю­щей памяти произвольного доступа и ограниченного объема, рас­по­ло­жен­ный отдельно от оперативного запоминающего устройства, предназначенный для временного хранения про­цес­со­ром толь­ко что использованной информации или тех команд и/или данных, которые вероятно по­тре­бу­ют­ся в ближайшее время.

Разделение на инструкции и данные традиционно используется только в кэш-памяти L1-уровня, которая с мо­мен­та появления обычно размещается на процессорном кристалле. Кроме того, в семействе Pentium 4 существует по­ня­тие L1 Trace Cache для хранения уже декодированных инструкций. В этом случае при кэш-попадании имеет мес­то выигрыш не только за счет упреждающего чтения команд в кэш-память, но и за счет времени де­ко­ди­ро­ва­ния. В современных процессорах Intel очередь декодированных инструкций реализована в статусе L0 (то есть, ближе к ядру, чем L1), а уровень L1 по-прежнему представлен раздельной кэш-памятью инструкций и данных.

Для L2 разделение на инструкции и данные традиционно отсутствует еще со времен 386/486, когда L2-уровень был реализован на системной плате внешними по отношению к процессору микросхемами статической памяти. Отказ от сегрегации инструкций и данных привел к тому, что этот вид кэш-памяти называется Unified L2 Cache. Со­от­вет­ствен­но, для принятия решения о кэшировании ячейки, аргументом логических функций кэш-контроллера L2 является только адрес ячейки и не является тип доступа: код или данные.

Исключения из этих правил есть толь­ко в виртуальных машинах, в частности — в Oracle VirtualBox. Эти ис­клю­че­ния касаются декларирования кэш-памяти для CPUID, но не применимы к ее работе. Их целью является оп­ти­ми­за­ция разделения физических ресурсов между виртуальными машинами, в то время как физическая топология про­цес­со­ра и аппаратно реализованные алгоритмы функционирования кэш-контроллера не изменяются вслед­ствие вир­ту­а­ли­за­ции. Вместе с тем, с появлением технологии Quality of Service Enforcement, гипервизор получает в свое распоряжение аппаратный механизм управления разделением ресурсов между виртуальными машинами, а по­то­му метод поддержки CPUID для виртуальных процессоров может быть усложнен в будущем.

Рассмотрим состав и уровни кэш-памяти процессоров Intel и AMD с помощью утилиты Java CPUID (выделены но­ме­ра функций Deterministic Cache Parameters, а также информация об уровнях L2-кэш):


Рис 1. Кэш-память процессора AMD Ryzen


Рис 2. Кэш-память процессора Intel Haswell

Наряду с классификацией Code/Data не следует забывать о топологии запоминающих устройств относительно ядер. Например, для Intel Haswell, кэш L1 и L2 индивидуальны для каждого ядра, а L3-кэш общий для ядер одного сокета. Поэтому размеры L1 и L2 традиционно указываются для одного ядра, размер L3 указывается для всего про­цес­со­ра. Подытожим сказанное следующим наблюдением:

  • Кэш-память уровня L2 Unified общая с точки зрения разделения на данные и инструкции и по этому критерию отличается от L1 и похожа на L3.
  • Кэш L2 индивидуален с точки зрения принадлежности к ядру — у каждого ядра (или топологической группы ядер) свой кэш L2 — и по этому критерию отличается от L3 и сходен с L1.

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

Теги: