Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по ВС.doc
Скачиваний:
268
Добавлен:
22.03.2016
Размер:
1.1 Mб
Скачать

Переименование регистров

Сколько бы команд одновременно ни был способен выполнять процессор, т.е. сколько бы в нем ни было конвейеров, он никогда не будет загружен полностью. Это связано с тем, что некоторые операции просто нельзя выполнить до получения результатов предыдущих. Например, если мы хотим вычислить значение выражения (b/2 – d), то одновременно произвести операции деления и вычитания нам не удастся, так как результат операции деления (из которого производится вычитание) неизвестен заранее. Такая ситуация носит название истинной взаимозависимости данных и означает, что входные данные для операции вычитания определяются в результате другой операции, в нашем случае операции деления. Повысить производительность обработки при истинных взаимозависимостях данных путем одновременного исполнения двух операций невозможно.

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

Пусть необходимо выполнить три команды: первая команда имеет большую длительность исполнения (например, команда умножения), вторая команда сложения или сдвига – короткая, а третья команда опять длинная. В качестве исходных данных вторая команда должна использовать результат, получаемый от первой команды. Если команды выполняются на нескольких конвейерах неупорядоченно, то возможен случай, когда вторая команда (в нашем случае сложения) будет завершена до окончания первой, т.е. она использовала прежнее содержимое регистра, в который должен быть помещен результат выполнения первой команды.

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

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

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

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

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