diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index 605ee48..8f2d54c 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -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" -] \ No newline at end of file +{ + "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 +} \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/1.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/1.md index 6e5ff08..3874d0d 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/1.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/1.md @@ -1,7 +1,4 @@ -# Уровни абстракции электронной вычислительной системы. Фон Неймановская модель компьютера. - -#### Уровни абстракции - +# Уровни абстракции электронной вычислительной системы 1. **Физика (электроны)** - Поведение электронов описывается квантовой механикой и системой уравнений Максвелла. diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/3.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/3.md index 56da605..728b125 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/3.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/1 билет/3.md @@ -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) diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/1.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/1.md index 38d1bf5..42aee18 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/1.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/1.md @@ -3,10 +3,12 @@ **Параллелизм уровня инструкций (ILP)** - возможность одновременного выполнения нескольких инструкций в конвейере ЦП. ILP существует, когда инструкции в последовательности независимы и поэтому могут исполняться параллельно (с перекрытием). Конвейеры с большим ILP (меньшим числом зависимостей) показывают лучшую производительность на CPU с конвейером. -**Базовый блок инструкций** - линейная последовательность инструкций без переходов внутрь, за исключением точки входа, и без переходов наружу, за исключением точки выхода из последовательности. Пример: тело цикла. +**Базовый блок инструкций** - линейная последовательность инструкций без переходов внутрь, за исключением точки входа, и без переходов наружу, за исключением точки выхода из последовательности. *Пример*: тело цикла. - ILP в базовом блоке определяется имеющимися зависимостями между инструкциями и размером блока. - В типичном целочисленном коде частота условных переходов около $15\%$, что дает средний размер базового блока - 7 инструкций. - Любой статический метод, увеличивающий размер базового блока, расширяет блок инструкций для оптимального статического планирования конвейера компилятором и увеличивает ILP. + Один из таких методов - разворачивание цикла. + **Статический метод** - метод, который не имеет доступа к полям объекта, и для вызова такого метода не нужно создавать экземпляр класса, в котором он объявлен. diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/2.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/2.md index 176ed18..85568b8 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/2.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/2.md @@ -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). \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/3.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/3.md index 743911f..58c8943 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/3.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/10 билет/3.md @@ -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$ \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/1.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/1.md index 77a7aaf..f4ddc24 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/1.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/1.md @@ -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$ diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/2.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/2.md index 742a289..24a4dd0 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/2.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/2.md @@ -1,10 +1,6 @@ #### Уравнение производительности CPU - -**Формула:** - $$ T = I \times CPI \times C $$ - **Где:** - $I$ - число исполняемых инструкций программы. - $CPI$ - число тактов на инструкцию. -- $C$ - фиксированное время такта, $C = \frac{1}{\text{тактовая частота}}$. \ No newline at end of file +- $C$ - фиксированное время такта, $C = 1 / {\text{тактовая частота}}$. \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/3.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/3.md index 1d3a828..ea300ff 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/3.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/2 билет/3.md @@ -1,10 +1,7 @@ **Факторы, влияющие на производительность CPU:** - -- **Число исполняемых инструкций \( I \):** +- **Число исполняемых инструкций (I):** - Зависит от используемой программы, компилятора, ISA. - - **Среднее CPI:** - Зависит от используемой программы, компилятора, ISA, организации CPU. - - **Время такта \( C \):** - Зависит от организации CPU и технологии (СБИС). \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/5 билет/2.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/5 билет/2.md index 9975c59..f3429c2 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/5 билет/2.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/5 билет/2.md @@ -5,6 +5,5 @@ - Желательно иметь как можно больше регистров и режимов адресации (CISC - подход). - Размер регистрового файла и размер поля режима адресации влияют на размер средней инструкции и на размер средней программы в целом. - Желательно ограничить длину кода инструкции ради эффективной обработки при реализации (как минимум должна быть целым числом байт). -- Фиксированная длина - работает быстрее и проще реализовывается аппаратно. -- Переменная длина - позволяет уменьшить средний размер инструкции. -- Гибридная. \ No newline at end of file +- *Фиксированная длина* работает быстрее и проще реализовывается аппаратно. +- *Переменная длина* позволяет уменьшить средний размер инструкции. \ No newline at end of file diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/1.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/1.md index 40e44b4..39ad4bd 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/1.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/1.md @@ -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) diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/2.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/2.md index 262d1b8..e5ee0c4 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/2.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/6 билет/2.md @@ -1,7 +1,7 @@ #### Латентность и пропускная способность (+определение). - **Латентность** - время, требуемое для завершения всех шагов по обработке инструкции (время задержки завершения инструкции). Мин. время задержки завершения инструкции равно числу ступеней конвейера. Конвейеризация увеличивает пропускную способность CPU. + **Пропускная способность** - среднее число инструкций, завершенных за такт. Величина, обратная СРІ. diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/1.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/1.md index 8fc2f12..fbd43fb 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/1.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/1.md @@ -3,7 +3,8 @@ **Конфликты управления** возникают, когда неизвестен вовремя адрес след. исполняемой инструкции. Конфликт имеет место при выполнении любой управляющей инструкции. -- При выполнении условного перехода может измениться Instruction Pointer. +> [!NOTE] +> При выполнении условного перехода может измениться Instruction Pointer. Для корректной обработки требуется остановить конвейер на много тактов, пока не будет вычислено условие перехода и определится направление перехода, иначе IP может неверным, когда потребуется на ступени IF. diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/2.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/2.md index 15f4bf6..1f12888 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/2.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/2.md @@ -1,16 +1,12 @@ #### Аппаратные способы сокращения числа тактов простоя (+пример). - 1) Как можно раньше выяснить, выполняется ли переход 2) Как можно раньше вычислить адрес следующей исполняемой инструкции. **Пример.** В рассматриваемом примере (MIPS): +1. Инструкции условного перехода проверяют значение регистра на равенство 0. + Это действие можно завершить в такте ID, перемещая проверку на этот такт. -- Инструкции условного перехода проверяют значение регистра на равенство 0. - -Это действие можно завершить в такте ID, перемещая проверку на этот такт. - -- Оба IP (выбранный и невыбранный) должны быть вычислены заранее. - -Требуется доп. сумматор, тк имеющееся ALU не может использовано до такта EX -В таком случае будет только 1 такт простоя при переходах. +2. Оба IP (выбранный и невыбранный) должны быть вычислены заранее. + Требуется доп. сумматор, тк имеющееся ALU не может использовано до такта EX + В таком случае будет только 1 такт простоя при переходах. diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/3.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/3.md index 8c8a0d8..2d488d8 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/3.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/3.md @@ -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 | diff --git a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/4.md b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/4.md index adaf24d..b77a4e4 100644 --- a/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/4.md +++ b/2 курс/1 семестр/Архитектура ЭВМ/Лекции/9 билет/4.md @@ -1,16 +1,11 @@ #### Статическое предсказание переходов. - - Выполняется компилятором. - Кодируется в инструкциях условного перехода, используя один бит предсказания. - -Например: 0 - переход обычно не происходит, 1 - происходит. - + Например: 0 - переход обычно не происходит, 1 - происходит. - Требует поддержки на уровне ISA. -**Два основных метода статич. предсказания переходов на этапе компиляции:** - -- **Сбор информации о поведении программы при ее запусках и ее использование при перекомпиляции (профилирование).** -Например: профиль программы может показать, что большинство условных переходов вперед и назад (часто вызвано циклами) происходят. В данном случае нужно всегда предсказывать, что переход происходит. -- **Эвристическое предсказания переходов на основе направления перехода.** - -Например: помечая переходы назад как происходящие и переходы вперед как не происходящие. \ No newline at end of file +**Два основных метода статического предсказания переходов на этапе компиляции:** +- Сбор информации о поведении программы при её запусках и её использование при перекомпиляции (**профилирование**). + *Например*: профиль программы может показать, что большинство условных переходов вперед и назад (часто вызвано циклами) происходят. В данном случае нужно всегда предсказывать, что переход происходит. +- Эвристическое предсказание переходов на основе направления перехода. + *Например*: помечая переходы назад как происходящие и переходы вперед как не происходящие. \ No newline at end of file