2011-01-05 7 views
11

Solo conozco las ideas básicas sobre la asignación de memoria alineada. Pero no me importó mucho alinear el problema porque no soy un programador de ensamblaje, tampoco tenía experiencia con MMX/SIMD. Y creo que esta es una de las optimizaciones prematuras.¿Pagará la asignación de memoria alineada con la línea de caché?

En estos días, las personas dicen cada vez más acerca de la memoria caché, la coherencia de la memoria caché, la optimización del tamaño, etc. Algunos códigos fuente incluso asignan memoria alineada explícitamente en las líneas de caché de la CPU.

Francamente, no sé cuánto es el tamaño de la línea de caché de mi CPU i7. Sé que no habrá daños con alineación de gran tamaño. ¿Pero realmente valdrá la pena, sin SIMD?

Digamos que hay 100000 elementos de datos de 100 bytes en un programa. Y el acceso a estos datos es el trabajo más intenso del programa.

Si cambiamos la estructura de datos y hacemos todos los datos de tamaño de 100 bytes alineados por 16 bytes, ¿es posible obtener una ganancia de rendimiento notable? 10%? 5%?

+2

Hablando de optimización prematura, ¿sabía usted que los buenos algoritmos a menudo pueden dar cientos o miles de incrementos de velocidad por ciento para conjuntos de datos más grandes (y aún más para uno mayor)?;) Los detalles sobre qué tan bien el programa juega con la memoria caché se encuentran en la lista de computación de alto rendimiento, pero para la mayoría de las aplicaciones, nunca importará. – delnan

+1

Creo que 64bytes es un tamaño de línea de caché común, no de 16bytes. –

+0

Obtuve una mejora diez veces mayor de un algoritmo una vez mediante la alineación de caché y la recuperación previa de sus accesos de memoria. – Crashworks

Respuesta

4

La mayoría de las discusiones sobre la alineación de la línea de caché se refieren a la informática de alto rendimiento que trabaja con muchos subprocesos y mantiene la escalabilidad lo más parecida posible a la lineal. En esas discusiones, el motivo de la alineación de la línea de caché es evitar que una variable de escritura en una de datos invalide la línea de caché que también contiene otra variable utilizada por una cadena diferente.

Por lo tanto, a menos que intente escribir código que se escale a un número muy elevado de núcleos de procesador, la alineación de la línea de caché probablemente no le importará demasiado. pero de nuevo, pruébelo y vea.

+0

Creo que todas las respuestas dieron sus propias lecciones, pero esta respuesta puede ser la regla general (pero el voto mínimo), así que acepté esto. Gracias. – 9dan

+2

Dos hilos son suficientes para compartir falsamente mostrando su cabeza abrazadora. (Pero con un tamaño de datos de 100 bytes, dudo que el uso compartido falso sea un problema para ellos OP). – AProgrammer

+0

@Aprogrammer buen punto acerca de escribir. Solo me ha preocupado la lectura. – 9dan

4

Depende de su sistema. Pruébalo, ejecuta algunos puntos de referencia y averígualo.

+0

+1 para el empericalismo –

+1

Entonces, es realmente la optimización prematura. ¿Y cómo se puede hacer sin una función confiable de detección de CPU y una lista de información de la memoria caché de la CPU? Hmm ... ¿Me estoy preocupando demasiado por nada? – 9dan

+1

Toda la optimización es prematura hasta que realmente haya probado lo que está siendo lento. – OrangeDog

5

Optimización de caché incluso para la aplicación monothread. Pero la optimización de la memoria caché no necesariamente alinea los datos al inicio de la memoria caché, ya que hay varios factores a tener en cuenta. Así que el camino a seguir es:

  • ¿Cumples con tus requisitos de rendimiento? En caso afirmativo, ¿por qué perder tiempo para optimizar? Optimizar con el fin de optimizar el pago raramente.

  • mida dónde está su cuello de botella. Si sospecha que hay problemas de caché, use una herramienta que informa sobre la falta de memoria caché y, así, tenga una idea de cuánto podría ganar.

A nivel higest, el objetivo de la optimización de la memoria caché es llenar la memoria caché con datos de interés, manteniendo los datos no interesantes fuera de él. Si está realizando una programación de múltiples hilos, también es importante evitar la interferencia entre los hilos. Luego, también debe evitar algunas cosas que son específicas de algunas implementaciones de caché, como los efectos de resonancia que a veces reducen el tamaño del caché de effectice para caché no totalmente asociativa.

+0

Entonces, aparentemente para lectura, probablemente para escritura, la asignación de memoria alineada en la línea de caché no es un problema importante, ¿verdad? – 9dan

+1

Si sus datos son de solo lectura, lo importante es que los datos a los que se acceden juntos permanezcan en la memoria caché lo más posible. El tamaño de línea de i7 es de 64 bytes (consulte http://www.agner.org/optimize/microarchitecture.pdf), por lo que uno de sus datos alineados correctamente abarcará 2 líneas de caché, mientras que si no lo está, tomará 3 caché. líneas. Por lo tanto, podría ser útil (¿escribí que la medición era el camino a seguir cuando se desea optimizar?) – AProgrammer

+0

gracias por su amable explicación. Lo revisaré. – 9dan

Cuestiones relacionadas