[C++] Le niveau d'optimisation -O3 est-il dangereux en g ++?


Answers

C'est déjà dit dans la réponse de Neel, mais pas clairement ou assez fort:

Dans mon expérience quelque peu damée, appliquer -O3 à un programme entier le rend presque toujours plus lent (par rapport à -O2 ), car il active le déroulement et l'enroulement de boucle agressifs qui font que le programme ne rentre plus dans le cache des instructions. Pour les programmes plus grands, cela peut aussi être vrai pour -O2 rapport à -Os !

Le modèle d'utilisation prévu pour -O3 est, après avoir profilé votre programme, de l'appliquer manuellement à une petite poignée de fichiers contenant des boucles internes critiques qui bénéficient réellement de ces compromis agressifs espace-vitesse. Avec le GCC très récent, je pense que le nouveau mode d'optimisation guidé par le profil de temps de lien peut appliquer de manière sélective les optimisations -O3 aux fonctions chaudes, automatisant ainsi efficacement ce processus.

Question

J'ai entendu de diverses sources (mais la plupart du temps d'un de mes collègues), que compiler avec un niveau d'optimisation de -O3 en g++ est en quelque sorte «dangereux», et devrait être évité en général à moins que nécessaire.

Est-ce vrai, et si oui, pourquoi? Devrais-je juste coller à -O2 ?




Il y a quelque temps, je suis entré en collision avec l'optimisation. Il y avait une carte PCI, qui représentait ses registres (pour la commande et les données) par cellule de mémoire. Mon pilote mappait juste l'adresse physique de cette mémoire au pointeur du niveau d'application et la donnait à process appelé, qui fonctionnait comme ceci:

unsigned int * pciMemory;
askDriverForMapping( & pciMemory );
...
pciMemory[ 0 ] = someCommandIdx;
pciMemory[ 0 ] = someCommandLength;
for ( int i = 0; i < sizeof( someCommand ); i++ )
    pciMemory[ 0 ] = someCommand[ i ];

J'étais incroyable pourquoi la carte n'a pas agi comme prévu. Et seulement quand j'ai vu assembleur j'ai compris que le compilateur a écrit seulement someCommand[ the last ] dans pciMemory , en omettant toutes les écritures précédentes.

En conclusion: soyez précis et attentif à l'optimisation)))