Comment puis-je utiliser des instructions extconf.rb drapeaux d'optimisation supplémentaires g ++, et qui sont recommandées?

StackOverflow https://stackoverflow.com/questions/2962287

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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top