Možnost překladače GCC rozvíjet smyčky -funroll-loops
či dokonce -funroll-all-loops
může někdy pomoci s rychlostí výsledného kódu, ale téměř vždy je výsledný kód delší, proto se používá zřídka nebo s velkým rozmyslem.
Hongyu Wang z Intelu si myslí, že rozvíjet malé smyčky má na x86 vždy smysl vzhledem k velkému dekodéru mikroinstrukcí. Například Zen 3 a Icelake mají dekodér pro 5 mikroinstrukcí. Dává tedy smysl rozvinout všechny malé smyčky do 4 instrukcí včetně, pokud je zároveň zapnuto -O2
. Záplata byla poslána do GCC 13, stabilní vydání očekáváme v příštím roce na jaře.
Ve SPEC testu 548.exchange2 (sudoku) se nové rozvíjení malých smyček projeví nárůstem rychlosti o 7–9 % s jen 0,9 % nárůstem velikosti kódu. Například linuxové jádro se zvětší jen o 0,06 %, patrně tedy obsahuje jen minimum malých smyček.
Pokud chcete rozvíjení malých smyček zkusit již teď na starším GCC, lze použít parametry -O2 -funroll-loops --param max-unrolled-insns=4 --param max-unroll-times=2
. Výchozí parametry pro -funroll-loops
jsou daleko vyšší a to 200 a 8, jak se můžete přesvědčit pomocí gcc --help=param -Q | grep unroll
.
(zdroj: phoronix)