logo search
Методичка

6.4 Предварительная выборка команд и предсказание переходов

Основная идея, определяющая развитие суперскалярных микропроцессоров, состоит в построении микропроцессоров с как можно большим количеством функциональных устройств при сохранении традиционных последовательных программ. Это означает, что компиляторы и аппаратура микропроцессора сами, без вмешательства программиста, обеспечивают загрузку параллельно работающих функциональных устройств микропроцессора.

Типовая архитектура суперскалярного микропроцессора представлена на рис. 6.3. В число основных блоков суперскалярного микропроцессора входят: блок выборки команд и предсказания переходов, блок декодирования команд, анализа зависимостей между командами, переименования и диспетчеризации, блоки регистров и обрабатывающих устройств с плавающей и фиксированной точками, блок управления памятью, а также блок упорядочения выполненных команд.

Поскольку при суперскалярной обработке необходимо извлекать из памяти несколько команд за один такт для загрузки параллельно работающих функциональных модулей, повышенные требования предъявляются к пропускной способности интерфейса микропроцессор-память. В современных микропроцессорах применяются многоуровневые раздельные типы кэш-памяти данных и команд.

Серьезную проблему для эффективной загрузки функциональных устройств представляют команды ветвления. Если требуется осуществить смену значения счетчика команд, то необходим, по крайней мере, один такт для распознавания команды ветвления, модификации счетчика команд и выборки команды по заданному значению счетчика команд. Эти задержки вызывают пустые такты в конвейерах процессора.

Для предотвращения появления пустых тактов возможно использование "отложенных переходов", когда после команды ветвления одна или несколько команд выполняются безусловно.

Более сложные решения используют:

При предсказании переходов, не дожидаясь определения команды, на которую должен быть сделан переход, начинается выборка и исполнение команд по предсказанному направлению перехода или условное исполнение команд. В случае ошибки предсказания необходимо уничтожить все результаты работы неверно выбранных команд. Количество потерянных при этом тактов процессора зависит от глубины конвейеров функциональных устройств и их числа. В современных микропроцессорах число теряемых в результате неверного предсказания тактов может быть несколько сотен. Кроме того, объем аппаратных средств, используемых для устранения последствий неправильных предсказаний, достаточно велик и может негативно влиять на повышение тактовой частоты микропроцессора.

Изменение порядка следования команд имеет целью загрузить работой простаивающие функциональные устройства при выхватывании из потока тех команд, для которых имеются готовые операнды и свободные устройства для их исполнения. Однако при этом должны исследоваться зависимости между командами по регистровым и другим используемым ресурсам. Определение отсутствия зависимости должно делаться быстро, т.к. иначе теряется смысл изменения порядка выполнения команд.

Для оптимизации исполняемого программного кода может быть применена кэш-память трасс. Эта память отображает команды, выбираемые из кэш-памяти команд микропроцессора, в физически непрерывную область памяти команд. Поток команд, заполняющих кэш-память трасс, подвергается оптимизации с целью повышения эффективности исполнения уже выполненной трассы команд при повторных ее выборках. Трасса оптимизируется на фоне исполнения ее команд процессором.

Для уменьшения потерь процессорных тактов, связанных с промахами при обращении к кэш-памяти в случае выполнения команд ветвления, в состав системы кэширования вводятся средства предсказания переходов, основное назначение которых – повысить вероятность наличия в кэш-памяти требуемой команды.

Исполнение условных переходов состоит из следующих этапов:

На каждом этапе используются специальные приемы повышения производительности.

Этап 1. Для быстрого декодирования используются либо дополнительные биты в поле команды, либо преддекодирование команд при выборе из кэш-памяти команд.

Этап 2. Часто, когда команда уже выбрана из кэш-памяти, условие перехода еще не вычислено. Чтобы не задерживать поток команд, в данном случае используется предсказание перехода по одной из нескольких возможных схем. Некоторые предсказатели используют статическую информацию из двоичного кода программы или специально выработанную компилятором. Например, определенные коды операций чаще вырабатывают ветвление, чем другие коды, или ветвление более вероятно (при организации циклов), или компилятор может устанавливать флаг, указывающий направления перехода. Может также использоваться статистическая информация, полученная при трассировке программы.

Другие предсказатели используют динамически формируемую информацию в процессе исполнения программы. Обычно это информация, касающаяся истории выполнения данного ветвления, сохраняемая в таблице ветвлений или в таблице предсказаний ветвлений. Таблица предсказания ветвлений организуется по ассоциативному принципу, подобно кэш-памяти, ее элементы доступны по адресу команды, ветвление которой предсказывается. В некоторых реализациях элемент таблицы предсказания ветвления является счетчиком, значение которого увеличивается при правильном предсказании и уменьшается при неправильном. При этом значение счетчика определяет преобладающее направление ветвлений.

В момент определения действительного значения условия ветвления вносится изменение в историю ветвления. Если предсказание было неверным, то должна инициироваться выборка правильных команд. Результаты команд, которые были условно выполнены, должны быть аннулированы.

Этап 3. Для определения адреса ветвления обычно требуется выполнить целочисленное сложение, прибавляющее к текущему значению счетчика команд смещение, заданное в поле команды ветвления. И хотя это не требует дополнительных тактов для обращения к регистрам, ускорение вычисления адреса может быть достигнуто благодаря использованию буфера, содержащего ранее использованные адреса переходов.