La mayor diferencia en el rendimiento vendrá cuando realice accesos aleatorios ampliamente espaciados a una gran región de memoria, donde "grande" significa mucho más grande que el rango que puede ser mapeado por todas las entradas de página pequeña en el TLB (que generalmente tienen múltiples niveles en procesadores modernos).
Para hacer las cosas más complejas, el número de entradas TLB para páginas de 4kB suele ser mayor que el número de entradas para páginas de 2MB, pero esto varía mucho según el procesador. También hay una gran variación en la cantidad de entradas de "página grande" disponibles en el Nivel 2 TLB.
Por ejemplo, en una 10h Revisión AMD Opteron familia D ("Istanbul") del sistema, informes CPUID:
- L1 DTLB: páginas de 4 KB: 48 entradas; 2MB páginas: 48 entradas; Páginas de 1GB: 48 entradas
- L2 TLB: 4kB páginas: 512 entradas; 2MB páginas: 128 entradas; páginas 1 GB: 16 entradas
Mientras que en un sistema Intel Xeon 56xx ("Westmere"), informes CPUID:
- L1 DTLB: páginas de 4 KB: 64 entradas; 2MB páginas: 32 entradas
- L2 TLB: 4kB páginas: 512 entradas; páginas 2 MB: ninguno
ambos pueden asignar 2 MB (512 * 4kB) usando pequeñas páginas antes de sufrir el nivel 2 TLB, mientras que el sistema de Westmere puede mapear 64MB usando sus 32 entradas 2MB TLB y el sistema de AMD puede mapear 352MB utilizando las 176 entradas de 2MB TLB en sus TLB L1 y L2. Cualquiera de los sistemas obtendrá una aceleración significativa mediante el uso de páginas grandes para accesos aleatorios sobre rangos de memoria que son mucho más grandes que 2MB y menos de 64MB. El sistema AMD debe continuar mostrando un buen rendimiento usando páginas grandes para rangos de memoria mucho más grandes.
Lo que está tratando de evitar en todos estos casos es el peor de los casos (nota 1) escenario de atravesar los cuatro niveles de la traducción de dirección jerárquica x86_64.
Si ninguno de los mecanismos de caché de traducción de direcciones (nota 2) de trabajo, se requiere:
- 5 viajes a la memoria para cargar datos mapeados en una página de 4 KB,
- 4 viajes a la memoria para cargar datos mapeados en una página de 2 MB, y
- 3 disparos a la memoria para cargar los datos mapeados en una página de 1GB.
En cada caso, el último viaje a la memoria es para obtener los datos solicitados, mientras que los otros viajes son necesarios para obtener las diversas partes de la información de traducción de la página. La mejor descripción que he visto es en la Sección 5.3 de AMD "Manual Volumen 2 de Arquitectura AMD64 Programador: Programación del sistema" (publicación 24593) http://support.amd.com/us/Embedded_TechDocs/24593.pdf
Nota 1: Las cifras anteriores no son realmente el caso peor. Correr bajo una máquina virtual empeora estos números. Al ejecutarse en un entorno que provoca que la memoria que contiene los distintos niveles de las tablas de páginas se intercambie al disco, el rendimiento es mucho mayor peor.
Nota 2: Desafortunadamente, incluso conocer este nivel de detalle no es suficiente, ya que todos los procesadores modernos tienen cachés adicionales para los niveles superiores de la jerarquía de traducción de páginas. Por lo que puedo decir, estos están muy mal documentados en público.
La recuperación previa de hardware no cruzará 4k límites de página, pero lo que probablemente esté viendo en el caso de línea recta es que los accesos a la tabla de página son muy predecibles, por lo que el recorrido de página que ocurre cuando falla en el TLB están todos en L1 (estas entradas de la página pueden haberse ingresado a través de la captación previa). – BeeOnRope