wake-up-neo.net

GCC: Wie unterscheidet sich Marsch von Mtune?

Ich habe versucht, die GCC-Manpage dafür zu scrubben, verstehe sie aber immer noch nicht wirklich.

Was ist der Unterschied zwischen -march und -mtune?

Wann benutzt man nur -march gegen beide? Ist es jemals möglich, nur -mtune?

76
Jameson

Wenn du benutzt -march Dann kann GCC Anweisungen generieren, die auf der angegebenen CPU funktionieren, jedoch nicht auf (normalerweise) früheren CPUs in der Architekturfamilie. Wenn du benutzt -mtune, dann generiert der Compiler Code, der auf jedem von ihnen funktioniert, aber Befehlssequenzen bevorzugt, die auf der angegebenen CPU am schnellsten ausgeführt werden.

90
James Youngman

Das habe ich gegoogelt:

Die Option -march=X Verwendet den CPU-Namen X und ermöglicht es GCC, Code zu generieren, der alle Funktionen von X nutzt. Das GCC-Handbuch erklärt genau, welche CPU-Namen für welche CPU-Familien und -Funktionen stehen.

Da Features normalerweise hinzugefügt, aber nicht entfernt werden, wird eine mit -march=X Erstellte Binärdatei auf CPU X ausgeführt. Es besteht jedoch eine gute Chance, dass sie auf CPUs ausgeführt wird, die neuer als X sind läuft fast sicher nicht auf etwas älter als X. Bestimmte Befehlssätze (3DNow !, denke ich?) Sind möglicherweise spezifisch für einen bestimmten CPU-Hersteller. Wenn Sie diese verwenden, erhalten Sie wahrscheinlich Binärdateien, die auf neueren oder anderen CPUs anderer Hersteller nicht ausgeführt werden.

Die Option -mtune=Y Optimiert den generierten Code so, dass er auf Y schneller ausgeführt wird als auf anderen CPUs, auf denen er möglicherweise ausgeführt wird. -march=X Impliziert -mtune=X. -mtune=Y Wird -march=X Nicht überschreiben, so dass es zum Beispiel wahrscheinlich keinen Sinn macht, -march=core2 Und -mtune=i686 Zu verwenden - Ihr Code wird auf nichts älterem als ausgeführt core2 Trotzdem, wegen -march=core2, Warum um alles in der Welt sollten Sie für etwas Älteres (weniger merkwürdiges) als core2 optimieren? -march=core2 -mtune=haswell Ist sinnvoller: Verwenden Sie keine Funktionen, die über das hinausgehen, was core2 Bietet (was immer noch viel mehr ist als das, was -march=i686 Ihnen bietet!), Sondern optimieren Sie den Code für viel neuere haswell CPUs, nicht für core2.

Es gibt auch -mtune=generic. generic lässt GCC Code produzieren, der auf aktuellen CPUs am besten läuft (die Bedeutung von generic ändert sich von einer Version von GCC zu einer anderen). Es gibt Gerüchte in Gentoo-Foren, dass -march=X -mtune=generic Code erzeugt, der auf X schneller läuft als von -march=X -mtune=X Erzeugter Code (oder einfach nur -march=X, Wie -mtune=X Ist impliziert). Keine Ahnung ob das stimmt oder nicht.

Wenn Sie nicht genau wissen, was Sie benötigen, ist es anscheinend am besten, -march=<oldest CPU you want to run on> Und -mtune=generic (-mtune=generic Anzugeben, um dem impliziten -mtune=<oldest CPU you want to run on>, weil Sie wahrscheinlich nicht für die älteste CPU optimieren möchten). Oder einfach nur -march=native, Wenn Sie jemals nur auf demselben Computer laufen werden, auf dem Sie bauen.

47
LRN