Un inginer de la Intel a adus o modificare de o singură linie în setul de compilatoare GCC, ceea ce a crescut greutatea predicției eronate a ramificării pe procesoarele x86. Modificarea a permis îmbunătățirea performanței codului generat în timpul testului 544.nab_r cu 12,7% când sunt activate optimizările „-O2 -mtune=graniterapids” pentru CPU Intel Granite Rapids/Xeon 6 și cu 12,1% când sunt activate optimizările „-O2 -mtune=znver5” pe CPU AMD Zen5.
Modificarea greutății de la „COSTS_N_INSNS (2)” la „COSTS_N_INSNS (2) + 3” crește semnificația erorii de predicție de la 2 la 5 instrucțiuni conditionale, reflectând mai bine caracteristicile pipeline-urilor de procesare a instrucțiunilor în CPU-uri moderne, unde erorile de predicție a ramificării sunt mai costisitoare. Schimbarea greutății determină forțarea transformării de către compilator a expresiilor „if” în comenzi condiționale fără salt, cum ar fi CMOV, care elimină întârzierile cauzate de predicțiile greșite ale ramificării, rezultând din necesitatea de a reseta starea pipeline-ului. Anterior, greutatea „COSTS_N_INSNS (2) + 3” era specificată în GCC doar pentru procesoarele Intel Ice Lake și Alder Lake, dar acum este stabilită pentru profilul general (generic) al procesoarelor x86.
Este remarcabil că, după acceptarea patch-ului, a apărut o regresie care a dus la o execuție cu 30% mai lentă a testului „Hint” pentru unul dintre dezvoltatorii GCC, când se compilau cu opțiunile „-march=generic -mtune=znver5” și „-march=generic -mtune=graniterapids”. Performanța testelor SPEC2017 și SPEC2026 a rămas la același nivel după modificare. Existența regresiei este confirmată de autorul comit-ului inițial, care a raportat că încetinirea execuției testului Hint este de 14% când se compilează cu opțiunile „-O2 -mtune=generic -march=x86-64-v3”.
Încetinirea este explicată de faptul că în codul testului Hint există o singură construcție condițională, care este transformată de GCC într-o reprezentare bazată pe CMOV. Această construcție este executată destul de rar (în 3%) și optimizarea sa nu are un impact asupra performanței. Modificarea modului de generare a codului a dus, în schimb, la un efect secundar care a încetinit execuția unui cod care este executat mai frecvent.
Sursa: opennet.ro
