Ohjelmoinnissa silmukan purkaminen ( eng. loop unrolling ) tai silmukan purkaminen ( eng. loop unrolling ) on tietokoneohjelmien optimointitekniikka , jossa yhden silmukan iteraation aikana suoritettavien käskyjen määrää lisätään keinotekoisesti . Tämän optimoinnin myötä mahdollisesti rinnakkain suoritettavien käskyjen määrä kasvaa ja rekistereiden , tietovälimuistin ja suoritusyksiköiden intensiivisempi käyttö tulee mahdolliseksi.
muutettu tähän koodiin:
int i ; for ( 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 ]); }Tämän tyyppistä optimointia tarkastellaan yksityiskohtaisesti esimerkiksi Generalized Loop-Unrollingissa [1] . Se (yhdessä silmukan rungon jakamisen kanssa ) sallii tietyissä olosuhteissa (tietoriippuvuuksien puuttuminen uuden silmukan käskyjen välillä) mahdollistaa silmukan suorittamisen useissa prosessoreissa .
On myös epätavallinen tapa purkaa silmukkaa, nimeltään " Duff-laite ", - tällä tavalla käytetään vähän tunnettuja ja ei-ilmeisiä C-kielen syntaksin ominaisuuksia .
Yksi tämän optimointimenetelmän haitoista, kun sitä käytetään yhdessä silmukan rungon jakamisen kanssa rinnakkaisuudelleen jatkamista varten, on se, että tietojen nouto muistista alkaa tapahtua tietojen epäjärjestyksessä, mikä voi vaikuttaa haitallisesti välimuistin tehokkuuteen. Toinen, sopivampi optimointi, joka hyödyntää paremmin prosessorin välimuistia, on silmukan rinnakkaissuuntaus .
Lisäksi silmukan purkamisen aikana kussakin iteraatiossa suoritettavien komentojen määrä kasvaa. Jos tämä määrä ylittää käskyvälimuistin kapasiteetin, niin odotetun syklin suoritustehokkuuden kasvun sijaan sen merkittävä lasku on mahdollista.