Entsprechend die meisten BenchmarksIntels Clear Linux ist viel schneller als andere Distributionen, hauptsächlich dank einer GCC-Funktion namens Funktion Multi-Versionierung. Gerade jetzt die Methode Sie verwenden, um den Code zu kompilieren, zu analysieren, welche Funktion vektorisierte Schleifen enthält, dann den Code mit FMV-Attributen zu patchen und ihn erneut zu kompilieren.
Wie machbar ist es für GCC, dies automatisch zu tun? Zum Beispiel durch Passieren -mmultiarch=sandybridge,skylake
(oder eine ähnliche Option -m, die CPU-Erweiterungen wie AVX und AVX2 auflistet).
Im Moment interessieren mich zwei Anwendungsszenarien:
- Verwenden Sie diese Option für unser großes mathematisch-intensives Programm zur Bereitstellung von Releases an unsere Kunden. Ich möchte den Code nicht mit nicht standardmäßigen Attributen verunreinigen und ich möchte die von uns verwendeten Bibliotheken von Drittanbietern nicht ändern.
- Die anderen Linux-Distributionen werden dies problemlos tun können, ohne den Code zu patchen, wie es Intel tut. Dies sollte allen Linux-Benutzern massive Leistungssteigerungen bringen.
@Useless Wenn man bedenkt, dass die kombinierten Binärdateien insgesamt etwa 300 MB groß sind und ziemlich viel GUI-Code ist, ist dies einfach nicht praktikabel. Sicher, der mathematische Code befindet sich meistens in separaten Bibliotheken, aber ein Shell-Skript wird dabei nicht helfen. Laut Dokumenten ist der Größenaufwand von FMV vernachlässigbar.
– Alexander
20. Februar 2018 um 12:57 Uhr
Wenn sich der mathematische Code in separaten Bibliotheken befindet, können Sie zielspezifische Builds erstellen diese und stellen Sie das Passende ein
LD_LIBRARY_PATH
in Ihrem Wrapper-Skript. Wenn Sie andere spezifische Anforderungen haben (z. B. 300 MB werden als viel angesehen oder Sie haben viel Code, den Sie speziell möchten nicht zu optimieren), stelle es in die Frage.– Nicht zu gebrauchen
20. Februar 2018 um 13:03 Uhr
Ich interessiere mich auch sehr dafür, aus den meisten der gleichen Gründe wie Sie. Ich habe hier nach dem Link gefragt, aber die Frage hat keine Anziehungskraft erlangt. Es ist frustrierend, weil alle schwierigen Teile erledigt sind.
– fett
4. Mai 2018 um 12:39 Uhr
Verdammt, ich habe sogar eine gcc-Funktionsanfrage gestellt: gcc.gnu.org/bugzilla/show_bug.cgi?id=78464
– fett
4. Mai 2018 um 12:43 Uhr
Multi-Versioning verhindert auch Inlining, daher ist es sehr wichtig, gute Grenzen für die Partitionierung auszuwählen. Einige Funktionen vereinfachen viel wenn es in einen Aufrufer eingebettet ist, der Kompilierzeitkonstanten für einige der Argumente oder einen bekannten positiven Wert oder was auch immer übergibt. Dinge wie BMI1/BMI2 sind am nützlichsten, wenn sie überall in Ihrem Code verwendet werden, nicht nur in Funktionen mit großen Schleifen.
– Peter Cordes
22. August 2020 um 21:22 Uhr