c++ c optimization gcc pgo

c++ - optimización guiada por perfil(C)



gcc flags (4)

Lo divertido de la optimización es que las ganancias de velocidad se encuentran en los lugares más improbables.

También es la razón por la que necesita un generador de perfiles, en lugar de adivinar dónde están los problemas de velocidad.

Recomiendo comenzar con un generador de perfiles ( gperf si está usando GCC) y simplemente empezar a hurgar en los resultados de ejecutar su aplicación a través de algunas operaciones normales.

Alguien sabe esta característica del compilador? Parece que GCC apoya eso. ¿Como funciona? ¿Cuál es la ganancia potencial? En cuyo caso, es bueno? Loops internos?

(esta pregunta es específica, no sobre la optimización en general, gracias)


Funciona al colocar código adicional para contar la cantidad de veces que se toma cada ruta de código. Cuando compila por segunda vez, el compilador usa el conocimiento adquirido sobre la ejecución de su programa que solo podía adivinar antes. Hay algunas cosas por las que PGO puede trabajar:

  • Decidir qué funciones deben incluirse o no según la frecuencia con que se llamen.
  • Decidir cómo colocar pistas sobre qué rama de una declaración "si" debe predecirse sobre la base del porcentaje de llamadas que van de una manera u otra.
  • Decidir cómo optimizar los bucles en función de cuántas iteraciones se obtienen cada vez que se invoca ese bucle.

Nunca se sabe cuánto pueden ayudar estas cosas hasta que lo pruebes.


PGO proporciona un aumento de velocidad del 5% al ​​compilar x264, el proyecto en el que trabajo, y tenemos un sistema incorporado para él (make fprofiled). Es un buen aumento de la velocidad libre en algunos casos, y probablemente ayude más en aplicaciones que, a diferencia de x264, están menos compuestas de ensamblaje escrito a mano.


El consejo de Jason es correcto. Las mejores aceleraciones que obtendrás provienen de "descubrir" que permites que un algoritmo O (n 2 ) se deslice hacia un bucle interno en alguna parte, o que puedas almacenar en caché ciertos cálculos fuera de funciones costosas.

En comparación con las micro-optimizaciones que PGO puede activar, estos son los grandes ganadores. Una vez que haya hecho ese nivel de optimización, PGO podría ayudarlo. Sin embargo, nunca tuvimos demasiada suerte: el costo de la instrumentación fue tal que nuestra aplicación se volvió inusualmente lenta (en varios órdenes de magnitud).

Me gusta usar Intel VTune como generador de perfiles principalmente porque no es invasivo en comparación con los perfiladores de instrumento que cambian demasiado el comportamiento.