Comment puis-je utiliser des instructions extconf.rb drapeaux d'optimisation supplémentaires g ++, et qui sont recommandées?
-
23-10-2019 - |
Question
J'utilise riz pour écrire une extension C ++ pour un bijou Ruby. L'extension est sous la forme d'un fichier objet partagé (.so).
Cela nécessite 'mkmf-riz' au lieu de 'mkmf', mais les deux (AFAIK) sont assez similaires.
Par défaut, le compilateur utilise les drapeaux -g -O2
. Personnellement, je trouve ce genre de bête, car il est difficile de débogage avec une optimisation activée. J'ai eu recours à l'édition du Makefile pour prendre les drapeaux je ne aime pas (par exemple, la suppression -fPIC -shared
quand je dois débogage à l'aide main()
au lieu des crochets de Ruby).
Mais je figure, il faut que ce soit une meilleure façon. Je sais que je peux faire
$CPPFLAGS += " -DRICE"
pour ajouter des drapeaux supplémentaires. Mais comment puis-je supprimer les choses sans modifier directement le Makefile?
Une question secondaire: quelles optimisations sont sans danger pour les objets partagés chargés par Ruby? Puis-je faire des choses comme -funroll-loops
? Que recommandez-vous tous?
Il est un projet de calcul scientifique, de sorte que le plus vite sera le mieux. La mémoire est pas vraiment un problème.
Merci!
La solution
La façon rapide et sale est d'ajouter -O0 à CXXFLAGS, qui interrompra l'optimisation. Plus tard, les options remplacent les précédentes.
En ce qui concerne la sécurité que pour un plug-in, vous devriez être capable de faire tout ce qui ne touche pas l'ABI. Sans test, je ne vois pas pourquoi -funroll serait. Bien sûr, sûr ne signifie pas mieux. Comme l'a souligné la page de manuel, « -funroll-boucles rend le code plus grand, et peuvent ou ne peuvent pas le faire courir plus vite. »
Autres conseils
Pour vous définir utilisez
-D name=definition
comme vous le faites dans votre exemple:
$CPPFLAGS += " -DRICE"
nom -U
Annuler toute définition précédente du nom, que ce soit construit ou muni d'une option -D.
$CPPFLAGS += " -URICE"
Bien que je ne suis pas sûr que ça vous aidera à undef -O2 comme vous le voulez.