c++ gcc optimization compilation

c++ - gcc flags



Tiempo de ejecuciĆ³n optimizado (2)

Sí, es usual. Tome la optimización -Ox como líneas guía. En promedio, producen optimización que se anuncia, pero mucho depende del estilo en que se escribe el código, el diseño de la memoria y el compilador. Algunas veces, debes intentar fallar muchas veces antes de obtener el código óptimo. -O2 de hecho ofrece la mejor optimización en la mayoría de los casos.

Debido a una tarea escolar, tengo que convertir un código C ++ en ensamblaje (ARMv8). Luego, tengo que compilar el código C ++ utilizando las optimizaciones de -O0, -O1, -O2, -O3 y -Os de GCC, anote la hora y compárela con el tiempo de ejecución de mi código de ensamblaje. Como, creo que sé que -O3 tiene que ser más rápido que -O1 y -O2. Sin embargo, entiendo que -O2 es el más rápido, luego son -O1, -O3, -Os, -O0. Es eso usual? (Los tiempos calculados son aproximadamente 30 segundos).


Tenga en cuenta que GCC tiene muchos otros indicadores de optimización .

No hay garantía de que -O3 proporcione un código más rápido que -O2 ; un compilador puede aplicar más pases de optimización, pero todos son heurísticos y pueden ser infructuosos (o incluso ralentizar un poco su código particular). Por lo tanto, sucede que -O3 proporciona un código ligeramente más lento que -O2 (en algún código fuente de entrada particular ).

Puede probar una versión más reciente de GCC (la última -en noviembre de 2017- es GCC 7 , GCC 8 saldrá en pocos meses). También podría probar alguna mejor opción -march= o -mtune= .

Por último, con su complemento GCC , puede agregar su propia aprobación de optimización o cambiar el orden (y el conjunto) de las pases de optimización aplicadas (hay varios cientos de pases de optimización diferentes en GCC). Pero necesitará mucho trabajo (tal vez un año o dos) para poder ampliar GCC.

Puede ajustar los parámetros de optimización, y algunos proyectos ( MILEPOST ) incluso han utilizado técnicas de aprendizaje automático para mejorarlos.

Ver también diapositivas y referencias en mi (antigua) documentación GCC MELT .