2009-11-12 7 views
8

Necesito mejorar el rendimiento del sistema.Cómo utilizar la salida cachegrind para optimizar la aplicación

El ciclo habitual de optimización se ha realizado y ya hemos logrado un rendimiento mejor de 1.5X.

Ahora estoy empezando a preguntarme si puedo utilizar la salida cachegrind para mejorar el rendimiento del sistema.

¿Alguien me puede decir cómo comenzar con esto?

Lo que entiendo es que debemos asegurarnos de que los datos utilizados con mayor frecuencia se mantengan lo suficientemente pequeños para que permanezcan en la memoria caché L1 y el siguiente conjunto de datos se ajuste a la L2.

¿Es esta la dirección correcta que estoy tomando?

Respuesta

6

Es cierto que la salida cachegrind en sí misma no proporciona demasiada información sobre cómo optimizar el código. Uno necesita saber cómo interpretarlo y lo que está diciendo acerca de que el ajuste de datos en L1 y L2 es la dirección correcta.

Para comprender completamente cómo los patrones de acceso a memoria influyen en el rendimiento, recomiendo leer un documento excelente "What Every Programmer Should Know About Memory" de Ulrich Drepper, el mantenedor libc de GNU.

+0

Gracias Kaustaurya, ese fue de hecho un excelente artículo. Recuerdo haber leído este artículo antes, pero esta vez pude apreciar mucho mejor las necesidades. – rajeshnair

2

De acuerdo con the Cachegrind documentation, los detalles que le da cachegrind son la cantidad de errores de caché para una parte determinada de su código. Necesitas saber cómo funcionan las memorias caché en la arquitectura a la que te diriges para que sepas cómo arreglar el código. En la práctica, esto significa hacer que los datos sean más pequeños o cambiar el patrón de acceso de algunos datos para que los datos en caché todavía estén en la caché. Sin embargo, debe comprender los datos y el acceso a los datos de su programa antes de poder actuar sobre la información. Como dice en el manual,

En resumen, Cachegrind puede indicarle dónde se encuentran algunos de los cuellos de botella en su código, pero no le puede decir cómo solucionarlos. Tienes que resolver eso por ti mismo. ¡Pero al menos tienes la información!

3

Si tiene problemas para analizar la salida de cachegrind, busque en KCacheGrind (debe estar disponible en su distribución preferida). Lo uso y lo encuentro bastante útil.

2

1.5x es una buena aceleración. Significa que encontraste algo que te tomó el 33% del tiempo del que podrías deshacerte. Apuesto a que puedes hacer más, incluso antes de llegar a problemas de bajo nivel como la memoria caché de datos. This is an example of how. Básicamente, podría tener problemas de rendimiento adicionales (y oportunidades de aceleración) que antes no eran grandes, como lo dice el 25%. Bueno, con la aceleración de 1.5x, ese 25% ahora es 37.5%, por lo que es "más valioso" de lo que era. A menudo, tal problema se presenta en la forma de una llamada a la función mid-stack que está solicitando un trabajo que, una vez que sabe cuánto cuesta, puede decidir que no es completamente necesario. Como kcachegrind realmente no los identifica, es posible que no se dé cuenta de que es un problema.

+0

Estoy de acuerdo en su mayoría. Sin embargo, no consideraría el caché como un problema de bajo nivel. Cualquier plataforma a la que te apuntes tendrá un caché (incluso tarjetas CUDA modernas). También es probable que la optimización de la memoria caché genere grandes mejoras y se puede hacer sin tener en cuenta la salida de ensamblaje del compilador. –

+0

@ JørgenFogh: Correcto. Los desarrolladores de procesadores han hecho todo lo posible en su dominio para optimizar el tiempo de procesamiento. Nosotros, los desarrolladores de software, no siempre respondemos asegurándonos de que nuestro código sea "delicado".Lo veo todo el tiempo. –

+0

Eso es definitivamente cierto. Mi punto es que no hay forma de que un buen procesador pueda compensar un algoritmo ineficiente. Esto incluye algoritmos con bajo rendimiento de caché. La eficiencia de la caché no puede agregarse como una ocurrencia tardía. –

Cuestiones relacionadas