Ein Ingenieur von Intel hat eine einzeilige Änderung im GCC-Compiler-Set vorgenommen, die das Gewicht der falschen Zweigvorhersage auf x86-Prozessoren erhöht. Diese Änderung ermöglicht eine Steigerung der Leistung des generierten Codes beim Test 544.nab_r um 12,7 % bei Aktivierung der Optimierungen „-O2 -mtune=graniterapids“ für CPU Intel Granite Rapids/Xeon 6 und um 12,1 % bei Aktivierung der Optimierungen „-O2 -mtune=znver5“ für CPU AMD Zen5.
Die Änderung des Gewichts von „COSTS_N_INSNS (2)“ auf „COSTS_N_INSNS (2) + 3“ erhöht die Bedeutung der Vorhersagefehler von 2 auf 5 bedingte Anweisungen, was die Besonderheiten der Befehlspipeline in modernen CPUs besser widerspiegelt, in denen Zweigvorhersagefehler kostenintensiver sind. Die Gewichtung führt dazu, dass der Compiler die „if“-Ausdrücke in bedingte Befehle ohne Sprünge umwandelt, wie z. B. CMOV, die Unterbrechungen bei falschen Zweigvorhersagen, die durch das Zurücksetzen des Pipeline-Zustands verursacht werden, ausschließen. Zuvor wurde das Gewicht „COSTS_N_INSNS (2) + 3“ im GCC nur für Intel Ice Lake und Alder Lake Prozessoren angegeben, ist jetzt aber auch für das allgemeine (generic) Profil von x86-Prozessoren festgelegt.
Bemerkenswert ist, dass nach der Annahme des Patches eine Regression aufgetreten ist, die dazu führte, dass der Test „Hint“ bei einem der GCC-Entwickler 30 % langsamer ausgeführt wurde, wenn er mit den Optionen „-march=generic -mtune=znver5“ und „-march=generic -mtune=graniterapids“ kompiliert wurde. Die Leistung bei den SPEC2017- und SPEC2026-Tests blieb nach der Änderung auf dem bisherigen Niveau. Die Regression wurde von dem Autor des ursprünglichen Commits bestätigt; laut seinen Angaben beträgt die Verlangsamung des Hint-Tests 14 % bei der Kompilierung mit den Optionen „-O2 -mtune=generic -march=x86-64-v3“.
Die Verlangsamung wird dadurch erklärt, dass der Hint-Test nur eine bedingte Konstruktion enthält, die GCC in eine CMOV-basierte Darstellung umwandelt. Diese Konstruktion wird relativ selten (in 3%) ausgeführt, und ihre Optimierung hat keinen Einfluss auf die Leistung. Gleichzeitig führte die Änderung des Codegenerierungsmodus zu einem Nebeneffekt, der die Ausführung des häufigeren Codes verlangsamte.
Quelle: opennet.ru
