Voici ce que j'ai recherché sur Google:
L' -march=X
option prend un nom de CPU X
et 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=X
fonctionnera 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=Y
option règle le code généré pour qu'il s'exécute plus rapidement Y
que sur les autres processeurs sur lesquels il pourrait s'exécuter. -march=X
implique -mtune=X
. -mtune=Y
ne remplacera pas -march=X
, donc, par exemple, cela n'a probablement aucun sens -march=core2
et -mtune=i686
- votre code ne fonctionnera pas sur quelque chose de plus ancien que de core2
toute 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=haswell
Cela a plus de sens: n'utilisez aucune fonctionnalité au-delà de ce que core2
fournit (ce qui est encore beaucoup plus que ce que -march=i686
vous donne!), mais optimisez le code pour des haswell
processeurs beaucoup plus récents , pas pour core2
.
Il y a aussi -mtune=generic
. generic
permet à GCC de produire du code qui fonctionne le mieux sur les processeurs actuels (signification des generic
changements d'une version de GCC à une autre). Il y a des rumeurs sur les forums Gentoo qui -march=X -mtune=generic
produisent du code plus rapide X
que le code produit par -march=X -mtune=X
do (ou tout simplement -march=X
, comme cela -mtune=X
est 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=generic
est 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.