43 lines
1.4 KiB
Markdown
43 lines
1.4 KiB
Markdown
![]() |
#### Пример разворачивания цикла.
|
|||
|
|
|||
|
```assembly
|
|||
|
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$
|