Одним из процессов, лежащих в основе организации виртуальной памяти, является трансляция линейного адреса в физический. Линейный адрес, подлежащий трансляции, разбивается на поля, при этом 12 младших битов адресуют конкретный байт в пределах страницы, объемом 4 килобайта, остальные биты линейного адреса используются для индексирования таблиц страниц, организованных в виде иерархической структуры. Два фундаментальных документа от Intel детально описывают процесс этой трансляции. Информация в них актуальна и для процессоров AMD.
В основе процедуры лежит такое понятие, как дескриптор, соответствующий каждой странице памяти. Для кэширования таких дескрипторов используется буфер ассоциативной трансляции (англ. Translation lookaside buffer, TLB). Это своего рода кэш-память, внутренний ресурс процессора. Подобно кэш-памяти, TLB может переполняться, что происходит, если количество страниц, с которыми работает программа, превышает заранее определенный лимит. Переполнение TLB приводит к необходимости подгружать дескрипторы страниц из DRAM.
В ходе эволюции x86-архитектуры возникли так называемые «большие страницы» или Large Pages. Уловка состоит в том, чтобы пропустить один из иерархических уровней трансляционных таблиц, при этом адресные биты, соответствующие этому уровню отнести к полю, выбирающему байт в пределах страницы.
- В 32-битном режиме на каждом иерархическом уровне для индексирования таблиц используется 10 бит, следовательно, разрядность адресного поля страницы возрастет до 12+10=22 бит, размер страницы при этом составляет 222 байта, т.е. 4MB.
- В 64-битном режиме на каждом иерархическом уровне для индексирования таблиц используется 9 бит, следовательно, разрядность адресного поля страницы возрастет до 12+9=21 бита, размер страницы при этом составляет 221 байта, т.е. 2MB.
Преимущества больших страниц очевидны. Объем памяти, описываемый одним дескриптором, фактически возрастает на три порядка: вместо 4 килобайт — 4 мегабайта (или 2МБ для 64-битного режима). На практике, в большинстве случаев это позволяет избежать переполнения буфера ассоциативной трансляции, кроме того, длина иерархической цепочки таблиц уменьшается на единицу. Оба этих фактора упрощают процедуру вычисления физического адреса, способствуя снижению латентности. Недостатки — ухудшение маневренности при выделении памяти и неэкономное ее расходование, поскольку базовый адрес и объем выделяемого блока становятся кратными размеру большой страницы.
Большие страницы и латентность
Ситуация, при которой дескриптор страницы отсутствует в TLB и требуется дополнительное время для его загрузки из оперативной памяти, называется TLB-промахом (TLB miss). Если дескриптор находится в TLB, то имеет место TLB hit — это гарантирует минимальную латентность при доступе к запрошенным данным.
Не требует доказательств тот факт, что использование больших страниц позволяет предотвращать переполнение буфера TLB, что снижает вероятность возникновения ситуации TLB miss.
Интерференция Large Pages и Prefetch
С появлением функционального расширения SSE в наборе инструкций x86 появились так называемые Prefetch Hints, это своеобразные намеки, позволяющие программному обеспечению явным образом заблаговременно информировать процессор о предстоящих операциях доступа к памяти. В отличие от классических инструкций, выполнение которых строго детерминировано процессорной архитектурой, отработка различными процессорами Prefetch hints и других видов «намеков» носит Implementation Specific характер, то есть зависит от модели CPU и контекста выполнения.
Вместе с тем, предполагается, что получив такой «намек» процессор может заблаговременно загрузить данные. Впоследствии, к моменту явного обращения, они уже будут находиться в кэш-памяти или транзитном буфере (в зависимости от контекста выполнения), что позволит нивелировать латентность.
Что в итоге?
В итоге, создавая тестовую среду для оценки производительности ОЗУ, необходимо учитывать взаимовлияние способов адресации виртуальной памяти, фактора TLB и тех спекулятивных методов («намеков»), которые в архитектуре конкретного CPU могут определять такие кардинальные параметры платформы, как латентность доступа и пропускная способность DRAM.
Опираясь на Implementation-Specific особенности процессора, в частности используя Prefetch hints, следует учитывать, что поведение TLB при спекулятивной загрузке может зависеть не только от модели процессора, но и от содержимого Model-Specific регистров, загруженного блока микрокодов и ряда других факторов.
К истории вопроса
Согласно документации Intel процессоры P4 семейства Willamette и Northwood игнорируют Prefetch hint, если его отработка приведет к TLB miss, поэтому для них влияние Large Pages достаточно выражено не только в тестах латентности, но и пропускной способности DRAM. Это результат того, что при увеличении размера страницы с 4KB до 4MB количество барьеров, расположенных на стыках страниц и препятствующих опережающему чтению, драматически уменьшается.
У предшественников Prescott отсутствие дескриптора страницы в буфере ассоциативной трансляции (TLB miss) останавливает работу механизма опережающей загрузки — Prefetch. Именно TLB-промах создает своеобразный барьер, который не может преодолеть спекулятивная загрузка, и который преодолевается только в ходе явного обращения к операнду, а значит скорость падает. Большие страницы, снижая количество TLB-промахов, устраняют данные барьеры, поэтому при их использовании растет пропускная способность памяти.
В Prescott такой барьер устранен, процессоры этого и последующих поколений способны загрузить TLB в рамках опережающей выборки, не ожидая явного обращения к операнду, когда прятать латентность уже поздно — их архитектура предполагает обработку TLB-промахов и загрузку дескрипторов страниц и в ходе спекулятивных сценариев. В современных процессорах изменение состояния TLB также происходит под влиянием опережающего выполнения фрагмента программного кода, который на самом деле, согласно законной логике программы, не должен быть выполнен. Способность изменять содержимое буфера TLB в рамках спекулятивного выполнения в дальнейшем сыграла злую шутку, став одной из составляющих так называемых микроархитектурных уязвимостей.
Литература и ссылки
- IA-32 Intel Architecture Optimization, Reference Manual
- TLBs, Paging-Structure Caches, and Their Invalidation
- 5-Level Paging and 5-Level EPT