¿Cómo instruiría a ExtConf.RB para que use banderas de optimización G ++ adicionales y cuáles son aconsejables?
-
23-10-2019 - |
Pregunta
Estoy usando Arroz para escribir una extensión C ++ para una gema Ruby. La extensión está en forma de un archivo de objeto compartido (.so).
Esto requiere 'MKMF-Rice' en lugar de 'MKMF', pero los dos (AFAIK) son bastante similares.
Por defecto, el compilador usa las banderas -g -O2
. Personalmente, encuentro este tipo de tonto, ya que es difícil depurar con cualquier optimización habilitada. He recurrido a editar el makefile para sacar las banderas que no me gustan (por ejemplo, eliminar -fPIC -shared
Cuando necesito depurar usando main()
en lugar de los ganchos de Ruby).
Pero creo que tiene que haber una mejor manera. Sé que puedo hacer
$CPPFLAGS += " -DRICE"
Para agregar banderas adicionales. Pero, ¿cómo elimino las cosas sin editar el makfile directamente?
Una pregunta secundaria: ¿Qué optimizaciones son seguras para los objetos compartidos cargados por Ruby? ¿Puedo hacer cosas como -funroll-loops
? ¿Qué recomiendan todos?
Es un proyecto de computación científica, por lo que cuanto más rápido mejor. La memoria no es un gran problema.
¡Muchas gracias!
Solución
La forma rápida y sucia es agregar -O0 a CXXFLAGS, lo que apagará la optimización. Las opciones posteriores anularán las anteriores.
En cuanto a la seguridad de un complemento, debería poder hacer cualquier cosa que no afecte al ABI. Sin pruebas, no veo por qué -cunroll lo haría. Por supuesto, Safe no implica mejor. Como señaló la página del hombre, "-funroll-loops hace que el código sea más grande, y puede o no hacer que funcione más rápido".
Otros consejos
Para definir tu uso
-D name=definition
Como lo haces en tu ejemplo:
$CPPFLAGS += " -DRICE"
-Tu nombre
Cancele cualquier definición anterior de nombre, ya sea incorporada o proporcionada con una opción -d.
$CPPFLAGS += " -URICE"
Aunque no estoy seguro de si ayudará con el indefinido -o2 como lo quieres.