Дана 5‑ступенчатая конвейерная архитектура процессора (IF, ID, EX, MEM, WB). При последовательности команд: lw r1,0(r2); add r3,r1,r4; lw r1,4(r2); add r5,r1,r6 проанализируйте виды конфликтов (hazards), предложите набор простых аппаратных и программных приёмов (форвардинг, инсерты, переупорядочивание) для их устранения и оцените влияние на IPC

20 Окт в 10:33
4 +1
0
Ответы
1

Кратко — перечислю конфликты, предложу простые приёмы и оценю влияние на IPC.

1) Конфликты (hazards)

RAW (load–use) между инструкциями 1 и 2: ( \text{lw } r1,0(r2) \rightarrow \text{add } r3,r1,r4 ). Это классический load–use: данные из ( \text{lw} ) становятся доступны только после стадии MEM, поэтому следующий EX нуждается в них раньше — требуется одна пузырь‑стадия при типичной 5‑ступенчатой конвейерной схеме.RAW между инструкциями 3 и 4: ( \text{lw } r1,4(r2) \rightarrow \text{add } r5,r1,r6 ) — аналогично, ещё один load–use.Между инструкциями 2 и 3 прямых конфликтов нет (add читает старое (r1) до того, как второй ( \text{lw} ) запишет новое), WAW/WAR в данном упорядочении не возникают.Возможный структурный конфликт: при общедоступной единой памяти IF и MEM могут требовать доступ в одну и ту же тактовую эпоху — потребует дополнительной логики или одного тактового «простаивания». Управление переходами отсутствует (нет ветвлений), значит control hazard нет.

2) Простые аппаратные приёмы

Форвардинг (forwarding): стандартный EX/MEM и MEM/WB forwarding для ALU‑результатов.Детектор load–use + вставка одного бублика (stall) при случае lw → зависимая инструкция (типичная реализация). Это требует одного цикла задержки для каждой load–use пары.Раздельные порты для командной и данных памяти (или кеши I/D) — устраняет возможный IF/MEM структурный конфликт.Более сложные HW (не столь «простые»): раннее возвращение данных из кэша (снизить латентность MEM), либо out‑of‑order execution / register renaming для полного скрытия задержек.

3) Простые программные приёмы (компилятор/ручное расписание)

Инструкция переупорядочивания: вставить независимые инструкции между ( \text{lw} ) и зависимым ( \text{add} ) чтобы скрыть один цикл задержки.Регистровое переименование/использование временных регистров, чтобы не перезаписывать тот же регистр (r1) и позволить переупорядочивание:
Пример преобразования (исходно)
( \text{lw } r1,0(r2);\ \text{add } r3,r1,r4;\ \text{lw } r1,4(r2);\ \text{add } r5,r1,r6 )
Можно переписать (переименование (r1) во временный (r7)):
( \text{lw } r1,0(r2);\ \text{lw } r7,4(r2);\ \text{add } r3,r1,r4;\ \text{add } r5,r7,r6 )
Здесь второй ( \text{lw} ) и последующий ( \text{add} ) используют (r7), и вставка второй загрузки между первой загрузкой и первым add скрывает латентность первой загрузки.Если нет независимых инструкций в текущем потоке — компилятор может перенести/вставить независимые операции или использовать регистры‑буферы.

4) Оценка влияния на IPC
Для длины последовательности (n) идеальное число тактов без задержек — (n+4) (заполнение/опустошение конвейера). Оценки для данной последовательности ((n=4)) и для длительного потока:

С аппаратным forwarding (ALU‑форвардинг), но с обязательной одной пузырь‑стадией на load–use (типичная реализация):
для нашей короткой последовательности число вставленных пауз = (2) (между 1→2 и 3→4), такты = ((n+4)+2 = 4+4+2 = 10).
IPC = (\dfrac{4}{10} = 0.4).

С forwarding + программным переименованием/перестановкой (как выше), устраняющим load–use задержки:
такты = (n+4 = 8).
IPC = (\dfrac{4}{8} = 0.5).

Для длинного повторяющегося паттерна ( \text{lw};\ \text{add};\ \text{lw};\ \text{add};\dots ) при наличии одного такта stall на каждую load–use пару:
пара из двух инструкций (lw+add) занимает (3) такта ⇒ средний CPI = (1.5), т.е. IPC = (\dfrac{1}{1.5} = \dfrac{2}{3} \approx 0.667).
(с программным рефакторингом или с HW, убирающим load–use stall, IPC → (1) в стационарном режиме).

Коротко: самый дешёвый HW‑комплекс — стандартный forwarding + детектор load–use (вставка одного стагна) — даёт корректность, но снижает throughput (в нашем примере до IPC=(0.4) для короткого фрагмента, в стационарном потоке до IPC≈(0.667)). Самый простой эффективный SW‑приём — регистрация второго lw в другой регистр и перестановка инструкций (пример выше) — устраняет паузы и даёт IPC близкий к идеалу (в данном фрагменте IPC=(0.5), в стационарном потоке — IPC=(1) при наличии независимых инструкций).

20 Окт в 10:51
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир