Arch: new

Все теоритические билеты по Архитектуре ЭВМ в основном были написаны,
кроме: 8.4; 13.4; 14.4; 15.4. Задачи будут позже.
This commit is contained in:
Kirill
2024-12-20 12:10:10 +03:00
committed by Sweetbread
parent 2625f17247
commit 3a96c27c48
80 changed files with 1355 additions and 0 deletions

View File

@ -0,0 +1,12 @@
#### Определение параллелизма уровня инструкций (ILP). Определение базового блока инструкций.
**Параллелизм уровня инструкций (ILP)** - возможность одновременного выполнения нескольких инструкций в конвейере ЦП.
ILP существует, когда инструкции в последовательности независимы и поэтому могут исполняться параллельно (с перекрытием). Конвейеры с большим ILP (меньшим числом зависимостей) показывают лучшую производительность на CPU с конвейером.
**Базовый блок инструкций** - линейная последовательность инструкций без переходов внутрь, за исключением точки входа, и без переходов наружу, за исключением точки выхода из последовательности. Пример: тело цикла.
- ILP в базовом блоке определяется имеющимися зависимостями между инструкциями и размером блока.
- В типичном целочисленном коде частота условных переходов около $15\%$, что дает средний размер базового блока - 7 инструкций.
- Любой статический метод, увеличивающий размер базового блока, расширяет блок инструкций для оптимального статического планирования конвейера компилятором и увеличивает ILP.
Один из таких методов - разворачивание цикла.
**Статический метод** - метод, который не имеет доступа к полям объекта, и для вызова такого метода не нужно создавать экземпляр класса, в котором он объявлен.

View File

@ -0,0 +1,20 @@
#### Статическая оптимизация с разворачиванием циклов. Требования к разворачиванию циклов.
**Стандартный способ увеличения ILP** состоит в использовании параллелизма между итерациями цикла, т.е параллелизма уровня цикла (Loop Level Parallelism, LLP)
Достигается путем разворачивания цикла, либо статически компилятором, либо динамически аппаратурой, чтобы увеличить размер имеющегося базового блока;
Больший размер базового блока позволяет удалить больше тактов простоя, тк больше инструкций могут переупорядочиваться.
- **Статическая оптимизация с разворачиванием цикла.**
Реализуется компилятором, но приводит к изменению кода на языке высокого уровня.
Пример: был цикл от 1 до 100 с шагом 1. Теперь делаем цикл от 1 до 100 с шагом 4 и на каждой итерации выполняем последовательно 4 тела цикла. Увеличивается размер базового блока, что позволяет удалить больше тактов простоя, тк инструкции могут переупорядочиваться.
- **Разворачивание циклов.**
Больший размер базового блока - больше инструкций для перепланирования.
Исполняется меньше инструкций переходов и инструкций для поддержки циклов.
Разворачивание циклов еще эффективнее при реализации векторных команд.
**Необходимые требования для разворачивания цикла:**
- Независимость итераций цикла.
- Большое количество регистров для предотвращения конфликтов по именам регистров (WAR, WAW).

View File

@ -0,0 +1,43 @@
#### Пример разворачивания цикла.
```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$