2011-12-23 6 views
11

Estoy trabajando en un sistema, escrito en C++, ejecutándose en un Xeon en Linux, que necesita ejecutarse lo más rápido posible. Hay una gran estructura de datos (básicamente una matriz de estructuras) contenida en la RAM, más de 10 GB, y se debe acceder periódicamente a los elementos de la misma. Quiero revisar la estructura de datos para trabajar con el mecanismo de caché del sistema tanto como sea posible.¿Cuántos bytes trae un Xeon en el caché por acceso a la memoria?

Actualmente, los accesos se realizan principalmente de forma aleatoria en toda la estructura, y cada vez que se leen de 1 a 4 entradas de 32 bits. Pasará mucho tiempo antes de que se realice otra lectura en el mismo lugar, por lo que no se obtiene beneficio de la memoria caché.

Ahora sé que cuando lee un byte de una ubicación aleatoria en la memoria RAM, más que solo ese byte se lleva a la caché. Mi pregunta es cuántos bytes traen? ¿Es 16, 32, 64, 4096? ¿Esto se llama una línea de caché?

Estoy buscando rediseñar la estructura de datos para minimizar los accesos aleatorios a la memoria RAM y trabajar con la memoria caché en lugar de hacerlo en su contra. Saber cuántos bytes se extraen en la caché en un acceso aleatorio informará las elecciones de diseño que haga.

Actualización (octubre de 2014): Poco después de que hice la pregunta anterior, el proyecto se puso en espera. Desde entonces se ha reanudado y, en base a las sugerencias en las respuestas a continuación, realicé algunos experimentos sobre el acceso a la RAM, porque parecía probable que se estuviera produciendo un ataque de TLB. Revisé el programa para ejecutarlo con páginas enormes (2MB en lugar de 4KB estándar) y observé una pequeña aceleración, aproximadamente 2.5%. Encontré buena información acerca de la configuración de enormes páginas here y here.

+5

Sí, línea de caché. Puede asumir 64 bytes hasta que descubra cuál de las docenas de modelos de procesadores Xeon tiene. Las cachés L2 y L3 también juegan un papel. Céntrese en los accesos de memoria secuenciales y no asuma nada.Medida. –

+0

Gracias a todos por sus respuestas. –

Respuesta

7

Las CPU actuales recogen la memoria en fragmentos de (normalmente) 64 bytes, llamados líneas de caché. Cuando lee una ubicación de memoria particular, toda la línea de caché se busca desde la memoria principal en la memoria caché.

Más aquí: http://igoro.com/archive/gallery-of-processor-cache-effects/

+0

Artículo vinculado muy informativo, @Michael. +1. –

2

vieja cuestión de forma que tenga alguna información que pueda ser de utilidad para usted (en particular, la primera respuesta dónde buscar la información de la CPU Linux - respondedor no menciona la línea tamaño adecuado, pero 'otra información' además de asociatividad, etc.). La pregunta es para x86, pero las respuestas son más generales. Digno de una mirada.

Where is the L1 memory cache of Intel x86 processors documented?

+0

Consejos útiles sobre la pregunta vinculada, @gnometorule. +1. –

3

una línea de caché para cualquier procesador Xeon actual es de 64 bytes. Otra cosa en la que quizás quieras pensar es el TLB. Si realmente está haciendo accesos aleatorios a través de 10GB de memoria, entonces es probable que tenga muchas fallas TLB que potencialmente pueden ser tan costosas como fallas en la caché. Puedes trabajar con páginas grandes, pero es algo a tener en cuenta.

+0

¿Podría dar más detalles, @Gabriel? ¿Qué significa TLB y cómo ayudarían las páginas grandes? –

+0

Traducir Buffers de Lookaside: están involucrados en hacer que la paginación de hardware sea menos lenta (historia larga, google :)). Entrada de una página, una TLB: necesita menos entradas de TLB si mapea su memoria con grandes (4 megas o 2 megas, dependiendo del modo de la CPU) que las páginas normales (4 kbytes). – snemarch

+0

TLB significa "translation lookaside buffer". Cuando accede a la memoria, debe traducir la dirección virtual a una dirección física. Esto se hace en granularidad de página y el tamaño de página típico para x86 es 4 KB. El TLB almacena en caché la traducción de la dirección virtual a la física, pero es una estructura relativamente pequeña (alrededor de 200 entradas). –

1

Es posible que desee dirigirse a http://agner.org/optimize/ y obtener los archivos PDF de optimización disponibles allí - hay una gran cantidad de información buena (bajo nivel) allí. Bastante centrado en el nivel de lenguaje ensamblador, pero también hay lecciones que aprender de los programadores C/C++.

Volumen 3, "La microarquitectura de procesadores Intel, AMD y VIA" debe ser de interés :-)

Cuestiones relacionadas