Voici ce que j'ai recherché sur Google:
L' -march=Xoption prend un nom de CPU Xet permet à GCC de générer du code qui utilise toutes les fonctionnalités de X. Le manuel GCC explique exactement quels noms de CPU signifient quelles familles et fonctionnalités de CPU.
Parce que les fonctionnalités sont généralement ajoutées, mais pas supprimées, un binaire construit avec -march=Xfonctionnera sur le processeur X, a de bonnes chances de fonctionner sur des processeurs plus récents que X, mais il ne fonctionnera presque certainement pas sur des processeurs plus anciens que X. Certains jeux d'instructions (3DNow !, je suppose?) Peuvent être spécifiques à un fournisseur de processeur particulier, leur utilisation vous permettra probablement d'obtenir des binaires qui ne fonctionnent pas sur des processeurs concurrents, plus récents ou non.
L' -mtune=Yoption règle le code généré pour qu'il s'exécute plus rapidement Yque sur les autres processeurs sur lesquels il pourrait s'exécuter. -march=Ximplique -mtune=X. -mtune=Yne remplacera pas -march=X, donc, par exemple, cela n'a probablement aucun sens -march=core2et -mtune=i686- votre code ne fonctionnera pas sur quelque chose de plus ancien que de core2toute façon, à cause de -march=core2, alors pourquoi diable voudriez-vous optimiser pour quelque chose de plus ancien (moins fonctionnel) que core2? -march=core2 -mtune=haswellCela a plus de sens: n'utilisez aucune fonctionnalité au-delà de ce que core2fournit (ce qui est encore beaucoup plus que ce que -march=i686vous donne!), mais optimisez le code pour des haswellprocesseurs beaucoup plus récents , pas pour core2.
Il y a aussi -mtune=generic. genericpermet à GCC de produire du code qui fonctionne le mieux sur les processeurs actuels (signification des genericchangements d'une version de GCC à une autre). Il y a des rumeurs sur les forums Gentoo qui -march=X -mtune=genericproduisent du code plus rapide Xque le code produit par -march=X -mtune=Xdo (ou tout simplement -march=X, comme cela -mtune=Xest sous-entendu). Aucune idée si cela est vrai ou non.
En général, à moins que vous ne sachiez exactement ce dont vous avez besoin, il semble que le meilleur cours soit de spécifier -march=<oldest CPU you want to run on>et -mtune=generic( -mtune=genericest là pour contrer l'implicite -mtune=<oldest CPU you want to run on>, car vous ne voulez probablement pas optimiser pour le processeur le plus ancien). Ou simplement -march=native, si jamais vous n'allez exécuter que sur la même machine sur laquelle vous construisez.