94 votes

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

J'ai essayé de scruter la page de manuel de GCC pour cela, mais je ne comprends toujours pas, vraiment.

Quelle est la différence entre -march y -mtune ?

Quand utilise-t-on seulement -march ou les deux ? Est-il possible de simplement -mtune ?

106voto

James Youngman Points 1721

Si vous utilisez -march alors GCC sera libre de générer des instructions qui fonctionnent sur le CPU spécifié, mais (généralement) pas sur les CPU antérieurs de la famille d'architecture.

Si vous utilisez seulement -mtune Le compilateur générera du code qui fonctionnera sur n'importe lequel d'entre eux, mais favorisera les séquences d'instructions qui s'exécutent le plus rapidement sur le processeur spécifique que vous avez indiqué, par exemple en définissant les heuristiques de déroulement de boucle de manière appropriée pour ce processeur.


-march=foo implique -mtune=foo sauf si vous spécifiez également une autre -mtune . C'est l'une des raisons pour lesquelles l'utilisation de -march est préférable à la simple activation d'options telles que -mavx sans rien faire pour les régler.

Attention : -march=native sur un CPU que GCC ne reconnaît pas spécifiquement activera toujours de nouveaux jeux d'instructions que GCC peut détecter, mais laissera -mtune=generic . Utilisez un GCC assez récent qui connaît votre CPU si vous voulez qu'il fasse du bon code.

57voto

LRN Points 183

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X