Question

J'ai optimisé morceau de C ++ et de faire même de petits changements dans des endroits loin des points chauds peuvent frapper des performances jusqu'à 20%. Après une enquête plus approfondie, il est avéré être (probablement) registres légèrement différents utilisés dans les points chauds. Je peux contrôler inlineing avec l'attribut always_inline, mais je peux contrôler l'allocation s'inscrire?

Était-ce utile?

La solution

Si vous voulez vraiment jouer avec le alloation de registre alors vous pouvez forcer GCC à affecter les variables locales et globales dans certains registres.

Vous faites cela avec une déclaration variable spéciale comme ceci:

 register int test_integer asm ("EBX");

Travaux pour d'autres architectures aussi bien, il suffit de remplacer EBX avec un nom de registre spécifique cible.

Pour plus d'informations sur ce que je vous suggère de jeter un oeil à la documentation gcc:

http: //gcc.gnu .org / onlinedocs / gcc-4.3.3 / gcc / local-Reg-Vars.html

Ma suggestion est cependant de ne pas jouer avec l'allocation de registre, sauf si vous avez de très bonnes raisons pour elle. Si vous allouez des registres vous-même l'allocateur a moins de registres pour travailler avec et vous pouvez vous retrouver avec un code qui est pire que le code que vous avez commencé avec.

Si votre fonction est que la performance critique que vous obtenez des différences de performance 20% entre le compile peut être une bonne idée d'écrire cette chose en ligne-assembleur.


EDIT: Comme Strager a souligné le compilateur n'est pas obligé d'utiliser le registre pour la variable. Il est seulement obligé d'utiliser le registre si la variable est utilisée à tous. Par exemple. En général, si elle ne sera pas utilisé la variable ne survit pas une optimisation. De plus, le registre peut être utilisé pour d'autres variables, ainsi.

Autres conseils

En général, le mot-clé de registre est tout simplement ignoré par tous les compilateurs modernes. La seule exception est l'ajout récent (relativement) d'une erreur si vous essayez de prendre l'adresse d'une variable que vous avez marqué avec le mot-clé de registre.

Je l'ai vécu ce genre de douleur aussi bien, et finalement trouvé la seule vraie solution était de regarder l'ensemble de sortie pour essayer de déterminer ce qui est à l'origine gcc à partir du Deepend. Il y a d'autres choses que vous pouvez faire, mais cela dépend exactement ce que votre code essaie de faire. Je travaillais dans une fonction très très grande avec une grande quantité de Mayhem goto calculé dans lequel des modifications mineures (apparemment anodins) pourraient causer des problèmes de performances catastrophiques. Si vous faites la même il y a quelques choses que vous pouvez faire pour essayer de réduire le problème, mais les détails sont un peu dégueu donc je vais renoncer à les discuter ici à moins qu'il est réellement pertinent.

Il dépend du processeur que vous utilisez. Ou devrais-je dire, oui, vous pouvez avec le mot-clé de registre, mais cela est mal sauf si vous utilisez un processeur simple sans tuyau doublure et un seul noyau. Ces jours-ci du CCG peuvent faire une façon meilleur travail que vous pouvez avec l'allocation de registre. Confiance.

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