Intel-i insener tegi GCC töösse ühekordse muudatuse, mis suurendab vale haruennustuse kaalu x86 protsessoritel. Muudatus võimaldas genereeritud koodi jõudlust suurendada 12.7% 544.nab_r testi läbimisel, kui oli aktiveeritud optimeerimised "-O2 -mtune=graniterapids" Intel Granite Rapids/Xeon 6 CPU jaoks ja 12.1% kui oli aktiveeritud optimeerimised "-O2 -mtune=znver5" AMD Zen5 CPU-l.
Kalu kaalu muutmine 'COSTS_N_INSNS (2)' kuni 'COSTS_N_INSNS (2) + 3' suurendab ennustusvea tähtsust 2-lt 5-le tinglikule käsule, mis paremini peegeldab käskude töötlemise torujuhtmete omadusi tänapäevastes CPU-des, kus hargnemise ennustusvead on kallimad. Kalu muutmine sunnib kompilaatorit muutma 'if' lauseid tinglikeks käskudeks ilma hüppeid kasutamata, nagu CMOV, vältides peatuseid vale hargnemise ennustuse tõttu, mis on põhjustatud torujuhtme oleku taastamise vajadusest. Varem määrati kaal 'COSTS_N_INSNS (2) + 3' GCC-s ainult Intel Ice Lake ja Alder Lake protsessorite jaoks, kuid nüüd on see määratud x86 protsessorite üldiseks profiliseerimiseks.
On tähelepanuväärne, et pärast patši rakendamist ilmus tagasihaardumine, mille tõttu test „Hint” hakkas GCC arendajatel töötama 30% aeglasemalt, kui kompileerimisvalikutes on „-march=generic -mtune=znver5” ja „-march=generic -mtune=graniterapids”. Testide SPEC2017 ja SPEC2026 tulemus pärast muudatuste tegemist jäi samaks. Tagasihaardumist kinnitas originaalse commit'i autor, kelle andmetel on testi Hint läbimise aeglustumine 14% kompileerimisel valikutega „-O2 -mtune=generic -march=x86-64-v3”.
Aegluse põhjuseks on see, et testi Hint koodis on ainult üks tingimuslik konstruktsioon, mille GCC muudab CMOV-põhiseks esitluseks. See konstruktsioon töötab piisavalt harva (3% juhtudest) ja selle optimeerimine ei mõjuta jõudlust. Samuti viis koodi genereerimise režiimi muutmine kõrvaltoime, mis aeglustas sagedamini täidetava koodi täitmist.
Allikas: opennet.ru
