Boroda_2
.doc
Таблица 4.8. Микропрограмма для Mic-2
Микрокоманда |
Операции |
Комментарий |
пор1 |
goto (MBR) |
Переход к следующей команде |
iaddl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
iadd2 |
H = TOS |
Н = вершина стека |
Микрокоманда |
Операции |
Комментарий |
iload2 |
MAR = SP = SP + 1 |
Увеличение SP на 1; перемещение нового значения SP в регистр MAR |
iload3 |
TOS = MDR; wr; goto (MBR1) |
Обновление стека в регистре TOS и памяти |
istorel |
MAR = LV + MBR1U |
Установка регистра MAR на значение LV + индекс |
istore2 |
MDR = TOS; wr |
Копирование значения TOS для сохранения в памяти |
istore3 |
MAR = SP = SP - 1; rd |
Уменьшение SP на 1; чтение нового значения TOS |
istore4 |
|
Машина ждет окончания процесса чтения |
istore5 |
TOS = MDR; goto (MBR1) |
Обновление TOS |
widel |
goto (MBR1 ИЛИ 0x100) |
Следующий адрес — 0x100 ИЛИ код операции |
wide_iload1 |
MAR = LV + MBR2U; rd; goto iload2 |
То же, что iloadl, но с использованием 2-байтного индекса |
wide_istore1 |
MAR = LV + MBR2U; goto istore2 |
То же, что istorel, но с использованием 2-байтного индекса |
Idc_w1 |
MAR = CPP + MBR2U; rd; goto iload2 |
То же, что wide_i!oad1, но индексирование осуществляется из регистра СРР |
iincl |
MAR = LV + MBR1U; rd |
Установка регистра MAR на значение LV + индекс; чтение этого значения |
iinc2 |
H = MBR1 |
Присваивание регистру Н константы |
iinc3 |
MDR = MDR + H; wr; goto (MBR1) |
Увеличение на константу и обновление |
gotol |
H = PC - 1 |
Копирование значения PC в регистр Н |
goto2 |
PC = H + MBR2 |
Прибавление смещения и обновление PC |
goto3 |
|
Машина ждет, пока блок выборки команд вызовет новый код операции |
goto4 |
goto (MBR1) |
Переход к следующей команде |
ifltl |
MAR = SP = SP - 1; rd |
Чтение второго сверху слова в стеке |
iflt2 |
OPC = TOS |
Временное сохранение TOS в ОРС |
iflt3 |
TOS = MDR |
Запись новой вершины стека в TOS |
iflt4 |
N = OPC; if(N) goto T; else goto F |
Переход по биту N |
ifeql |
MAR = SP = SP - 1; rd |
Чтение второго сверху слова в стеке |
ifeq2 |
OPC = TOS |
Временное сохранение TOS в ОРС |
|
|
|
|
|
|
|
|
|
Микрокоманда |
Операции |
Комментарий |
iadd3 |
MDR = TOS = MDR + H; wr; goto (MBR1) |
Суммирование двух верхних слов; запись суммы в верхнюю позицию стека |
isubl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
isub2 |
H = TOS |
Н = вершина стека |
isub3 |
MDR = TOS = MDR - H; wr; goto (MBR1) |
Вычитание TOS из вызванного значения TOS - 1 |
iandl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
iand2 |
H = TOS |
Н = вершина стека |
iand3 |
MDR = TOS = MDR И H; wr; goto (MBR1) |
Логическое умножение вызванного значения TOS - 1 и TOS (операция И) |
iorl |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
ior2 |
H = TOS |
Н = вершина стека |
ior3 |
MDR = TOS = MDR ИЛИ H; wr; goto (MBR1) |
Логическое сложение вызванного значения TOS - 1 и TOS (операция ИЛИ) |
dupl |
MAR = SP = SP + 1 |
Увеличение SP на 1 и копирование результата в регистр MAR |
dup2 |
MDR = TOS; wr; goto (MBR1) |
Запись нового слова в стек |
pop1 |
MAR = SP = SP - 1; rd |
Чтение слова, идущего после верхнего слова стека |
P°P2 |
|
Программа ждет, пока закончится процесс чтения |
рорЗ |
TOS = MDR; goto (MBR1) |
Копирование нового слова в регистр TOS |
swapl |
MAR = SP - 1; rd |
Чтение второго слова из стека; установка регистра MAR на значение SP |
swap2 |
MAR = SP |
Подготовка к записи нового второго слова стека |
swap3 |
H = MDR; wr |
Сохранение нового значения TOS; запись второго слова стека |
swap4 |
MDR = TOS |
Копирование прежнего значения TOS в регистр MDR |
swap5 |
MAR = SP - 1; wr |
Запись прежнего значения TOS на второе место в стеке |
swap6 |
TOS = H; goto (MBR1) |
Обновление TOS |
bipush 1 |
SP = MAR = SP + 1 |
Установка регистра MAR для записи в новую вершину стека |
bipush2 |
MDR = TOS = MBR1; wr; goto (MBR1) |
Обновление стека в регистре TOS и памяти |
iloadi |
MAR = LV + MBR1U; rd |
Перемещение значения LV с индексом в регистр MAR; чтение операнда |
Микрокоманда |
Операции |
Комментарий |
if_icmpeq2 |
MAR = SP = SP - 1 |
Установка регистра MAR на чтение новой вершины стека |
if_icmpeq3 |
H = MDR; rd |
Копирование второго слова из стека в регистр Н |
if_icmpeq4 |
OPC = TOS |
Временное сохранение TOS в ОРС |
if_icmpeq5 |
TOS = MDR |
Помещение новой вершины стека в TOS |
if_icmpeq6 |
Z = H - OPC; if(Z) goto T; else goto F |
Если два верхних слова равны, осуществляется переход к Т; если они не равны, осуществляется переход к F |
T |
H = PC - 1; goto goto2 |
То же, что gotol |
F |
H = MBR2 |
Игнорирование байтов, находящихся в регистре MBR2 |
F2 |
goto (MBR1) |
|
invoke_virtual1 |
MAR = CPP + MBR2U; rd |
Помещение адреса указателя процедуры в регистр MAR |
invoke_virtual2 |
OPC = PC |
Сохранение значения PC в регистре ОРС |
invoke_virtual3 |
PC = MDR |
Установка PC на первый байт кода процедуры |
invoke_virtual4 |
TOS = SP - MBR2U |
TOS = адрес OBJREF - 1 |
invoke_virtual5 |
TOS = MAR = H = TOS + 1 |
TOS = адрес OBJREF |
invoke_virtual6 |
MDR = SP + MBR2U + 1; wr |
Перезапись OBJREF со связующим указателем |
invoke_virtual7 |
MAR = SP = MDR |
Установка регистров SP и MAR на адрес ячейки, в которой содержится старое значение PC |
invoke_virtual8 |
MDR = OPC; wr |
Подготовка к сохранению старого значения PC |
invoke_virtual9 |
MAR = SP = SP + 1 |
Увеличение SP на 1; теперь SP указывает на ячейку, в которой хранится старое значение LV |
invoke_virtual10 |
MDR = LV; wr |
Сохранение старого значения LV |
invoke_virtual11 |
LV = TOS; goto (MBR1) |
Установка значения LV на нулевой параметр |
ireturnl |
MAR = SP = LV; rd |
Переустановка регистров SP и MAR для чтения связующего указателя |
ireturn2 |
|
Процесс считывания связующего указателя |
ireturn3 |
LV = MAR = MDR; rd |
Установка регистров LV и MAR на связующий указатель; чтение старого значения PC |
ireturn4 |
MAR = LV + 1 |
Установка регистра MAR на старое значение LV; чтение старого значения LV |
ireturn5 |
PC = MDR; rd |
Восстановление PC |
ireturn6 |
MAR = SP |
|
ireturn7 |
LV = MDR |
Восстановление LV |
ireturn8 |
MDR = TOS; wr; goto (MBR1) |
Сохранение результата в исходной вершине стека |
В микроархитектуре Mic-2 некоторые команды усовершенствованы в большей степени, чем другие. Команда LDC W сокращается с 9 до 3 микрокоманд, и, следовательно, время выполнения команды уменьшается втрое. Несколько по-дру- гому дело обстоит с командой SWAP: изначально там было 8 микрокоманд, а стало 6. Для общей производительности компьютера играет роль сокращение наиболее часто повторяющихся команд, а это команды ILOAD (было 6, стало 3), IADD (было 4, стало 3) и IF ICMPEQ (было 13, стало 10 для случая, когда слова равны; было 10, стало 8 для случая, когда слова не равны). Чтобы вычислить, насколько выросла производительность, можно проверить эффективность системы по эталонному тесту, но и без этого ясно, что имеет место значительный выигрыш в быстродействии.
Конвейерная конструкция — микроархитектура Mic-3
Очевидно, что Mic-2 — это усовершенствованная микроархитектура Mic-1. Она работает быстрее и требует меньше управляющей памяти, хотя стоимость блока выборки команд несомненно превышает сумму, выигранную за счет сокращения объема управляющей памяти. Таким образом, машина Mic-2 работает значительно быстрее при некотором увеличении стоимости. Давайте посмотрим, можно ли еще больше повысить скорость.
А что, если попробовать уменьшить время цикла? В значительной степени время цикла определяется базовой технологией. Чем меньше транзисторы и физическое расстояние между ними, тем быстрее может работать задающий генератор. В технологии, которую мы рассматриваем, время, затрачиваемое на прохождение через тракт данных, фиксировано (по крайней мере, с нашей точки зрения). Тем не менее у нас есть некоторая свобода действий и далее мы используем ее в полной мере.
Еще один вариант усовершенствования — увеличить степень параллелизма. На данный момент микроархитектура Mic-2 выполняет большинство операций последовательно. Она помещает значения регистров на шины, ждет, пока АЛУ и схема сдвига их обработают, а затем записывает результаты обратно в регистры. Если не учитывать работу блока выборки команд, никакого параллелизма здесь нет. Внедрение дополнительных механизмов параллельной обработки сулит значительные преимущества.
Как уже отмечалось, длительность цикла определяется временем, необходимым для прохождения сигнала через тракт данных. На рис. 4.2 показано распределение этой задержки между различными компонентами во время каждого цикла. Цикл тракта данных объединяет три основные составляющие:
-
Время, которое требуется на передачу значений выбранных регистров на шины А и В.
-
Время, которое требуется на работу АЛУ и схемы сдвига.
-
Время, которое требуется на передачу полученных значений обратно в регистры и сохранение этих значений.
На рис. 4.21 показана новая 3-шинная архитектура с блоком выборки команд и тремя дополнительными защелками (регистрами), каждая из которых расположена в середине каждой шины. Эти регистры записываются в каждом цикле. Они делят тракт данных на отдельные части, которые могут функционировать независимо друг от друга. Мы будем называть такую архитектуру конвейерной моделью, или Mic-3.
Зачем нужны целых три дополнительных регистра? Ведь теперь для прохождения сигнала через тракт данных требуется 3 цикла: один для загрузки регистров А и В, второй для запуска АЛУ и схемы сдвига, а также загрузки регистра С, третий для сохранения значения регистра-защелки С обратно в нужных регистрах. Мы что, ненормальные? (Подсказка: нет.) Существует целых две причины введения дополнительных регистров:
-
Мы можем повысить тактовую частоту, поскольку максимальная задержка теперь стала меньше.
-
Во время каждого цикла мы можем использовать все части тракта данных. После разбиения тракта данных на три части максимальная задержка прохождения сигнала уменьшается, в результате тактовая частота может повышаться. Будем считать, что, если разбить цикл тракта данных на три примерно равных интервала, тактовая частота увеличится втрое. (На самом деле это не так, поскольку мы добавили в тракт данных еще два регистра, но в первом приближении это допустимо.)
Поскольку мы предполагаем, что все операции чтения из памяти и записи в память выполняются с использованием кэш-памяти первого уровня и эта кэш-память построена из того же материала, что и регистры, мы можем сделать вывод, что операция с памятью занимает один цикл. На практике, однако, этого не так легко достичь.
Второй пункт связан с общей производительностью, а не со скоростью выполнения отдельной команды. В микроархитектуре Mic-2 во время первой и третьей частей каждого цикла АЛУ простаивает. Если разделить тракт данных на три части, то появляется возможность использовать АЛУ в каждом цикле, вследствие чего производительность машины увеличивается втрое.
А теперь посмотрим, как работает тракт данных Mic-З. Однако сначала нужно как-то назвать защелки. Проще всего назвать защелки А, В и С и считать их регистрами, подразумевая ограничения тракта данных. В табл. 4.9 приведен фрагмент программы для микроархитектуры Mic-2 (реализация команды SWAP).
Микрокоманда |
Операции |
Комментарий |
swapl |
MAR = SP - 1; rd |
Чтение второго слова из стека; установка MAR на SP |
swap2 |
MAR = SP |
Подготовка к записи нового второго слова |
swap3 |
H = MDR; wr |
Сохранение нового значения TOS; запись второго слова в стек |
swap4 |
MDR = TOS |
Копирование старого значения TOS в регистр MDR |
swap5 |
MAR = SP - 1; wr |
Запись старого значения TOS на второе место в стеке |
swap6 |
TOS = H; goto (MBR1) |
Обновление TOS |
Давайте перепишем эту последовательность для Mic-З. Следует помнить, что теперь тракт данных работает три цикла: один служит для загрузки регистров А и В, второй — для выполнения операции и загрузки регистра С, третий — для записи результатов в регистры. Каждый из этих циклов мы назовем микрошагом.
Реализация команды SWAP для Mic-З показана в табл. 4.10. В цикле 1 мы начинаем микрокоманду swapl, копируя значение SP в регистр В. Не имеет никакого значения, что происходит в регистре А, поскольку, чтобы отнять 1 из В, ENA (сигнал разрешения А) блокируется (см. табл. 4.1). Для простоты мы не показываем присваивания, которые не используются. В цикле 2 мы производим операцию вычитания. В цикле 3 результат сохраняется в регистре MAR, и после этого, в конце третьего цикла, начинается процесс чтения. Поскольку чтение из памяти занимает один цикл, закончится он только в конце четвертого цикла. Это показано присваиванием значения регистру MDR в цикле 4. Значение из MDR можно считывать не раньше пятого цикла.
|
Swapl |
Swap2 |
Swap3 |
Swap4 |
Swap5 |
Swap6 |
Цикл |
MAR = SP - 1; rd |
MAR = SP |
H = MDR; wr |
MDR = TOS |
MAR = SP - 1; wr |
TOS = H; goto (MBR1) |
1 |
В = SP |
|
|
|
|
|
2 |
0 и го 1 |
В = SP |
|
|
|
|
3 |
MAR = С; rd |
С = В |
|
|
|
|
4 |
MDR = Mem |
MAR = С |
|
|
|
|
5 |
|
|
В = MDR |
|
|
|
6 |
|
|
С = В |
B = TOS |
|
|
7 |
|
|
H = С; wr |
C = B |
В = SP |
|
8 |
|
|
Mem = MDR |
MDR = С |
0 II го 1 |
В = H |
9 |
|
|
|
|
MAR = C; wr |
C=B |
10 |
|
|
|
|
Mem = MDR |
TOS = C |
11 |
|
|
|
|
|
goto (MBR1) |