Wird es möglich sein, die Multi-Versioning-Funktion von gcc ohne Codeänderungen zu verwenden?

Lesezeit: 3 Minuten

Benutzer-Avatar
Alexander

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:

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


Nein, aber es spielt keine Rolle. Es gibt sehr, sehr kleiner Code, der tatsächlich davon profitiert; Wenn Sie es global tun, werden Sie Ihr System zum größten Teil nur (ohne besonderen Aufwand, übereinstimmende Versionen in Seiten zusammenzuordnen) aufgrund der enormen Zunahme der Codegröße viel speicherbeschränkter und langsamer machen. Die meisten tatsächlichen Lasten sind nicht einmal CPU-gebunden; Sie sind Syscall-Overhead-gebunden, GPU-gebunden, IO-gebunden usw. Und viele der modernen, die CPU-gebunden sind, führen keinen vorkompilierten Code, sondern JIT-Code aus (dh alles, was in einem Browser ausgeführt wird, ob das ist Ihr echter Browser oder der veraltete und ungepatchte Fork von Chrome in jeder Electron-App).

  • Ich habe nie erwähnt, dass es um Desktop (Elektron usw.) geht, die oben verlinkten Benchmarks zeigen deutlich eine enorme Verbesserung in vielen Bereichen. Außerdem ist mein Desktop (KDE Plasma) größtenteils in C++ geschrieben, fast kein JIT dort. Dies könnte auch ein einigermaßen geeigneter Ersatz für die profilgeführte Optimierung sein, die definitiv die Schnelligkeit einiger Programme verbessert, aber in den meisten Linux-Paketen nicht verfügbar ist.

    – Alexander

    2. Dezember 2020 um 6:47 Uhr


1345360cookie-checkWird es möglich sein, die Multi-Versioning-Funktion von gcc ohne Codeänderungen zu verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy