Arch: edit

This commit is contained in:
2025-01-15 15:19:34 +03:00
parent 3a96c27c48
commit 0825ac9659
16 changed files with 129 additions and 144 deletions

View File

@ -1,19 +1,31 @@
[
"file-explorer",
"global-search",
"switcher",
"graph",
"backlink",
"canvas",
"outgoing-link",
"tag-pane",
"page-preview",
"templates",
"note-composer",
"command-palette",
"editor-status",
"bookmarks",
"outline",
"word-count",
"file-recovery"
]
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"properties": false,
"page-preview": true,
"daily-notes": false,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false,
"webviewer": false
}

View File

@ -1,7 +1,4 @@
# Уровни абстракции электронной вычислительной системы. Фон Неймановская модель компьютера.
#### Уровни абстракции
# Уровни абстракции электронной вычислительной системы
1. **Физика (электроны)**
- Поведение электронов описывается квантовой механикой и системой уравнений Максвелла.

View File

@ -1,18 +1,13 @@
# Шаги обработки инструкций в CPU
1. **Выборка инструкции**
- Выбрать инструкцию программы из памяти. Программный счетчик (Program Counter, PC / Instruction Pointer, IP) указывает на следующую для обработки инструкцию.
Выбрать инструкцию программы из памяти. Программный счетчик (Program Counter, PC / Instruction Pointer, IP) указывает на следующую для обработки инструкцию.
2. **Декодирование инструкции**
- Определить требуемые действия и размер инструкции.
Определить требуемые действия и размер инструкции.
3. **Выборка операндов**
- Найти и получить данные операндов.
Найти и получить данные операндов.
4. **Исполнение**
- Вычислить значение результата или статус.
Вычислить значение результата или статус.
5. **Сохранение результата**
- Записать результаты в запоминающее устройство для последующего использования.
Записать результаты в запоминающее устройство для последующего использования.
![Шаги обработки инструкций в CPU](../data/2.png)

View File

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

View File

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

View File

