|
TEHNICA "LOOP UNROLLING"
Tehnica Loop unrolling se bazeaza pe desfasurarea buclelor de program si apoi, reorganizarea acestora ca basic - block-uri prin algoritmi de tip "List Scheduling". Prin aceasta desfasurare a buclei de un numar de ori se reduce si din efectul defavorabil al instructiunilor de ramificatie.
Aceasta tehnica prezinta numeroase beneficii, cu toate acestea ele trebuie puse in balanta cu limitarile I-Cache si ale altor resurse ale masinii. Printre avantajele se numara urmatoarele:
"unrolling" amortizeaza supraincarcarea ramificatiilor.
permite reorganizarea agresiva a buclei (scheduling) sau organizarea ei in conducta pentru a masca latentele specifice. Acest lucru este folositor daca exista la dispozitie destui registrii liberi pentru pastratrea variabilelor curente in memoria activa pe parcursul procesului de inlaturare a dependentelor in lant, in scopul etalarii operatiilor critice.
este permisa reorganizarea agresiva a buclei pentru o adaptare mai buna la constrangerile date de stagiile I-fetch si decode.
predictia branch-urilor (backwards branch, predicted taken) are o penalizare de un singur ciclu la procesoarele Pentium Pro si Pentium II, astfel se pot desfasura corpuri foarte mici de bucle fara costuri.
- desfasurarea buclelor favorizeaza aparitia altor optimizari, dupa cum se vede in exemplul de mai jos.
Se considera o bucla ce executa de 100 de ori atribuirea lui x fiecarui numar par si a lui y fiecarui numar impar:
do i=1,100
if (i mod 2 == 0) then a(i) = x
else a(i) = y
enddo
Prin desfasurarea buclei cele doua atribuiri pot fi scrise impreuna intr-o singura iteratie, eliminand astfel o ramificatie in corpul buclei.
the loop body.
do i=1,100,2
a(i) = y
a(i+1) = x
enddo