2017-02-02 4 views
0

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:

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

  2. 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?

  3. 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?

Antwort

1

Warum nicht das Feature Sets direkt konvertierbar Flags für Compiler setzen? Ich würde sicherlich verstehen, wenn es ein "neues" Feature ist, das der Compiler einfach nicht versteht oder unterstützt ... aber die Änderung von -mno-bmi1 zu -mno-bmi legt mir nahe, dass es einfach eine Meinungsverschiedenheit darüber gibt, wie die Feature-Sets benannt werden sollen .

Ich habe noch nie eine Diskussion darüber gesehen, also kann ich nicht wirklich kommentieren. Vielleicht könntest du in der gcc-help-Liste oder in einer Kernel-Mailingliste nachfragen.

Ich weiß, ich habe eine Menge Zeit auf das Thema der Zuordnung von /proc/cpuinfo Flags Compilerflags wegen Clang und Solaris verbracht (und FreeBSD, müssen Sie /var/run/dmesg.boot überprüfen). Siehe auch Crypto++ ARM logic, Crypto++ x86 logic und .


Gibt es eine bessere Methode zur Herstellung eines voll optimierte Build von der Maschine Kompilieren mit allen Funktionen der Maschine Ziel aktiviert mit einigen deaktiviert Funktionen?

Für GCC auf x86 (wie i686 und x86_64) und GCC> = 5.0 können Sie Multi-Funktionen verwenden. Siehe 7.8 Function Multiversioning im GCC-Handbuch.

Alle Wetten sind für GCC auf ARM aus, und alle Wetten sind für Clang aus. Und es funktioniert auch nicht unter Solaris mit dem SunCC-Compiler.

Was in der Praxis passiert ist, dass "Schritte" für Features eingerichtet werden, und dann verwenden Sie Runtime-CPU-Feature-Erkennung, um eine Implementierung auszuwählen (dies tun GCC-Multifunctions). Für x86, sind die Schritte in der Regel so etwas wie:

  • gerade C/C++
  • SSE2
  • SSE3 + SSSE3
  • SSE4.1- + SSE4.2
  • AVX oder AVX2

Der AVX/AVX2 enthält BMI bzw. BMI2. Microsoft Compiler verwenden nur SSE2 und AVX und AVX2.

Es gibt immer noch Wildcards, wie AES, CLMUL, RDRAND, RDSEED, SHA, usw. Aber die meisten Bibliotheken brauchen sich keine Sorgen um sie zu machen. Bedenken sind normalerweise auf Krypto-Bibliotheken beschränkt.

Ich bemerkte auch, dass GCC __MOVBE__ nicht definiert, wenn -march=native und die Maschine in der Lage ist. Siehe auch __MOVBE__ not defined when movbe feature is available? auf der GCC-Hilfe-Mailingliste.

Für ARM, seine in der Regel:

  • gerade C/C++
  • NEON

Und wie bei x86, die von Krypto-Bibliotheken erfahren Platzhalter enthalten PMULL, PMULL2, AES, SHA1, SHA2.


Gibt es eine Abbildung irgendwo die Namen, welche Funktion beschreibt vom Kernel über/proc/cpuinfo berichtet werden (oder anderswo) und der von Compilern verwendet Name?

Nicht das ist mir bekannt. Sie können die CPU-Funktion bei What do the flags in /proc/cpuinfo mean? auf Unix & Linux-Stack Exchange-nachschlagen, und Sie dann aus dem GCC den Bogen Option herauszufinden x86 Options, ARM Options usw.

Wie ich schon sagte, habe ich eine Menge Zeit darauf für Testen Crypto ++, so kann man meist reißt es aus:

Wenn Sie ein Beispiel für die Verwendung von GCC-Multifunktionsfunktionen sehen möchten, lesen Sie Jack Lloyd's Botan.


Ein kurzer Kommentar zu diesem Thema:

von Paket devtoolset-4, die auf Oracle Linux Server 7.3:

c++: error: unrecognized command line option ‘-mno-bmi1’ 
c++: error: unrecognized command line option ‘-mno-eagerfpu’ 

ich c++ raten bin nicht GCC (oder richtiger, g++), oder es ist ein alter GCC 4.x Compiler.


Ein weiterer schneller Kommentar ... Wenn Sie nur versuchen, Intel Xeon E5-2699v4 (Broadwell-EP) und Intel Xeon E5-2699v3 Plattform (Haswell-EP) zu schneiden, dann verwenden Sie so etwas wie:

CXXFLAGS="-march=x86_64 -msse2 -msse3 -msss3 -msse4_1 -msse4_2 -mavx -mbmi" 

Das beginnt niedrig und funktioniert an der Decke. Sie müssen nicht herausfinden, was von -march=native für GCC subtrahiert werden soll. Und Sie müssen sich keine Gedanken darüber machen, wie Clang für -march=native ein anderes Verhalten zeigt.

Für die Clang Bugreports auf -march=native Verhalten:

+0

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

Verwandte Themen