Наибольшее различие в производительности произойдет, когда вы будете выполнять произвольно расширенный произвольный доступ к большой области памяти, где «большой» означает гораздо больший, чем диапазон, который может отображаться всеми небольшими записями страниц в TLB. (которые обычно имеют несколько уровней в современных процессорах).
Чтобы усложнить задачу, количество записей TLB для страниц размером 4 КБ часто превышает количество записей для страниц размером 2 МБ, но это сильно зависит от процессора. Существует также много различий в количестве записей «больших страниц», доступных в TLB уровня 2.
Например, в системе AMD Opteron Family 10h Revision D («Стамбул») cpuid сообщает:
- L1 DTLB: 4 КБ страниц: 48 записей; 2 МБ страниц: 48 записей; 1 ГБ страниц: 48 записей
- L2 TLB: 4 КБ страниц: 512 записей; 2 МБ страниц: 128 записей; 1 ГБ страниц: 16 записей
В системе Intel Xeon 56xx («Westmere») cpuid сообщает:
- L1 DTLB: 4 КБ страниц: 64 записи; 2MB страниц: 32 записи
- L2 TLB: страницы 4 КБ: 512 записей; 2 МБ страниц: нет
Оба могут отображать 2 МБ (512 * 4 КБ), используя небольшие страницы, прежде чем потеряет TLB уровня 2, в то время как система Westmere может отображать 64 МБ, используя свои 32 записи TLB 2 МБ, а система AMD может отображать 352 МБ, используя 176 записей TLB 2 МБ в своем TLB L1 и L2. Любая система получит значительное ускорение за счет использования больших страниц для произвольного доступа к диапазонам памяти, которые намного больше, чем 2 МБ и меньше, чем 64 МБ. Система AMD должна продолжать показывать хорошую производительность, используя большие страницы для гораздо большего диапазона памяти.
То, чего вы пытаетесь избежать во всех этих случаях, - это наихудший сценарий (примечание 1) для обхода всех четырех уровней иерархической трансляции адресов x86_64.
Если ни один из механизмов кэширования преобразования адресов (примечание 2) не работает, для этого требуется:
- 5 поездок в память для загрузки данных, отображаемых на странице 4 КБ,
- 4 поездки в память для загрузки данных, отображаемых на странице размером 2 МБ, и
- 3 поездки в память для загрузки данных, отображаемых на странице объемом 1 ГБ.
В каждом случае последняя поездка в память должна получить запрошенные данные, тогда как другие поездки необходимы для получения различных частей информации о переводе страницы.
Лучшее описание, которое я видел, приведено в разделе 5.3 «Руководства по программированию для архитектуры AMD64, том 2: Системное программирование» (публикация 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf
Примечание 1: Приведенные выше цифры не являются на самом деле худшим случаем. Запуск под виртуальной машиной ухудшает эти показатели. Работа в среде, которая заставляет память, содержащую различные уровни таблиц страниц, переключаться на диск, ухудшает производительность * .
Примечание 2: К сожалению, даже знания этого уровня детализации недостаточно, потому что все современные процессоры имеют дополнительные кэши для верхних уровней иерархии перевода страниц. Насколько я могу судить, они очень плохо документированы в общественных местах.