Ich kompiliere meine C ++ - App mit GCC 4.3. Anstatt die von mir verwendeten Optimierungsflags manuell auszuwählen -march=native
, sollten theoretisch alle Optimierungsflags hinzugefügt werden , die für die Hardware gelten, auf der ich kompiliere. Aber wie kann ich überprüfen, welche Flags tatsächlich verwendet werden?
165
--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512
-v
Option angezeigt , wenn auch als Teil dercc1
Befehlszeile ...-march=native
und es wird überall funktionieren, wenn Sie Folgendes tun :gcc -Q --help=target
.Verwenden Sie zum Anzeigen von Befehlszeilenflags:
Wenn Sie möchten, dass die Compiler- / Precompiler-Definitionen durch bestimmte Parameter festgelegt werden, gehen Sie folgendermaßen vor:
quelle
native
wirklich gleichbedeutend ist.Es sollte sein (
-###
ist ähnlich-v
):Anzeigen der "echten" nativen Flags für gcc.
Sie können sie mit einem Befehl "klarer" erscheinen lassen:
und Sie können Flags mit -mno- * entfernen mit:
quelle
Wenn Sie herausfinden möchten, wie eine nicht native Cross-Kompilierung eingerichtet wird, fand ich dies nützlich:
Auf dem Zielcomputer
Verwenden Sie dies dann auf der Build-Maschine:
quelle
echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1
aber Cache-Größen scheinen nicht vorhanden zu sein.Ich werde meine zwei Cent in diese Frage werfen und eine etwas ausführlichere Erweiterung von Elias 'Antwort vorschlagen. Ab gcc 4.6
gcc -march=native -v -E - < /dev/null
sendet das Ausführen von eine zunehmende Menge an Spam in Form überflüssiger-mno-*
Flags aus. Folgendes wird diese entfernen:Ich habe die Richtigkeit jedoch nur auf zwei verschiedenen CPUs (Intel Core2 und AMD Phenom) überprüft. Daher empfehle ich, auch das folgende Skript auszuführen, um sicherzustellen, dass alle diese
-mno-*
Flags sicher entfernt werden können.Ich habe keinen Unterschied zwischen
gcc -march=native -v -E - < /dev/null
undgcc -march=native -### -E - < /dev/null
außer einigen angegebenen Parametern gefunden - und Parametern, die keine Sonderzeichen enthalten, daher bin ich mir nicht sicher, unter welchen Umständen dies einen wirklichen Unterschied macht.Beachten Sie schließlich, dass dies
--march=native
in gcc 4.2 eingeführt wurde, bevor es sich nur um ein nicht erkanntes Argument handelt.quelle