Детальный проект конвейерного RISC процессора (Глава 4 "Основы конвейеризации"), страница 26

4.6.4    Коэффициент CPI конструкции DLX

Для нашего анализа мы примем среднюю загрузку SPECint92. Таблица 4.20 перечисляет частоту машинных команд DLX при этой загрузке. Таблица взята из [HP96], но мы нормализовали числа к 100%.


Таблица 4.21 Число циклов CPU и доступов к памяти на команду DLX.


команды

циклы CPU

доступы к памяти

CPI,

загрузка, сохранение

3

2

5 + 2WS

вычисление

3

1

4 + WS

вызов (jal, jalr)

4

1

5 + WS

переход

2

1

3 + WS

ветвление, принятое

3

1

4 + WS

ветвление, непринятое

2

1

3 + WS

Последовательная конструкция

Для конструкции последовательной DLX, таблица 4.21 определяет число циклов CPU и число обращений к памяти требуемое любой машинной командой I. Эта таблица получена из диаграммы конечных состояний на рисунке 3.20. Пусть доступ к памяти требует в среднем WSсостояний ожидания. Тогда значение CPIIкоманды I равно числу этих циклов CPU плюс время (WS+1) числа доступов к памяти. Когда объединим с частотой команд из таблицы 4.20, получим следующий коэффициент CPI для конструкции последовательной DLX:

CPIDLXs = 4.26 +1.34 • WS.

Конвейерная конструкция со взаимной блокировкой Даже с пересылкой результата, конвейерная конструкция DLX может быть замедлена тремя типами опасностей, называемых пустой слот задержки ветвления, аппаратная взаимная блокировка из-за загрузки и медленных доступов к памяти.

Слот задержки ветвления Компилятор пробует заполнить слоты задержек переходов полезными командами, но приблизительно 59% слотов задержки не может быть заполнено (таблица 4.19). По сравнению с идеальной конвейеризацией, такой пустой слот задержки останавливает конвейер на CPHNopB = 1 циклов. Эта опасность имеет следующую частоту:

vNopB   = vbranch • 0.59   =   0.166 • 0.59 ~ 0.1.

Так как эти опасности управления решены программно, каждый пустой слот задержки также причина дополнительной выборки команды.

Аппаратная взаимная блокировка    Так как результат загрузки может быть переслан только из этапа WB, механизм пересылки не всегда может доставлять операторы


вовремя. При такой опасности данных, механизм аппаратной взаимной блокировки вставляет до двух фиктивных команд. Компилятор уменьшает эти опасности данных планируя независимые команды после загрузки везде, где это возможно. Согласно [HP96], обеих взаимных блокировок можно избежать для 63% загрузок а для других 11% можно избежать, по крайней мере, одной блокировки. Таким образом, две блокировки происходят только для 26% всех загрузок. Каждая взаимная блокировка увеличивает счетчик циклов на CPHNopL= 1. При рассмотренной нагрузке, эта опасность имеет частоту

vnopl   =   vload  • (2•0.26 + 0.11) = 0.253 • 0.63 ~ 0.16.


Медленные доступы к памяти В иерархической системе памяти большинство доступов может быть выполнено в одном цикле, но есть также медленные обращения, которые требуют нескольких состояний ожиданий. Пусть каждый доступ к памяти требует в среднем CPH.slowM = WSсостояний ожидания. Частота медленных доступов к памяти тогда равна числу загрузок, записей и выборок команд:

vslowM   =  vload+vstore+ vfetch .

Так как опасности ветвления решены программно вставкой NOP, они вызывают vNopBдополнительных выборок команд. Опасности загрузки решаются аппаратной взаимной блокировкой и не требуют дополнительных выборок. Таким образом, частота выборки команд равна

vfetch1 + vNopB  =  1.1.

Суммируя циклы остановки всех опасностей, получим следующий коэффициент CPI для конструкции конвейерной DLX с пересылкой:

CPIDLXn     =     1 + vNopB1 + vNopL • 1 + vslowM CPHslowM

~ 1.26 + 1.44 • WS.

Конвейерная конструкция без пересылки

Конструкция DLXπbс основным конвейером решает опасности программно; если необходимо, компилятор должен вставить команды NOP. Эта конструкция сталкивается с теми же самыми проблемами, что и конструкция DLXπ , но в добавок, она должна управляться без пересылки результата. Всякий раз, когда DLXπконвейер должен переслать результат, компилятор должен перестроить код или вставить NOP. Согласно моделям [Del97], эти опасности пересылки останавливают основной конвейер на CPHforw = 1 циклов каждая, и они имеют частоту

vforw = 0.39.