Архитектура компьютера
Цикл инструкции: Fetch-Decode-Execute
Цели урока
- Понимать три основные стадии цикла: Fetch, Decode, Execute
- Знать что происходит на каждой стадии
- Понимать расширенный 5-стадийный цикл
- Уметь прослеживать выполнение инструкции по шагам
Предварительные знания
- Структура CPU
- АЛУ
- Регистры
Каждую наносекунду, триллионы раз в день, ваш процессор выполняет один и тот же ритуал: достать инструкцию, понять её, выполнить. Понимание этого цикла - ключ к пониманию производительности.
- Оптимизация кода под конвейер
- Понимание branch prediction
- Анализ производительности
- Написание эффективных циклов
Три шага вечного цикла
**Цикл инструкции** - фундаментальный алгоритм работы любого процессора. Каждая инструкция проходит три стадии:
Это **бесконечный цикл**. CPU выполняет его миллиарды раз в секунду, пока не выключен.
| Стадия | Английский | Действие |
|---|---|---|
| 1. Выборка | Fetch | Загрузить инструкцию из памяти |
| 2. Декодирование | Decode | Определить операцию и операнды |
| 3. Исполнение | Execute | Выполнить операцию |
**Расширенные циклы:** Современные CPU добавляют стадии Memory (доступ к памяти) и Write Back (запись результата). Получается 5-стадийный цикл.
В каком порядке выполняются стадии цикла инструкции?
Fetch: Выборка инструкции
**Fetch** - CPU читает инструкцию из памяти по адресу в Program Counter (PC).
**Prefetch:** Современные CPU загружают инструкции заранее (instruction prefetch), пока выполняются предыдущие. Это часть конвейера.
Откуда CPU берёт адрес следующей инструкции на стадии Fetch?
Decode: Декодирование
**Decode** - Control Unit разбирает инструкцию: какая операция, какие операнды.
**Результат декодирования - управляющие сигналы:**
| Сигнал | Значение | Назначение |
|---|---|---|
| ALUOp | ADD | Какую операцию выполнить |
| RegRead1 | R2 | Первый операнд из R2 |
| RegRead2 | R3 | Второй операнд из R3 |
| RegWrite | R1 | Записать результат в R1 |
| MemRead | 0 | Не читать из памяти |
| MemWrite | 0 | Не писать в память |
**Сложность x86:** Инструкции от 1 до 15 байт. Декодер - огромная часть CPU. ARM (RISC) проще: все инструкции по 4 байта.
Что определяет стадия Decode?
Execute: Исполнение
**Execute** - АЛУ выполняет операцию, определённую на стадии Decode.
**Разные инструкции - разные действия Execute:**
| Инструкция | Execute делает |
|---|---|
| ADD R1, R2, R3 | R1 = R2 + R3 (АЛУ) |
| LOAD R1, [addr] | Вычисляет адрес (АЛУ) |
| JUMP addr | PC = addr (не АЛУ) |
| CMP R1, R2 | R1 - R2, только флаги (АЛУ) |
| NOP | Ничего (пропуск такта) |
**Branch:** Для JMP/CALL Execute изменяет PC вместо записи в регистр. Это нарушает последовательность - проблема для конвейера!
Какой блок CPU выполняет операцию на стадии Execute?
Memory и Write Back
В 5-стадийном цикле после Execute идут ещё две стадии:
**Memory (MEM):** Доступ к памяти для LOAD/STORE
**Write Back (WB):** Запись результата в регистр
| Стадия | ADD R1,R2,R3 | LOAD R1,[addr] | STORE [addr],R1 |
|---|---|---|---|
| IF | Fetch | Fetch | Fetch |
| ID | Decode | Decode | Decode |
| EX | R2 + R3 | Calc addr | Calc addr |
| MEM | - | Read mem | Write mem |
| WB | R1 ← result | R1 ← data | - |
Для какой инструкции стадия Memory активна?
Полный пример: цикл по шагам
Проследим выполнение `ADD R3, R1, R2` (R3 = R1 + R2):
**5 тактов на инструкцию?** Без конвейера - да. С конвейером - по 1 такту на инструкцию (после заполнения).
CPU выполняет одну инструкцию за такт
Без конвейера - несколько тактов на инструкцию. С конвейером - в среднем ~1 инструкция за такт.
Конвейер позволяет выполнять стадии разных инструкций параллельно, достигая CPI (cycles per instruction) близкого к 1.
Сколько тактов занимает одна инструкция в 5-стадийном цикле БЕЗ конвейера?
Ключевые идеи
- Fetch: загрузка инструкции из памяти по адресу PC
- Decode: разбор opcode и операндов, генерация сигналов
- Execute: выполнение операции в АЛУ
- Memory: чтение/запись данных (для LOAD/STORE)
- Write Back: сохранение результата в регистр
- Без конвейера: 5 тактов на инструкцию
Связанные темы
Цикл инструкции - основа для конвейеризации.
- Конвейеризация — Параллельное выполнение стадий
- Суперскалярность — Несколько инструкций одновременно