En ingeniør fra Intel har foretaget en enkelt linjeændring i GCC-kompilatoren, som øger vægten af forkert branchesprediktion på x86-processorer. Ændringen har gjort det muligt at forbedre ydeevnen af den genererede kode med 12,7% under testen 544.nab_r, når optimeringerne "-O2 -mtune=graniterapids" er aktiveret for Intel Granite Rapids/Xeon 6 CPU'er, og med 12,1% når optimeringerne "-O2 -mtune=znver5" er aktiveret for AMD Zen5 CPU'er.
Ændringen af vægten fra "COSTS_N_INSNS (2)" til "COSTS_N_INSNS (2) + 3" øger betydningen af forkert prediktion fra 2 til 5 betingede instruktioner, hvilket bedre afspejler karakteristikaene for moderne CPU'ers instruktion pipelines, hvor fejl i branchesprediktion er dyrere. Vægten ændrer sig og tvinger kompilatoren til at konvertere "if"-udtryk til betingede instruktioner uden spring, såsom CMOV, hvilket eliminerer pauser ved forkert branchesprediktion grundet behovet for at nulstille pipeline-tilstanden. Tidligere blev vægten "COSTS_N_INSNS (2) + 3" angivet i GCC kun for Intel Ice Lake og Alder Lake-processorer, men nu er den også tilgængelig for den generelle (generic) profil af x86-processorer.
Bemærkelsesværdigt er det, at der efter vedtagelsen af patchen opstod en regression, der fik "Hint"-testen til at køre 30% langsommere for en af GCC-udviklerne, når der blev bygget med indstillingerne "-march=generic -mtune=znver5" og "-march=generic -mtune=graniterapids". Ydeevnen af SPEC2017 og SPEC2026-testene forblev den samme efter ændringen. Regressionen er bekræftet af forfatteren til den oprindelige commit, som angiver, at forsinkelsen under Hint-testen er 14% ved bygning med indstillingerne "-O2 -mtune=generic -march=x86-64-v3".
Forsinkelsen forklares med, at der i Hint-testens kode kun er én betinget konstruktion, som GCC omdanner til en CMOV-baseret repræsentation. Denne konstruktion udføres ret sjældent (i 3%) og dens optimering påvirker ikke ydeevnen. Desuden førte ændringen i koden til en bivirkning, der forsinkede udførelsen af en mere hyppigt udført kode.
Kilde: opennet.ru
