Pregunta

¿Alguien conoce esta característica del compilador?Parece que el CCG lo apoya.¿Como funciona?¿Cuál es la ganancia potencial?¿En cuyo caso es bueno?¿Bucles internos?

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

¿Fue útil?

Solución

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

  • Decidir qué funciones deben incluirse o no dependiendo de la frecuencia con la que se llaman.
  • Decidir cómo colocar pistas sobre qué rama de una declaración "si" se debe predecir en función del porcentaje de llamadas que van en una dirección u otra.
  • Decidir cómo optimizar los bucles en función de cuántas iteraciones se realizan cada vez que se llama a ese bucle.

Nunca se sabe realmente cuánto pueden ayudar estas cosas hasta que las pruebas.

Otros consejos

PGO ofrece un aumento de velocidad de aproximadamente un 5 % al compilar x264, el proyecto en el que trabajo, y tenemos un sistema integrado para ello (hacer fprofiled).Es un buen aumento de velocidad gratuito en algunos casos y probablemente ayude más en aplicaciones que, a diferencia de x264, se componen menos de ensamblaje escrito a mano.

El consejo de Jason es acertado.Las mejores aceleraciones que obtendrás provienen de "descubrir" que dejas que se active una O(n).2) el algoritmo se desliza en un bucle interno en algún lugar, o que puede almacenar en caché ciertos cálculos fuera de funciones costosas.

En comparación con las microoptimizaciones que puede desencadenar PGO, estos son los grandes ganadores.Una vez que haya alcanzado ese nivel de optimización, PGO podría ayudarlo.Sin embargo, nunca tuvimos mucha suerte: el costo de la instrumentación fue tal que nuestra aplicación se volvió inutilizable (en varios órdenes de magnitud).

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

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 necesitas un generador de perfiles, en lugar de adivinar dónde están los problemas de velocidad.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top