V programování je odvíjení smyčky ( angl. loop unwinding ) nebo loop unwinding ( ang. loop unrolling ) technika pro optimalizaci počítačových programů , která spočívá v umělém zvýšení počtu instrukcí provedených během jedné iterace smyčky . V důsledku použití této optimalizace se zvyšuje počet instrukcí, které mohou být potenciálně vykonávány paralelně, a je možné intenzivnější využívání registrů , datové mezipaměti a prováděcích jednotek.
převedeno na tento kód:
int i ; pro ( i = 1 ; i < n - 3 ; i + = 4 ) { a [ i ] = ( i % b [ i ]); a [ i + 1 ] = (( i + 1 ) % b [ i + 1 ]); a [ i + 2 ] = (( i + 2 ) % b [ i + 2 ]); a [ i + 3 ] = (( i + 3 ) % b [ i + 3 ]); }Tento typ optimalizace je podrobně zvažován například v Generalized Loop-Unrolling [1] . To (spolu s rozdělením těla smyčky ) za určitých podmínek (neexistence datových závislostí mezi instrukcemi v nové smyčce) umožňuje spustit smyčku na několika procesorech .
Existuje také neobvyklý způsob, jak rozvinout smyčku, nazývanou " zařízení Duff ", - tímto způsobem se používají málo známé a nezřejmé vlastnosti syntaxe jazyka C.
Jednou z nevýhod této optimalizační metody při použití společně s rozdělením těla smyčky pro další paralelizaci je, že načítání dat z paměti začíná být prováděno mimo pořadí dat, což může nepříznivě ovlivnit efektivitu cache. Dalším, vhodnějším druhem optimalizace, který lépe využívá mezipaměti procesoru, je paralelizace smyček .
Kromě toho se během odvíjení smyčky zvyšuje počet příkazů provedených v každé iteraci. Pokud toto číslo překročí kapacitu instrukční cache, pak místo očekávaného zvýšení efektivity provádění cyklu je možné jeho výrazné snížení.