Compilar GNU / Linux con optimización -O3


Respuestas:



17

-O3 tiene varias desventajas:

  1. En primer lugar, a menudo produce un código más lento que -O2o -Os. A veces produce un código más largo debido al desenrollado del bucle, que de hecho puede ser más lento debido al peor rendimiento del código en la memoria caché.
  2. Como se dijo, a veces produce un código incorrecto. Puede deberse a un error en la optimización o un error en el código (como ignorar el alias estricto). Como el código del kernel a veces es y a veces tiene que ser 'inteligente', diría que es posible que algún desarrollador del kernel haya cometido algún error. Experimenté varios problemas extraños, como la caída de las utilidades del espacio de usuario, cuando compilé el núcleo con gcc 4.5, que en ese momento era estable. Todavía uso gcc 4.4 para kernel y varias utilidades de espacio de usuario seleccionadas debido a varios errores. Lo mismo puede aplicarse -O3.
  3. No creo que ofrezca muchos beneficios para el kernel de Linux. El kernel no realiza cálculos pesados ​​y, en algunos lugares, está optimizado con ensamblaje. -O3El indicador no cambiará el costo del cambio de contexto o la velocidad de E / S. No creo que algo como <0.1% de aceleración del rendimiento general valga la pena.

66
Linux se compila con -fno-estricto-alias ya que Linus piensa que gcc es estúpido y demasiado restrictivo ya que hace cosas estúpidas como tratar valores como diferentes aunque obviamente no lo son (es decir, el alias se introdujo dentro de una función y el compilador puede Míralo). ver mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.html
Spudd86 el

@ Spudd86: ¿Quiso decir que obviamente no son para el ser humano que lee el código o para el compilador? Como dije, Kernel a veces necesita hacer cosas inteligentes que los programas de espacio de usuario no deberían hacer. Lo que tiene sentido para el espacio de usuario (optimización considerable en algunas áreas) puede no tener sentido para el núcleo (mayor cantidad de código inteligente + cuello de botella en diferentes lugares).
Maciej Piechotka

1
No, lo que dijo también se aplica al espacio de usuario.
Spudd86

1
@ Spudd86: No estoy de acuerdo con eso entonces. Hacer que el compilador sea 'lo suficientemente inteligente' para detectar cosas tan 'obvias' no es trivial. Entonces, la única forma posible es a) producir solo un código lento (er) (que es inaceptable para algunos casos de uso en, por ejemplo, HPC) y / u obligar a los programadores a optimizar manualmente el código b) hacer que las reglas sean más estrictas para permitir 'tontar' compilador para hacer la optimización: ruta tomada por el estándar C.
Maciej Piechotka

6

Tenga en cuenta que grandes fragmentos de la cadena de herramientas (en particular, glibc) no se compilan si cambia los niveles de optimización. El sistema de compilación está configurado para ignorar sus preferencias de -O para estas secciones en la mayoría de las distribuciones sensatas.

En pocas palabras, ciertas funciones fundamentales de la biblioteca y el sistema operativo dependen de que el código realmente haga lo que dice, no lo que sería más rápido en muchos casos. -fgcse-after-reload en particular (habilitado por -O3) puede causar problemas extraños.


5

Durante los últimos 10 años, he estado ejecutando múltiples sistemas Gentoo con más de 1000 paquetes usando -O3 -march=nativeglobalmente y aún no he encontrado ninguno de estos problemas de estabilidad míticos que -O3se supone que tienen. Los puntos de referencia de las aplicaciones intensivas de CPU (como las aplicaciones de matemáticas / ciencias) muestran constantemente -O3que producen código más rápido, después de todo, sería inútil si no lo hiciera. Para la mayoría de las aplicaciones de escritorio CFLAGSno importan mucho de todos modos ya que están vinculadas a IO, pero es muy importante para las cosas del lado del servidor que están vinculadas a la CPU.


3

-O3 utiliza algunas optimizaciones agresivas que solo son seguras si ciertas suposiciones sobre el uso del registro, cómo interactúan los marcos de la pila y la reentrada de la función son verdaderas, y estas suposiciones no están garantizadas como ciertas en algún código como el núcleo, especialmente cuando el ensamblaje en línea es utilizado (como está en algunas partes de muy bajo nivel del núcleo y sus módulos de controlador).


Sin mencionar que no siempre es más rápido, en realidad tienes que llegar a puntos de referencia y probarlo -O2para saber si el clima o no duele o ayuda
Spudd86

0

Si bien puede evitar el uso de -O3 y otras perillas de optimización en la mayoría de las aplicaciones (y puede dar lugar a mejoras de velocidad), dudaría en usar tales ajustes en el núcleo en sí o en la cadena de herramientas necesaria para construirlo (compilador, binutils, etc.)

Piénselo: ¿vale la pena un aumento del 5% en el rendimiento de los subsistemas raid y ext3 por fallas del sistema o posibles pérdidas y / o corrupción de datos?

Ajusta todas las perillas que desees para ese puerto Quake que estás reproduciendo o los códecs de audio / video que usas para copiar tu colección de DVD a archivos divx. Es probable que veas una mejora. Simplemente no te metas con el kernel a menos que tengas tiempo que perder y datos que puedas soportar perder.


3
No estoy preguntando si vale la pena o no, seguro o no, o por qué no deberíamos hacer esto, lo que pregunto es el hecho, ¿realmente produce errores en la aplicación real ?, ¿alguna vez ocurrió? hace que resultó ser tan ..
uray
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.