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

4.8.9 Машинно-зависимые методы оптимизации

Машинно-зависимые методы оптимизации ориентированы на конкретную архи­тектуру целевой вычислительной системы, на которой будет выполняться ре­зультирующая программа. Как правило, каждый компилятор ориентирован на одну определенную архитектуру целевой вычислительной системы. Иногда воз­можно в настройках компилятора явно указать одну из допустимых целевых ар­хитектур. В любом случае результирующая программа всегда порождается длячетко заданной целевой архитектуры.

Архитектура вычислительной системы есть представление аппаратной и програм­мной составляющих частей системы и взаимосвязи между ними с точки зрения системы как единого целого. Понятие «архитектура» включает в себя особенно­сти и аппаратных, и программных средств целевой вычислительной системы. При выполнении машинно-зависимой оптимизации компилятор может прини­мать во внимание те или иные её составляющие. То, какие конкретно особенно­сти архитектуры будут приняты во внимание, зависит от реализации компилято­ра и определяется его разработчиками.

4.8.9.1 Распределение регистров процессора

Процессоры, на базе которых строятся современные вычислительные системы, имеют, как правило, несколько программно-доступных регистров. Часть из нихможет быть предназначена для выполнения каких-либо определенных целей (на­пример, регистр — указатель стека или регистр — счетчик команд), другие могут быть использованы практически произвольным образом при выполнении раз­личных операций (так называемые «регистры общего назначения»).

Использование регистров общего назначения для хранения значений операндов и результатов вычислений позволяет добиться увеличения быстродействия про­граммы, так как действия над регистрами процессора всегда выполняются быст­рее, чем над ячейками памяти. Кроме того, в ряде процессоров не все операции могут быть выполнены над ячейками памяти, а потому часто требуется предва­рительная загрузка операнда в регистр. Результат выполнения операции чаще всего тоже оказывается в регистре, и если необходимо, его надо выгрузить (запи­сать) в ячейку памяти.

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

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]