2012-08-08 14 views
8

Supongamos que en un código de velocidad crítica, tenemos un par de matrices que se usan frecuentemente juntas, donde el tamaño exacto no importa, solo necesita establecerse en algo razonable, p.Evitar potencias de 2 para compatibilidad con caché

int a[256], b[256]; 

¿Es esta potencialmente un pessimization porque los bits de dirección bajos siendo la misma puede hacer que sea más difícil para el caché de manejar simultáneamente ambas matrices? ¿Sería mejor especificar, p. 300 en lugar de 256?

+4

Tiene razón al sospechar que los poderes de dos podría ser problemático. Pero generalmente solo se aplica cuando tienes más de 2 pasos. (especialmente cuando excede su asociatividad de caché L1) [Aquí hay un ejemplo de dónde realmente se vuelve problemático.] (http://stackoverflow.com/questions/8547778/why-is-one-loop-so-much-slower-than -two-loops) En ese ejemplo, hay 4 arrays, todos los cuales están alineados con el mismo desplazamiento desde el inicio de una página de 4k. – Mysticial

Respuesta

6

Moviendo mi comentario a una respuesta:

Tiene usted razón para sospechar que las potencias de dos niños podrían ser problemático. Pero generalmente solo se aplica cuando tienes más de 2 pasos. No se pone realmente mal hasta que excedas tu L1 cache associativity. Pero incluso antes de eso, podría encontrarse con problemas de alias falsos.

Éstos son dos ejemplos en los poderes-de-dos en realidad llegar a ser problemática:

En el primer ejemplo, hay 4 arrays - todos los cuales están alineados a la misma compensación desde el inicio de una página 4k.

En el segundo ejemplo, el salto en columna de una matriz destruye por completo el rendimiento cuando el tamaño es una potencia de dos.


En cualquier caso, tenga en cuenta que el concepto clave es en realidad la alineación de las matrices, no el tamaño de las mismas. Si observa que está entrando en ralentizaciones, simplemente agregue algo de relleno entre sus matrices para romper la alineación.

+0

Otro truco útil: si solo accede a las entradas de una en una (y nunca accede a un "slice" a través de memcpy o similar) puede intentar aplicar una función hash trivial a los índices de las matrices. Por lo general, XOR. Es decir. siempre acceda a [i^0x67] y b [j^0x34]. // Acabo de encontrar un lugar donde eso ayude. –

Cuestiones relacionadas