web-dev-qa-db-fra.com

GCC: en quoi mars est-il différent de mtune?

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?

76
Jameson

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é.

90
James Youngman

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.

47
LRN