Një inxhinier nga kompania Intel bëri një ndryshim të vogël në paketën e kompilatorëve GCC, që rriti peshën e parashikimit të gabuar të degezimit në procesorët x86. Ky ndryshim rriti performancën e kodit të gjeneruar në testin 544.nab_r me 12.7% kur aktivizoheshin optimizimet "-O2 -mtune=graniterapids" për CPU Intel Granite Rapids/Xeon 6 dhe me 12.1% kur aktivizoheshin optimizimet "-O2 -mtune=znver5" në CPU AMD Zen5.
Ndryshimi i peshës nga «COSTS_N_INSNS (2)» në «COSTS_N_INSNS (2) + 3» rrit rëndësinë e gabimit të parashikimit nga 2 në 5 instruksione kushtore, duke reflektuar më mirë karakteristikat e pipeline-ve të përpunimit të komandave në CPU-të moderne, ku gabimet e parashikimit të degëve janë më të shtrenjta. Ndryshimi i peshës çon në forcon transformimin e shprehjeve «if» nga kompilatorët në komanda kushtore pa kalime, si CMOV, duke përjashtuar ndërprerjet që ndodhin për shkak të gabimeve në parashikimin e degëve, të shkaktuara nga nevoja për të rikthyer gjendjen e pipeline-it. Më parë, pesha «COSTS_N_INSNS (2) + 3» ishte e caktuar në GCC vetëm për procesorët Intel Ice Lake dhe Alder Lake, dhe tani është e vendosur për profilin e përgjithshëm (generic) të procesorëve x86.
ĂshtĂ« e rĂ«ndĂ«sishme qĂ« pas miratimit tĂ« patch-it u shfaq njĂ« regresion, i cili bĂ«ri qĂ« testi "Hint" tĂ« ekzekutohet nga njĂ« prej zhvilluesve tĂ« GCC me 30% mĂ« ngadalĂ«, duke ndĂ«rtuar me opsionet "-march=generic -mtune=znver5" dhe "-march=generic -mtune=graniterapids". Performanca e kalimit tĂ« testeve SPEC2017 dhe SPEC2026 mbeti nĂ« tĂ« njĂ«jtin nivel pas ndryshimit. Prania e regresionit Ă«shtĂ« konfirmuar nga autori i commit-it origjinal; sipas tĂ« dhĂ«nave tĂ« tij, ngadalĂ«simi i kalimit tĂ« testit Hint Ă«shtĂ« 14% kur ndĂ«rtohet me opsionet "-O2 -mtune=generic -march=x86-64-v3".
Ngadalësimi shpjegohet me faktin se në kodin e testit Hint ka vetëm një strukturë kushtore, e cila transformohet nga GCC në një përfaqësim të bazuar në CMOV. Kjo strukturë ekzekutohet mjaft rrallë (në 3%) dhe optimizimi i saj nuk ndikon në performancë. Megjithatë, ndryshimi i modit të gjenerimit të kodit çoi në një efekt anësor, i cili ngadalësoi ekzekutimin e kodit që ekzekutohej më shpesh.
Burimi: opennet.ru
