Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr3.pdf
Скачиваний:
14
Добавлен:
01.04.2022
Размер:
1.55 Mб
Скачать

Рисунок 20 – Сравнение времени выполнения

Из графика можно сделать вывод: наиболее эффективным методом оптимизации, с точки зрения времени выполнения является уровень O2, а наименее эффективным – O0.

Вывод

Я получила навыки работы с компилятором GCC в компиляции различного

количества файлов и уровней оптимизации, закрепил знания о взаимодействие с

файловой системой Linux Ubuntu, а также научился самостоятельно создавать и

компилировать программу и в дальнейшем тестировать ее работоспособность.

Контрольные вопросы:

1.Каковы главные функции оптимизирующего компилятора?

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

2. Приведите примеры характеристик программы, по которым

осуществляется оптимизация?

Оптимизация

осуществляется по размеру исполняемого файла, а

так же скорости его выполнения и по экономии памяти.

25

3. Какие бывают примеры оптимизирующих преобразований, что

они оптимизируют, в чем их суть?

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

это процесс, который вместо вызова функций производит встраивание их тела в код программы, устраняя расходы на вызов функции и передачу аргументов.

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

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

Если в циклеприсутствуют вычисления, которые не зависят от итерации цикла,

то они выносятся за цикл и тем самым многократно не повторяются.

Перепрыгивание переходов. Если в программе имеется цепочка последовательных переходов, она заменяется на единственный переход, который ведет сразу в окончательный пункт назначения, минуя промежуточные переходы. Устранение несущественных проверок указателей на NULL - если в коде встречается проверка указателя на ноль после обращения по

26

этому адресу, то такая проверка из кода исключается, так как указатель заведомо не нулевой, если исполнение дойдёт до этой точки.

4.Всегда ли оптимизирующая компиляция позволяет уменьшить время работы программы?

Нет, т.к. в некоторых случаях раскрутка циклов может увеличить время выполнения данной программы

5.Чем отличается общая оптимизация от оптимизации под архитектуру?

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

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

6.Какие имеются группы ключей в GCC?

Глобальные настройки, задающие режим работы компилятора

Настройки, специфичные для Си/Си

Настройки сообщений об ошибках и предупреждениях

Настройки отладки

Настройки оптимизации

7.Какие уровни оптимизации есть в GCC, и чем они характеризуются?

O0 почти все оптимизации отключены. Компиляция выполняется

быстрее, чем на любом другом уровне оптимизации

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

O2 включены практически все доступные оптимизации, крометех, что ускоряют вычисления за счет увеличения размера кода.

O3 включены все оптимизации из уровня O2, к ним добавлены оптимизации времени работы программы, которые могут приводить к увеличению размера бинарного исполняемого файла.

Os служит для оптимизации размера программ, в него включено подмножество оптимизаций из уровня O2.

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

Og производит все оптимизации, которые сохраняют возможность просмотра стека вызовов, фрагментов исходного текста программы, относящихся к разным уровням этого стека, и возможность

27

приостановки программы для каждой строки исходного текста, содержащей операторы. Для многих программ не дает выигрыша по скорости в сравнении с предыдущим.

28

Соседние файлы в предмете Системное программирование