ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12174
Скачиваний: 10

Примеры микроархитектурного уровня
323
Общий обзор системы picoJava II
Диаграмма микроархитектуры picoJava II представлена на рис. 4.36. Микросхема
процессора содержит разделенную кэш-память первого уровня. Кэш-память ко-
манд факультативна. Ее объем может составлять 1 Кбайт, 2 Кбайт, 4 Кбайт, 8 Кбайт
или 16 Кбайт. Это кэш-память прямого отображения. Размер строки составляет
16 байтов. Кэш-память данных тоже факультативна, и ее объем может составлять
1 Кбайт, 2 Кбайт, 4 Кбайт, 8 Кбайт или 16 Кбайт. Это двувходовая ассоциативная
кэш-память. Размер строки также составляет 16 байтов. Она использует обратную
запись и заполнение по записи. Каждая кэш-память соединяется с шиной памяти
по 32-битному каналу. Система microjava 701 имеет оба блока кэш-памяти в обя-
зательном порядке, объем каждого из них составляет 16 Кбайт. Факультативный
блок с плавающей точкой также является частью разработки picoJava II.
Интерфейс памяти и устройств ввода-вывода
-
' 3 2
'
Кэш-память
команд
(0-16 Кбайт)
Блок
с упре;
декодк
и свер
' 3 2
•
выборки
«дением,
рования
тывания
Блок управления
выполнением
команд
•
'
32
Кэш-память
данных
(0-16 Кбайт)
•
' 32
Блок целых
чисел и чисел
с плавающей
точкой
f
i
' 3 x 3 2
' 2 x 3 2
64 32-битных регистра для хранения
верхних 64 слов стека
Рис. 4.36.
Диаграмма системы picoJava II с кэш-памятью первого уровня и блоком
с плавающей точкой. Это конфигурация системы microJava 701
Кэш-память команд передает в блок вызова, декодирования и свертывания
по 8 байтов за раз. Этот блок, в свою очередь, связан с контроллером выполнения
и с основным трактом данных (блоком операций с целыми числами и с плаваю-
щей точкой). Ширина тракта данных составляет 32 бита для целочисленных опе-
раций. Этот тракт данных может также управляться с плавающей точкой с оди-
нарной и двойной точностью (IEEE 754).
Наиболее интересная часть рис. 4.36 — это регистровый файл, состоящий из 64
32-битных регистров. В этих регистрах могут содержаться верхние 64 слова стека
JVM, что сильно повышает скорость доступа к словам в стеке. И стек операндов,

324
Глава 4. Микроархитектурный уровень
и стек локальных переменных под ним могут находиться в регистровом файле,
Доступ к регистровому файлу «свободный» (то есть происходит без задержек, тогда
как доступ к кэш-памяти данных требует дополнительного цикла). Ширина канала
между регистровым файлом и блоком операций с целыми числами и с плавающей
точкой составляет 96 битов. За один цикл канал выдерживает 2 32-битных считы-
вания из стека и одну 32-битную запись в стек.
Если, например, стек операндов состоит из двух слов, то в регистровом файле
может находиться до 62 слов локальных переменных. Естественно, при помеще-
нии еще одного слова в стек возникает проблема. Происходит так называемый
дрибб-
линг
— это когда одно или несколько слов, находящихся глубоко в стеке, записы-
ваются обратно в память. Точно так же, если несколько слов выталкиваются из стека
операндов, в регистровом файле освобождается место, и поэтому некоторые слова,
находящиеся глубоко в стеке, могут перезагружаться в регистровый файл. Специ-
альные регистры на микросхеме определяют, насколько полным должен быть ре-
гистр, чтобы слова из нижней части стека записывались в память, и насколько пу-
стым он может быть для того, чтобы перезагрузить регистровый файл из памяти.
Чтобы легко произвести дрибблинг без копирования, регистровый файл действу-
ет как кольцевой буфер с указателями на самое нижнее и на самое верхнее слова.
Дрибблинг происходит автоматически всякий раз, когда регистровый файл пере-
полняется или пустеет.
Конвейер системы picoJava И
Конвейер системы picoJava II состоит из шести стадий. Он показан на рис. 4.37.
На первой стадии из кэш-памяти команд в буфер команд вызываются команды по
8 байтов за раз. Емкость буфера команд составляет 16 байтов. На следующей ста-
дии команды декодируются и определенным образом объединяются. На выходе
из блока декодирования получается последовательность микроопераций, каждая
из которых содержит код операции и три номера регистров (двух входных и одно-
го выходного регистров). В этом отношении машина picoJava II сходна с Pentium II:
обе машины получают поток команд CISC, который превращается в последователь-
ность микроопераций RISC. Однако, в отличие от Pentium II, машина picoJava II не
является суперскалярной и микрооперации выполняются и завершаются в том
порядке, в котором они запускаются. В случае промаха кэш-памяти, если операнд
приходится вызывать из основной памяти, процессор должен простаивать.
Выборка из
кэш-памяти
команд
—»-
Декодирование
и свертывание
Вызов
операндов
из стека
Выполнение
команд
—*-
Доступ
к данным
кэш-памяти
Запись
результатов
в стек
Рис. 4.37. Шесть стадий конвейера в машине picoJava II
На третьей стадии вызываются операнды из стека (фактически из регистрово-
го файла), чтобы они были в наличии для четвертой стадии. Четвертая стадия —
это блок выполнения команд. На пятой стадии в случае необходимости произво-
дится обращение к кэш-памяти данных (например, чтобы сохранить там результа-
ты). Наконец, на шестой стадии результаты записываются обратно в стек.

