Optimizacija u GCC-u: Jedna linija koda ubrzava moderne procesore za 12%
Razvojni programeri GCC (GNU Compiler Collection) projekta implementirali su minimalnu izmjenu u kodu kompajlera koja je donijela neočekivano visoko poboljšanje performansi na najnovijim AMD i Intel procesorskim arhitekturama. Ova zakrpa (patch) od samo jedne linije koda, koju je kreirala Intelova inženjerka Lili Cui, fokusira se na fino podešavanje parametara heuristike za generiranje strojnog koda, točnije na redefiniranje težine penalizacije kod pogrešnih predviđanja grananja (branch misprediction).
Arhitektura cjevovoda i problem predviđanja grananja
Suština ove optimizacije leži u načinu na koji moderni x86-64 procesori izvršavaju instrukcije. Suvremene računalne jezgre koriste iznimno duboke cjevovode (execution pipelines) za superskalarno i izvanporedno (out-of-order) izvršavanje instrukcija. Kako bi ti cjevovodi stalno bili zasićeni podacima, procesor koristi hardverske prediktore grananja koji pogađaju kojim će smjerom kod krenuti prije nego što se stvarni uvjet izvrši. Ako prediktor pogriješi (branch misprediction), dolazi do takozvanog čišćenja cjevovoda (pipeline flush). Sve instrukcije koje su spekulativno povučene i djelomično izvršene moraju se odbaciti, što uzrokuje velike zastoje (stalls) i masivan gubitak procesorskih ciklusa.
Nova zakrpa unutar GCC-a bavi se upravo tim problemom tako što unutar optimizacijskih algoritama povećava internu „cijenu” (penalizaciju) za potencijalne pogreške u predviđanju. Podizanjem tog koeficijenta penalizacije za 3 boda, kompajler je prisiljen generirati konzervativniji i stabilniji strojni kod. Umjesto agresivnog spekulativnog grananja, GCC sada bira sigurnije sekvence instrukcija (primjerice, češće koristi uvjetne naredbe poput cmov umjesto klasičnih skokova jmp), čime se izbjegavaju kritični zastoji u procesoru.
Sintetički testovi: Impresivni rezultati na Intel i AMD arhitekturama
Učinak ove promjene testiran je pomoću industrijskog standarda SPEC CPU 2017, unutar specifičnog podtesta 544.nab_r (koji simulira molekularnu dinamiku i intenzivno se oslanja na procesorsku matematiku). Rezultati su iznenadili i same inženjere:
• Intel Granite Rapids: Serverska arhitektura zabilježila je skok performansi od 12,7%.
• AMD Zen 5: Najnovija arhitektura zabilježila je povećanje performansi od 12,1%.
Fascinantno je što se ovakav dobitak nije mogao postići forsiranjem naprednih zastavica kompilacije, kao što je -march=native. Navedena zastavica optimizira kod za specifične instrukcijske setove (poput AVX-512), dok ova zakrpa modificira bazični, generički profil optimizacije kompajlera, što znači da poboljšava izvršavanje koda na strukturnoj razini.
Široka primjena u Linux distribucijama
Ova mikromodifikacija imat će golem utjecaj na cjelokupni open-source ekosustav. Većina Linux distribucija (poput Ubuntua, Fedore ili Debiana) kompajlira svoje pakete s generičkim postavkama kako bi softver bio kompatibilan sa širokim spektrom procesora, bez vezanja za specifičnu mikroarhitekturu. Budući da zakrpa poboljšava upravo generičke profile, performanse mnogih aplikacija porast će same od sebe nakon nadogradnje sustava. Zakrpa je već službeno spojena (merged) u glavni GCC repozitorij te će biti isporučena kao standardni dio stabilnog izdanja GCC 17.