@ -1,19 +1,22 @@
#### Пример разворачивания цикла.
```assembly
```c
for (i = 1000; i>0; i = i-1)
x[i]= x[i] + s;
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
```armasm
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 копии цикла развернуты без повторного использования регистров.
@ -24,20 +27,20 @@ Loop: LD [R1], F0 1
Разворачивание цикла сразу с оптимизацией:
| 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 |
| 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$

View File

@ -1,20 +1,14 @@
# Определение микрооперации. Определение "среднее CPI программы"
**Микрооперация**
- Элементарное аппаратное действие, которое может быть произведено за 1 такт CPU.
- Микрооперация соответствует одной микроинструкции в микропрограммируемых CPU.
**Набор RISC команд**
- Множество микроопераций, которые выполняет процессор.
- **Микрооперация**
Элементарное аппаратное действие, которое может быть произведено за 1 такт CPU.
Микрооперация соответствует одной микроинструкции в микропрограммируемых CPU.
- **Набор RISC команд**
Множество микроопераций, которые выполняет процессор.
**Набор CISC команд**
- Множество микроопераций, получаемых при декодировании процессором CISC команд.
Множество микроопераций, получаемых при декодировании процессором CISC команд.
**CPI (Cycles Per Instruction)**
- Такт на инструкцию.
Такт на инструкцию.
**Среднее CPI программы**
- CPI, усредненное для всех инструкций, выполненных в программе на CPU с заданным дизайном.
CPI, усредненное для всех инструкций, выполненных в программе на CPU с заданным дизайном.
**IPC (Instruction Per Cycle)**
- Число инструкций за такт, $$ IPC = 1/CPI. $$
Число инструкций за такт: $IPC = 1/CPI$

View File

@ -1,10 +1,6 @@
#### Уравнение производительности CPU
**Формула:**
$$ T = I \times CPI \times C $$
**Где:**
- $I$ - число исполняемых инструкций программы.
- $CPI$ - число тактов на инструкцию.
- $C$ - фиксированное время такта, $C = \frac{1}{\text{тактовая частота}}$.
- $C$ - фиксированное время такта, $C = 1 / {\text{тактовая частота}}$.

View File

@ -1,10 +1,7 @@
**Факторы, влияющие на производительность CPU:**
- **Число исполняемых инструкций \( I \):**
- **Число исполняемых инструкций (I):**
- Зависит от используемой программы, компилятора, ISA.
- **Среднее CPI:**
- Зависит от используемой программы, компилятора, ISA, организации CPU.
- **Время такта \( C \):**
- Зависит от организации CPU и технологии (СБИС).

View File

@ -5,6 +5,5 @@
- Желательно иметь как можно больше регистров и режимов адресации (CISC - подход).
- Размер регистрового файла и размер поля режима адресации влияют на размер средней инструкции и на размер средней программы в целом.
- Желательно ограничить длину кода инструкции ради эффективной обработки при реализации (как минимум должна быть целым числом байт).
- Фиксированная длина - работает быстрее и проще реализовывается аппаратно.
- Переменная длина - позволяет уменьшить средний размер инструкции.
- Гибридная.
- *Фиксированная длина* работает быстрее и проще реализовывается аппаратно.
- *Переменная длина* позволяет уменьшить средний размер инструкции.

View File

@ -1,18 +1,16 @@
#### Принцип конвейерной обработки инструкций. Определение ступени/стадии конвейера. Ступени конвейера MIPS (пример-иллюстрация).
Конвейерная обработка инструкций - метод реализации CPU, при котором множество операции над несколькими инструкциями перекрываются.
**Конвейерная обработка инструкций** - метод реализации CPU, при котором множество операции над несколькими инструкциями перекрываются.
- Конвейер, исполняющий инструкцию, состоит из множества шагов, где на каждом завершается этап обработки инструкции. Каждый шаг называется ступенью конвейера или стадией конвейера.
- Ступени и стадии конвейера соединены линейным образом: инструкции входят с одного конца, проходят по ступеням и выходят на другом конце.
- Конвейеризация не сокращает время выполнения отдельной инструкции.
- **Ступени конвейера MIPS:**
**IF (Instruction Fetch)** - выборка инструкций.
**ID (Instruction Decode)** - декодирование инструкции
**EX (Execution)** - исполнение.
**MEM (MEMory Access)** - обращение к памяти.
**WB (Write Back)** - запись рез-та. Имеется в виду запись в регистр.
##### Ступени конвейера MIPS
- **IF (Instruction Fetch)** - выборка инструкций.
- **ID (Instruction Decode)** - декодирование инструкции
- **EX (Execution)** - исполнение.
- **MEM (MEMory Access)** - обращение к памяти.
- **WB (Write Back)** - запись рез-та. Имеется в виду запись в регистр.
![](../data/4.png)
![Ступени конвейера MIPS](../data/3.png)

View File

@ -1,7 +1,7 @@
#### Латентность и пропускная способность (+определение).
**Латентность** - время, требуемое для завершения всех шагов по обработке инструкции (время задержки завершения инструкции).
Мин. время задержки завершения инструкции равно числу ступеней конвейера.
Конвейеризация увеличивает пропускную способность CPU.
**Пропускная способность** - среднее число инструкций, завершенных за такт. Величина, обратная СРІ.

View File

@ -3,7 +3,8 @@
**Конфликты управления** возникают, когда неизвестен вовремя адрес след. исполняемой инструкции. Конфликт имеет место при выполнении любой управляющей инструкции.
- При выполнении условного перехода может измениться Instruction Pointer.
> [!NOTE]
> При выполнении условного перехода может измениться Instruction Pointer.
Для корректной обработки требуется остановить конвейер на много тактов, пока не будет вычислено условие перехода и определится направление перехода, иначе IP может неверным, когда потребуется на ступени IF.

View File

@ -1,16 +1,12 @@
#### Аппаратные способы сокращения числа тактов простоя (+пример).
1) Как можно раньше выяснить, выполняется ли переход
2) Как можно раньше вычислить адрес следующей исполняемой инструкции.
**Пример.** В рассматриваемом примере (MIPS):
1. Инструкции условного перехода проверяют значение регистра на равенство 0.
Это действие можно завершить в такте ID, перемещая проверку на этот такт.
- Инструкции условного перехода проверяют значение регистра на равенство 0.
Это действие можно завершить в такте ID, перемещая проверку на этот такт.
- Оба IP (выбранный и невыбранный) должны быть вычислены заранее.
Требуется доп. сумматор, тк имеющееся ALU не может использовано до такта EX
В таком случае будет только 1 такт простоя при переходах.
2. Оба IP (выбранный и невыбранный) должны быть вычислены заранее.
Требуется доп. сумматор, тк имеющееся ALU не может использовано до такта EX
В таком случае будет только 1 такт простоя при переходах.

View File

@ -3,31 +3,32 @@
**Задержанный/отложенный переход** - инструкция, след. после перехода (из слота задержки перехода) исполняется независимо от того, произошел переход или нет (введена частью ISA).
- **Предположение, что переход никогда не происходит.**
##### Предположение, что переход никогда не происходит.
Продолжается выполнение инструкций, начиная с инструкции, след. за инструкцией перехода, но состояние машины не меняется до тех пор, пока рез-тат перехода точно не определен. Если переход не произошел - состояние сохраняется, если произошел - рез-таты отбрасываются, фактически произошел простой.
- **Предположение, что переход всегда происходит.**
Продолжается выполнение инструкций, начиная с места перехода, ...
Труднее реализовать, чем предыдущий вариант.
**Пример: схема предсказания «переход не произойдет»:**
**Переход не произошел, нет простоя:**
###### Пример
Переход не произошел, нет простоя:
| Program | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| :-- | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| I (untaken branch instruction) | IF | ID | EX | MEM | WB | | | | |
| :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- |
| I+1 | | IF | ID | EX | MEM | WB | | | |
| I+2 | | | IF | ID | EX | MEM | WB | | |
| I+3 | | | | IF | ID | EX | MEM | WB | |
| I+4 | | | | | IF | ID | EX | MEM | WB |
**Переход произошел, простой:**
Переход произошел, простой:
| Program | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| :--------------------------- | :-: | :-: | :--: | :--: | :--: | :--: | :-: | :-: | :-: |
| I (taken branch instruction) | IF | ID | EX | MEM | WB | | | | |
| I+1 | | IF | - | - | - | - | | | |
| Branch target | | | IF | ID | EX | MEM | WB | | |
| Branch target +1 | | | | IF | ID | EX | MEM | WB | |
| Branch target +2 | | | | | IF | ID | EX | MEM | WB |
##### Предположение, что переход всегда происходит.
Продолжается выполнение инструкций, начиная с места перехода, ...
Труднее реализовать, чем предыдущий вариант.
| I (taken branch instruction) | IF | ID | EX | MEM | WB | | | | |
| :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- | :-- |
| I+1 | | IF | Idle | Idle | Idle | idle | | | |
| Branch target | | | IF | ID | EX | MEM | WB | | |
| Branch target +1 | | | | IF | ID | EX | MEM | WB | |
| Branch target +2 | | | | | IF | ID | EX | MEM | WB |

View File

@ -1,16 +1,11 @@
#### Статическое предсказание переходов.
- Выполняется компилятором.
- Кодируется в инструкциях условного перехода, используя один бит предсказания.
Например: 0 - переход обычно не происходит, 1 - происходит.
Например: 0 - переход обычно не происходит, 1 - происходит.
- Требует поддержки на уровне ISA.
**Два основных метода статич. предсказания переходов на этапе компиляции:**
- **Сбор информации о поведении программы при ее запусках и ее использование при перекомпиляции (профилирование).**
Например: профиль программы может показать, что большинство условных переходов вперед и назад (часто вызвано циклами) происходят. В данном случае нужно всегда предсказывать, что переход происходит.
- **Эвристическое предсказания переходов на основе направления перехода.**
Например: помечая переходы назад как происходящие и переходы вперед как не происходящие.
**Два основных метода статического предсказания переходов на этапе компиляции:**
- Сбор информации о поведении программы при её запусках и её использование при перекомпиляции (**профилирование**).
*Например*: профиль программы может показать, что большинство условных переходов вперед и назад (часто вызвано циклами) происходят. В данном случае нужно всегда предсказывать, что переход происходит.
- Эвристическое предсказание переходов на основе направления перехода.
*Например*: помечая переходы назад как происходящие и переходы вперед как не происходящие.