Организация ЭВМ и систем: Курс лекций (Позиционные системы счисления. Процессоры семейства IA-32. Лазерные принтеры), страница 29

Архитектура такой структуры называется суперскалярной архитектурой. Этот термин появился в 1987 году, но архитектура использовалась уже в 1964 г. в ЭВМ CDC 6600. В этой ЭВМ каждые 100 нс из памяти вызывалась одна команда и помещалась в один из десяти функциональных блоков для параллельного выполнения.

10.1.3. Предсказание ветвлений

Современные процессоры сильно конвейеризованы. Рассмотренная ранее схема имела пять стадий, но в действительности их может быть свыше десяти.

Конвейеры без проблем справляются с линейным кодом. Но любой переход создаёт принципиальные трудности.

На первый взгляд может показаться, что безусловные переходы не влекут проблем, ибо в любой момент можно точно предсказать, куда будет передано управление. Но достаточно вспомнить, что декодирование команд выполняется не на первой стадии, и блок выборки команд должен будет выбрать очередную команду ещё до того, как процессор «поймёт», что он получил команду безусловного перехода. Многие конвейеризованные процессоры (например, UltraSPARC II) после получения команды перехода до её выполнения продолжают обрабатывать команды, следующие за командой условного перехода. Оптимизирующие трансляторы посему пытаются переупорядочить команды так, чтобы после команды условного перехода стояла команда, результат которой потребуется в ближайшем будущем.

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

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

На следующем этапе появился такой алгоритм: предполагается, что все условные переходы назад будут осуществляться, а все условные переходы вперёд — нет.

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

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

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

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

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

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