
4.3.2. Прогнозирование ветвления
Вторая технология усовершенствования реализации называется прогнозированием ветвления. Как говорилось выше, современные компьютеры сильно конвейеризированы. Для обеспечения работы конвейеров процессору (блоку выборки команд) приходится считывать из памяти команды асинхронно, не дожидаясь выполнения каждой команды. Удобнее всего работать с линейным кодом, в этом случае из памяти просто считываются последовательные слова. Однако программы часто содержат команды перехода (в том числе условного), что делает линейное считывание менее эффективным. До выполнения текущей команды неизвестно, какая команда выполнится после нее. Поэтому неизвестно, какую команду считывать следующей. В ранних машинах в такой ситуации конвейер простаивал. В современных компьютерах применяется прогнозирование условных переходов. Например, можно предполагать, что все условные переходы назад будут осуществляться, а переходы вперед – нет. Это может срабатывать в большинстве случаев, т.к. команда условного перехода назад часто помещается в конце цикла. Очевидно, что при этом возможна определенная часть неверных предсказаний. При верном предсказании программа продолжает выполнение. При неверном – возникает проблема отмены команд, которые были выполнены конвейером неправомерно. Для этого при сохранении результатов часто используются скрытые регистры, содержимое которых копируется в обычные регистры только после подтверждения правомерности выполненных команд. В связи со сказанным возникает потребность в повышении точности прогнозов ветвлений.
Динамическое прогнозирование ветвления производится во время выполнения программы. Для этого часто используется специальная таблица, в которую помещается информация о срабатывании условных переходов. Прогноз состоит в том, что программа пойдет тем же путем, которым пошла в предыдущий раз. Существуют и другие методы прогнозирования динамики ветвлений. Все они приспосабливаются к текущему поведению программы и требуют дополнительной дорогостоящей аппаратуры.
Статическое прогнозирование ветвления осуществляется компилятором. В частности, только он точно знает об используемых в программе управляющих структурах (в частности, циклах) и может передать эту информацию в программу. Иногда для этой цели используется архитектурная поддержка (в UltraSPARC II имеется набор команд условного перехода с дополнительным битом). Еще один статический метод прогнозирования состоит в профилировании – предварительном выполнении программы с фиксацией ветвлений, информация о которых передается компилятору, который затем выдает специальные команды условного перехода.
4.3.3. Выполнение с изменением последовательности и подмена регистров
Выполняемая программа состоит из отдельных команд. Команды часто находятся во взаимозависимости. Например, одни команды могут использовать результаты выполнения других команд. Чтобы достичь лучшей производительности, некоторые процессоры пропускают взаимозависимые команды и переходят к выполнению независимых команд. Таким образом гарантируется актуальность предварительной выборки, но последовательность выполнения команд отличается от запрограммированной. При этом, очевидно, переупорядочивание команд не должно изменять результаты их естественного выполнения. Для этого требуется исследование видов взаимозависимости команд.
Их можно выделить три:
-
RAW (Read After Write) – операнд очередной команды является результатом предыдущей команды;
-
WAR (Write After Read) – предыдущая команда должна завершить считывание регистра до того как следующая его перезапишет;
-
WAW (Write After Write) – очередная команда должна записать результат в регистр после того как предыдущая команда запишет этот же регистр.
Очевидно, что технология изменения последовательности команд более эффективна для программ с меньшей взаимозависимостью команд. Ее можно уменьшить искусственными методами. Одним из них является подмена регистров. Современные процессоры содержат десятки скрытых регистров, используемых для записи промежуточных результатов. Замена обычных регистров скрытыми во многих случаях позволяет устранить WAR- и WAW-взаимозависимости команд.