Примеры микроархитектурного уровня
325
Свертывание команд
Как мы упоминали выше, блок декодирования способен свертывать команды вме-
сте. Чтобы объяснить, как происходит этот процесс, рассмотрим следующее выра-
жение:
Трансляция на (I)JVM может быть следующей:
ILOAD 7
IL0AD 1
IADD
ISTORE 3,
Предполагается, что k, m и п — локальные переменные 7,1 и 3 соответственно.
Процесс выполнения этих четырех команд изображен на рис. 4,38,
а.
SP-
в
7
6
5
4
2
1
0
Без свертывания
S P - *
SP
к
п
m
—
*-
к
к
п
m
m
к
к
п
m
Со свертыванием
k + m
к
п
m
к
k+m
m
к
п
m
к
k + m
m
Начало
После
После
После
После
выполнения выполнения выполнения выполнения
команды команды команды команды
ILOAD k ILOAD m IADD ISTORE n
Начало После
выполнения
свертывания
команды
Рис. 4.38. Выполнение последовательности из четырех команд для вычисления выражения
n=k+m (а); та же последовательность, свернутая до одной команды (б)
Если предположить, что все три переменные находятся достаточно высоко в сте-
ке, настолько высоко, что все они содержатся в регистровом файле, то для выпол-
нения этой последовательности команд вообще не требуются обращения к памя-
ти. Первая команда ILOAD 7 копирует слово, находящееся в седьмой локальной
переменной, в вершину стека и увеличивает указатель стека на 1. Сходным обра-
зом команда ILOAD 1 производит копирование из регистра в регистр. Команда IADD
складывает два регистра, а команда ISTORE копирует значение регистра в регистро-
вый файл. Избавление от любых обращений к памяти — главный способ улучше-
ния производительности.
Однако машина picojava II делает не только это. Данная последовательность
из четырех команд просто складывает два регистра и сохраняет полученное значе-
ние в третьем регистре. Блок декодирования определяет это условие и запускает
одну микрооперацию: трехрегистровую команду ADD. Таким образом, вместо четы-
рех команд JVM, для которых требуется 9 обращений к памяти, мы получаем одну

