Ein Ingenieur von Intel hat eine kleine Änderung im GCC-Compiler-Toolkit vorgenommen, die das Gewicht der falschen Zweigvorhersage auf x86-Prozessoren erhöht. Diese Anpassung ermöglicht eine Steigerung der Leistung des generierten Codes um 12,7 % beim Test 544.nab_r mit Aktivierung der Optimierungen „-O2 -mtune=graniterapids“ für Intel Granite Rapids/Xeon 6 und um 12,1 % bei Aktivierung der Optimierungen „-O2 -mtune=znver5“ auf AMD Zen5-Prozessoren.
Die Anpassung des Gewichts von „COSTS_N_INSNS (2)“ auf „COSTS_N_INSNS (2) + 3“ erhöht die Bedeutung der Vorhersagefehler von 2 auf 5 hypothetische Instruktionen, was die Eigenschaften der Befehlspipeline (Pipeline) in modernen CPUs besser widerspiegelt, bei denen Vorhersagefehler kostspieliger sind. Die Gewichtung führt dazu, dass der Compiler die „if“-Ausdrücke in bedingte Anweisungen ohne Sprünge, wie CMOV, umwandelt, wodurch Unterbrechungen bei falschen Zweigvorhersagen vermieden werden, die durch den Reset des Pipeline-Zustands verursacht werden. Zuvor wurde das Gewicht „COSTS_N_INSNS (2) + 3“ im GCC nur für Intel Ice Lake und Alder Lake-Prozessoren angegeben, ist jetzt jedoch für das allgemeine (generic) Profil von x86-Prozessoren festgelegt.
Bemerkenswert ist, dass nach der Einführung des Patchs eine Regression aufgetreten ist, die dazu geführt hat, dass der "Hint"-Test bei einem der GCC-Entwickler mit den Optionen "-march=generic -mtune=znver5" und "-march=generic -mtune=graniterapids" 30 % langsamer ausgeführt wird. Die Leistung der SPEC2017- und SPEC2026-Tests blieb nach der Änderung unverändert. Die Regression wurde vom 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 ist darauf zurückzuführen, dass im Code des Hint-Tests nur eine bedingte Anweisung vorhanden ist, die von GCC in eine CMOV-basierte Darstellung umgewandelt wird. Diese Anweisung wird relativ selten (in 3 %) ausgeführt, und ihre Optimierung hat keinen Einfluss auf die Leistung. Gleichzeitig führte die Änderung des Code-Generierungsmodus zu einem Nebeneffekt, der die Ausführung des häufigeren Codes verlangsamte.
Quelle: opennet.ru
