Ich habe zwei virtuelle Maschinen; Beide laufen auf der identischen Intel Xeon E5-2699v4 (Broadwell-EP) Plattform. Eine virtuelle Maschine (die Produktionsmaschine) befindet sich jedoch auf einem Host, auf dem die Funktionen deaktiviert sind, während sie alle auf der anderen Maschine (der Erstellungsmaschine) aktiviert sind. Wir haben auch andere Host-Maschinen auf einer Intel Xeon E5-2699v3-Plattform (Haswell-EP), aber diese Hosts werden zu einem späteren Zeitpunkt angesprochen werden. Ich bin in der Lage zu bestimmen, welche Funktionen durch die Beobachtung der Ergebnisse aus einem einzeiligen bash Befehl von meinem lokalen Rechner deaktiviert werden:So ermitteln Sie, welche Feature-Flags für eine Architektur aktiviert oder deaktiviert werden sollen
sort <(sshi vm1 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") <(sshi vm2 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") | uniq -u
... wo sshi
ein Bash-Alias ist, die bestimmt, welche Schlüsseldatei zu verwenden, wenn Verbindungs , vm1
ist der Hostname der Maschine mit allen aktivierten Funktionen und vm2
ist der Hostname der Maschine, die nicht alle Funktionen aktiviert hat. Ich würde denken, dass dies oneline Befehl kann dann mit einer Schleife gekoppelt werden Feature Enablement-Flags für einen Compiler zu generieren ...
for feature in $(...); do echo "-mno-${feature}"; done
..., die eine Liste als solche erzeugt:
-mno-abm -mno-avx -mno-avx2 -mno-bmi1 -mno-bmi2 -mno-eagerfpu -mno-fma -mno-hle -mno-invpcid -mno-movbe -mno-pcid -mno-pse36 -mno-rtm -mno-tsc_adjust -mno-xsave -mno-xsaveopt
Unter dieser Liste und es an den Compiler über CMake vorbei:
LIST(APPEND COMMON_FLAGS /* paste flags here, along with other things such as -Wall -pedantic -Werror=etc */)
SET_PROPERTY(TARGET my_target PROPERTY COMPILE_OPTIONS ${COMMON_FLAGS})
... präsentiert compil ation Fehler bei g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
von Paket zur Verfügung gestellt mit devtoolset-4
auf Oracle Linux Server 7.3
:
c++: error: unrecognized command line option ‘-mno-bmi1’ c++: error: unrecognized command line option ‘-mno-eagerfpu’ c++: error: unrecognized command line option ‘-mno-invpcid’ c++: error: unrecognized command line option ‘-mno-pcid’ c++: error: unrecognized command line option ‘-mno-pse36’ c++: error: unrecognized command line option ‘-mno-tsc_adjust’
Die ersten Fehler einfach durch Wechsel in der -mno-bmi
gelöst werden kann, statt -mno-bmi1
ich diesen interessanten Leckerbissen aus dem gefunden GCC mailing list archive: gcc -march=native -Q --help=target
. Bei der Suche nach Features werden nicht alle fehlenden Feature-Flags angezeigt, was für mich eine Sackgasse ist.
So sind thusly meine Fragen:
Warum nicht die Feature-Sets Fahnen für Compiler direkt konvertierbare zu setzen? Ich würde sicherlich verstehen, wenn es eine "neue" Funktion ist, die der Compiler einfach nicht versteht oder unterstützt ... aber Änderung
-mno-bmi1
zu-mno-bmi
schlägt mir vor, dass es einfach eine Meinungsverschiedenheit darüber gibt, was die Feature-Sets zu nennen.Gibt es eine bessere Methode zur Herstellung eines voll optimierte Build von die Maschine mit allen Funktionen Kompilieren aktiviert die Maschine mit einige Funktionen deaktiviert zielen?
Gibt es eine Abbildung irgendwo die Namen, welche Funktion beschreibt vom Kernel durch
/proc/cpuinfo
gemeldet werden (oder anderswo) und der Name von Compilern verwendet?
Danke für die ausführliche Information. Es gibt viele Informationen hier, auf die ich antworten möchte, aber Stack Overflow ist nicht wirklich eine gute Diskussionsplattform. Ich werde zumindest auf der GCC-Hilfe-Mailingliste herumstöbern. – inetknght