3 2 6
Глава 4. Микроархитектурный уровень
микрооперацию для сложения, как показано на рис. 4.38,
6.
И хотя на входе в кон-
вейер были команды CISC с многочисленными обращениями к памяти, в резуль-
тате выполнена была всего одна простая микрооперация. Таким образом, picojava II
может выполнять программы на языке Java, скомпилированные для JVM, так же
быстро, как будто они были скомпилированы на машинный язык компьютера RISC.
Как мы только что увидели, возможность сворачивать несколько команд JVM
в одну микрооперацию является ключом к высокой производительности. Следо-
вательно, стоит кратко изложить, как блок декодирования осуществляет сверты-
вание. Для этого команды распределяются по шести группам (табл. 4.14). Первая
группа содержит команды, которые не сворачиваются. Во второй находятся ко-
манды загрузки локальных переменных. ВIJVM имеется одна такая команда, ILOAD,
a JVM содержит и другие команды. Третья группа состоит из команд запомина-
ния, например ISTORE. Четвертая и пятая группы предназначены для команд пере-
ходов с одним и двумя операндами соответственно. Последняя группа состоит
из команд, которые выталкивают два операнда из стека, выполняют с ними какие-
нибудь вычисления и помещают результат обратно в стек.
Таблица 4.14.
Распределение команд JVM по группам для свертывания
Группа Описание
^~-
Пример
NF Несвертываемые команды GOTO
LV Помещают слово в стек ILOAD
MEM Выталкивают слово из стека ISTORE
BG1
Операции с использованием одного стекового операнда IFEQ
BG2
Операции с использованием двух стековых операндов IF^CMPEQ
OP Вычисления над двумя операндами с одним результатом IADD
Блок декодирования передает 74-битные микрооперации операционному бло-
ку (через блок вызова операндов). Большинство этих микроопераций содержат
код операции и три регистра и могут быть выполнены за один цикл. Когда блок
декодирования выталкивает команды JVM из буфера команд, он превращает их
в последовательность микроопераций. Кроме того, блок декодирования определяет,
какие последовательности команд JVM можно свернуть в одну микрооперацию.
В такой последовательности может быть до четырех команд. Если обнаружена под-
ходящая последовательность, выдается соответствующая микрооперация, а изна-
чальные команды отбрасываются.
В табл. 4.15 приведены некоторые типичные последовательности команд JVM,
которые можно свернуть. Когда в блоке декодирования оказывается одна из таких
последовательностей, он замещает обычное разбиение команд на одну микроопе-
рацию, которая выполняет работу всей этой последовательности за один цикл.
Например, он превращает последовательность из четырех команд в одну трех-
регистровую микрооперацию ADD, как мы видели на рис. 4.38. Процесс свертыва-
ния происходит только тогда, когда требуемые локальные переменные находятся
достаточно близко от вершины стека, то есть содержатся в регистровом файле.

Примеры микроархитектурного уровня
327
LV
LV
LV
LV
LV
LV
ОР
LV
LV
LV
BG1
BG2
MEM
MEM
OP
OP
BG2
Таблица 4.15.
Некоторые последовательности команд JVM, которые
можно сворачивать
Последовательность команд Пример
MEM ILOAD, ILOAD, IADD, ISTORE
ILOAD, ILOAD, IADD
ILOAD, ILOAD, IF_CMPEQ
ILOAD, IFEQ
ILOAD, IF_CMPEQ
ILOAD, ISTORE
IADD, ISTORE
Свертывание команд происходит довольно часто, поэтому существенная часть
программы JVM может быть выполнена настолько быстро, как будто она была ском-
пилирована прямо для конвейеризированного процессора RISC. Измерения пока-
зывают, что picojava II может выполнять программы на языке Java в пять раз быс-
трее, чем если те же программы скомпилировать на машинный язык для Pentium,
который работает с такой же тактовой частотой, и в 15 раз быстрее, чем при интер-
претируемом выполнении той же программы на машине Pentium.
В машине picojava II используется чрезвычайно примитивный алгоритм про-
гнозирования ветвлений: она всегда предсказывает, что перехода не будет. За этим
стоит идея сохранить микросхему простой и дешевой, а не тратить существенное
пространство микросхемы на схемы прогнозирования. Однако благодаря длине
конвейера (6 стадий вместо 12, как в системе Pentium II) проигрыш при непра-
эдшдкил предсказании перехода составляет всего три цикла.
Сравнение Pentium, UltraSPARC и picojava
Данные три примера во многом отличаются друг от друга, однако у них есть уди-
вительная общность, которая может сказать кое-что о том, как лучше разрабаты-
вать компьютер. Машина Pentium II содержит старый набор команд CISC, кото-
рый инженеры компании Intel были бы рады выкинуть в бухту Сан-Франциско,
но тогда они нарушили бы законы о загрязнении воды. UltraSPARC II — система
RISC. Picojava II — машина со стековой организацией и командами различной
длины, которые совершают огромное число обращений к памяти. '
Несмотря на эти различия, все три машины имеют сходные функциональные
блоки. Все функциональные блоки принимают микрооперации, которые содержат
код операции, два входных регистра и один выходной регистр. Все они могут вы-
полнять микрооперацию за один цикл. Все они конвейеризированы и применяют
прогнозирование ветвления. Все они содержат разделенную кэш-память для ко-
манд и для данных, объем каждой составляет 16 Кбайт.
Такое внутреннее сходство не случайно, и причиной его является вовсе не по-
стоянные переходы с одной работы на другую инженеров Силиконовой долины.
Когда мы рассматривали микроархитектуры Mic-З и Mic-4, мы увидели, что до-
статочно просто построить конвейеризированный тракт данных, который исполь-