C'est ce que j'ai cherché sur Google :
En -march=X
L'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 de GCC explique exactement quels noms de CPU signifient quelles familles de CPU et quelles caractéristiques.
Parce que les fonctionnalités sont généralement ajoutées, mais pas supprimées, un binaire construit avec -march=X
fonctionnera sur le CPU X
a de bonnes chances de fonctionner sur des processeurs plus récents que ceux de la Commission européenne. X
mais il est presque certain qu'il ne fonctionnera pas sur un appareil plus ancien que le X
. Certains jeux d'instructions (3DNow !, je suppose ?) peuvent être spécifiques à un fournisseur de CPU particulier, et leur utilisation vous permettra probablement d'obtenir des binaires qui ne fonctionneront pas sur des CPU concurrents, récents ou non.
En -mtune=Y
permet de régler le code généré pour qu'il s'exécute plus rapidement sur Y
que sur les autres processeurs sur lesquels il pourrait fonctionner. -march=X
implique -mtune=X
. -mtune=Y
ne remplacera pas -march=X
Ainsi, par exemple, il n'y a probablement aucun sens à -march=core2
y -mtune=i686
- votre code ne fonctionnera pas sur un système plus ancien que core2
de toute façon, à cause de -march=core2
Alors pourquoi diable voulez-vous optimiser pour quelque chose de plus ancien (moins riche en fonctionnalités) que le core2 ? -march=core2 -mtune=haswell
est plus logique : n'utilisez pas de fonctionnalités au-delà de ce que core2
(ce qui est tout de même beaucoup plus que ce qu'offrent les -march=i686
), mais optimisent le code pour des applications beaucoup plus récentes. haswell
et non pour les core2
.
Il y a aussi -mtune=generic
. generic
fait en sorte que GCC produise du code qui fonctionne au mieux sur les CPU actuels (signification de generic
les changements d'une version de GCC à une autre). Il y a des rumeurs sur les forums Gentoo selon lesquelles -march=X -mtune=generic
produit un code qui s'exécute plus rapidement sur X
que le code produit par -march=X -mtune=X
fait (ou simplement -march=X
comme -mtune=X
est implicite). Je ne sais pas si c'est vrai ou non.
En général, à moins que vous ne sachiez exactement ce dont vous avez besoin, il semble que la meilleure solution soit de spécifier -march=<oldest CPU you want to run on>
y -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 CPU le plus ancien). Ou simplement -march=native
si vous ne voulez jamais utiliser que la même machine que celle sur laquelle vous construisez.