Pregunta

¿Cuál es la diferencia entre los diferentes niveles de optimización en GCC?Suponiendo que no me importa tener ningún gancho de depuración, ¿por qué no utilizaría el nivel más alto de optimización disponible para mí?necesariamente un mayor nivel de optimización (es decir,demostrablemente) generar un programa más rápido?

¿Fue útil?

Solución

Sí, un nivel más alto a veces puede significar un programa con mejor rendimiento.Sin embargo, puede causar problemas según su código.Por ejemplo, la predicción de bifurcación (habilitada en -O1 y superiores) puede interrumpir programas de subprocesos múltiples mal escritos al provocar una condición de carrera.En realidad, la optimización decidirá algo que sea mejor que lo que usted escribió, lo que en algunos casos podría no funcionar.

Y a veces, las optimizaciones más altas (-O3) no añaden ningún beneficio razonable pero sí mucho tamaño extra.Sus propias pruebas pueden determinar si esta compensación de tamaño genera una ganancia de rendimiento razonable para su sistema.

Como nota final, el proyecto GNU compila todos sus programas en -O2 por defecto, y -O2 es bastante común en otros lugares.

Otros consejos

Generalmente niveles de optimización superiores a -O2 (justo -O3 para gcc pero otros compiladores tienen compiladores superiores) incluyen optimizaciones que pueden aumentar el tamaño de su código.Esto incluye cosas como desenrollado de bucles, mucha alineación, relleno para alineación independientemente del tamaño, etc.Otros compiladores ofrecen vectorización y optimización entre procedimientos en niveles superiores a -O3, así como ciertas optimizaciones que pueden mejorar mucho la velocidad a costa de la corrección (por ejemplo, usando rutinas matemáticas más rápidas y menos precisas).Consulte los documentos antes de usar estas cosas.

En cuanto al rendimiento, es una compensación.En general, los diseñadores de compiladores intentan ajustar estas cosas para que no disminuyan el rendimiento de su código, por lo que -O3 Por lo general, ayudará (al menos en mi experiencia), pero su kilometraje puede variar.No siempre se da el caso de que optimizaciones de alteración de tamaño realmente agresivas mejoren el rendimiento (p. ej.una inserción realmente agresiva puede generar contaminación de caché).

Encontre un Página web que contiene información sobre los diferentes niveles de optimización.Una cosa que recuerde haber escuchado en alguna parte es que la optimización podría en realidad dañar su programa y eso puede ser un problema.Pero no estoy seguro de hasta qué punto es un problema.Quizás los compiladores actuales sean lo suficientemente inteligentes como para manejar esos problemas.

Nota al margen:

Es bastante difícil predecir exactamente qué banderas encienden los cambios globales. -O directivas en la línea de comandos de gcc para diferentes versiones y plataformas, y es probable que toda la documentación en el sitio de GCC quede obsoleta rápidamente o no cubra los aspectos internos del compilador con suficiente detalle.

Aquí hay una manera fácil de verificar exactamente qué sucede en su configuración particular cuando usa uno de los -O banderas y otros -f banderas y/o combinaciones de las mismas:

  1. Cree un archivo fuente vacío en algún lugar:
    touch dummy.c
  2. Ejecútelo a través del paso del compilador como lo haría normalmente, con todos -O, -f y/o -m banderas que normalmente usarías, pero agregando -Q -v a la línea de comando:
    gcc -c -Q -v dummy.c
  3. Inspeccione el resultado generado, quizás guardándolo para una ejecución diferente.
  4. Cambie la línea de comando a su gusto, elimine el archivo objeto generado a través de rm -f dummy.o y volver a ejecutar.

Además, siempre tenga en cuenta que, desde un punto de vista purista, la mayoría de las optimizaciones no triviales generan código "roto" (donde roto se define como desviarse de la ruta óptima en los casos extremos), por lo que elegir si habilitar o no una determinada Un conjunto de mecanismos de optimización a veces se reduce a elegir el nivel de corrección de la salida del compilador.Siempre hay (y actualmente hay) errores en el optimizador de cualquier compilador; simplemente consulte la lista de correo de GCC y Bugzilla para obtener algunos ejemplos.La optimización del compilador sólo debe usarse después de realizar mediciones, ya que

  • Las ganancias derivadas del uso de un mejor algoritmo eclipsarán cualquier ganancia derivada de la optimización del compilador.
  • no tiene sentido optimizar el código que se ejecutará de vez en cuando,
  • Si el optimizador introduce errores, es irrelevante qué tan rápido se ejecute su código.

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