J'ai essayé de parcourir la page de manuel de GCC pour cela, mais je ne comprends toujours pas vraiment.
Quelle est la différence entre -march
et -mtune
?
Quand utilise-t-on simplement -march
, contre les deux? Est-il jamais possible de simplement -mtune
?
Si tu utilises -march
alors GCC sera libre de générer des instructions qui fonctionnent sur le CPU spécifié, mais pas (généralement) sur les CPU antérieurs de la famille d'architecture. Si tu utilises -mtune
, le compilateur générera du code qui fonctionne sur l'un d'eux, mais favorisera les séquences d'instructions qui s'exécutent le plus rapidement sur le processeur spécifique que vous avez indiqué.
Voici ce que j'ai recherché sur Google:
L'option -march=X
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.
Comme les fonctionnalités sont généralement ajoutées, mais non supprimées, un binaire construit avec -march=X
S'exécutera sur le processeur X
, a de bonnes chances de s'exécuter sur des processeurs plus récents que X
, mais il ne fonctionnera certainement pas sur quelque chose de plus ancien que X
. Certains jeux d'instructions (3DNow !, je suppose?) Peuvent être spécifiques à un fournisseur de CPU particulier, en les utilisant, vous obtiendrez probablement des binaires qui ne fonctionnent pas sur des CPU concurrents, plus récents ou autres.
L'option -mtune=Y
Règle le code généré pour qu'il s'exécute plus rapidement sur 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 pour -march=core2
Et -mtune=i686
- votre code ne fonctionnera pas sur quelque chose de plus ancien que core2
De 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
Est plus logique: n'utilisez aucune fonctionnalité au-delà de ce que core2
Fournit (ce qui est encore beaucoup plus que ce que -march=i686
Vous offre!), Mais optimisez le code pour beaucoup plus récents haswell
CPU, pas pour core2
.
Il y a aussi -mtune=generic
. generic
permet à GCC de produire du code qui fonctionne mieux sur les CPU actuels (ce qui signifie que generic
change d'une version de GCC à une autre). Il y a des rumeurs sur les forums Gentoo selon lesquelles -march=X -mtune=generic
Produit du code qui s'exécute plus rapidement sur X
que le code produit par -march=X -mtune=X
(Ou simplement -march=X
, Comme -mtune=X
Est implicite). Aucune idée si c'est vrai ou non.
Généralement, à moins que vous ne sachiez exactement ce dont vous avez besoin, il semble que la meilleure solution consiste à 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 tout simplement -march=native
, Si vous ne voulez exécuter que sur la même machine que celle sur laquelle vous construisez.