2008-09-09 17 views
12

¿Alguien conoce esta función del compilador? Parece que GCC apoya eso. ¿Como funciona? ¿Cuál es la ganancia potencial? En cuyo caso, es bueno? Loops internos?optimización guiada por perfil (C)

(esta pregunta es específica, no se trata de optimización en general, gracias)

+1

http://stackoverflow.com/questions/4365980/how-to-use-profile-guided-optimizations-in-g describe cómo usarlo (banderas, etc.) necesarios – rogerdpack

Respuesta

12

Funciona mediante la colocación de código adicional para contar el número 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 un par de cosas para las que PGO puede trabajar:

  • Decidir qué funciones deben estar incluidas 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 en función del porcentaje de llamadas que van en un sentido u otro.
  • Decidir cómo optimizar los bucles según la cantidad de iteraciones que se toman cada vez que se invoca ese bucle.

Nunca sabes realmente cuánto pueden ayudar estas cosas hasta que lo pruebes.

+1

gracias, que parece interesante. ¿Tienes algún enlace de documentación para compartir? – elmarco

+0

La predicción de bifurcación que mencionó no se usa y es totalmente inútil, porque los prefijos de hit de bifurcación solo se usan la primera vez que la CPU encuentra una bifurcación. El beneficio real es que GCC sepa cómo puede estructurar mejor el código de ramal complejo en función de las probabilidades de predicción. –

+0

Según lo solicitado por el OP, sería genial si pudiera ampliar su respuesta con información sobre cómo se puede utilizar. (por ejemplo, opciones específicas, etc.) –

2

Lo divertido de optimización es que gana velocidad se encuentran en el más improbable de los lugares.

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á utilizando GCC) y simplemente comenzar a hurgar en los resultados de ejecutar su aplicación a través de algunas operaciones normales.

4

El asesoramiento de Jason es justo. Las mejores reducciones de velocidad que obtendrás provienen de "descubrir" que permites que un algoritmo O (n) se deslice en 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.

6

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.

Cuestiones relacionadas