1.8 KiB
1.8 KiB
Пример разворачивания цикла.
for (i = 1000; i>0; i = i-1)
x[i] = x[i] + s;
Без оптимизации:
Loop: LD [R1], F0 ; 1
; простой ; 2
ADD F2, F0, F4 ; 3
; простой ; 4
; простой ; 5
ST F4, [R1] ; 6
ADD R1, R3, R1 ; 7
; простой ; 8
BNE R1, R2, Loop ; 9
; простой ; 10
- 4 копии цикла развернуты без повторного использования регистров.
- Размер базового блока увеличен с 5 до 14 инструкций.
- 3 перехода и 3 уменьшения R1 удалены.
- Адреса загрузки и сохранения изменены.
- 7 тактов для исходной итерации.
Разворачивание цикла сразу с оптимизацией:
Loop: | LD [R1], F0 | 1 |
---|---|---|
LD [R1-8], F6 | 2 | |
LD [R1-16], F10 | 3 | |
LD [R1-24], F14 | 4 | |
ADD F2, F0, F4 | 5 | |
ADD F2, F6, F8 | 6 | |
ADD F2, F10, F12 | 7 | |
ADD F2, F14, F16 | 8 | |
ST F4, [R1] | 9 | |
ST F8, [R1-8] | 10 | |
ADD R1, R3, R1; | R3 -=32; 11 | |
ST F12, [R1+16] | 12 | |
BNE R1, R2, Loop | 13 | |
ST F16, [R1+8]; | 8-32 = -24 |
Время итерации цикла сократилось до 14 тактов или \frac{14}{4}=3.5
для исходной итерации; Ускорение \frac{6}{3.5}=1.7