Исследование оптимизаций, выполняемых компилятором
Краткое сожержание материала:
Размещено на
3
Министерство образования и науки Российской Федерации
Санкт-Петербургский государственный политехнический университет
Факультет технической кибернетики
Кафедра «Информационная безопасность компьютерных систем»
ЛАБОРАТОРНАЯ РАБОТА № 1
Исследование оптимизаций, выполняемых компилятором
по дисциплине «Языки программирования»
Выполнил
студент гр. 2088/1
А.В. Лашевский
Старший
Преподаватель
П.В. Семьянов
Санкт-Петербург 2012
Содержание
1. Формулировка задания
2. Постановка задачи
3. Результаты выполненной работы
3.1. Компилятор
3.2 Ассемблерный листинг:
3.3 Примеры наиболее удачных и неудачных оптимизаций
3.4 Подбор опций компилятора
4. Выводы по проделанной работе
1. Формулировка задания
Исследовать методы оптимизации кода на языке Си с помощью одного из компиляторов. Использовать для тестирования утилиту optbench.c
Исследовать особенности оптимизации компилятора на собственной программе.
компилятор программный код утилита
2. Постановка задачи
Выбрать один из предлагаемых компиляторов:
Microsoft Visual Studio 2010
GCC
Intel C++ Compiler
Исследовать различные варианты оптимизаций для выбранного компилятора с помощью optbench.c, составить таблицу о проведенных улучшениях.
Привести примеры наиболее удачных и неудачных оптимизаций.
Подобрать опции компилятора для получения:
наиболее быстрого кода
наиболее компактного кода
3. Результаты выполненной работы
3.1 Компилятор
Для изучения оптимизации кода, написанного на языке С (optbench.c), был выбран компилятор GCC-4.4.3, работающий под операционной системой Linux Ubuntu v10.04.
3.2 Ассемблерный листинг
Чтобы получить ассемблерный код программы optbench.c, который находится в домашней директории, используем команду: gcc -S optbench.c
В результате в домашней папке был создан файл optbench.s, содержащий ассемблерный листинг неоптимизированной программы.
Для получения ассемблерного кода с оптимизациями использовалась команда: gcc -S -O2 optbench.c
Таблица 1. Оптимизации компилятора
Исходный текст на Си |
Неоптимизированный код на ассемблере |
Оптимизированный код на ассемблере |
Результаты |
|
Размножение констант и копий |
||||
j4 = 2; if( i2 < j4 && i4 < j4 ) i2 = 2; j4 = k5; if( i2 < j4 && i4 < j4 ) i5 = 3; |
pushl %ebp movl %esp, %ebp andl $-16, %esp subl $48, %esp movl $2, j4 movl i2, %edx movl j4, %eax cmpl %eax, %edx jge .L2 movl i4, %edx movl j4, %eax cmpl %eax, %edx jge .L2 movl $2, i2 .L2: movl k5, %eax movl %eax, j4 movl i2, %edx movl j4, %eax cmpl %eax, %edx jge .L3 movl i4, %edx movl j4, %eax cmpl %eax, %edx jge .L3 movl $3, i5 |
pushl %ebp movl %esp, %ebp andl $-16, %esp subl $28, %esp movl i2, %eax cmpl $1, %eax movl k5, %edx movl %edx, j4 |
Переменные заменяются константными значениями. |
|
Свертка констант |
||||
i3 = 1 + 2; flt_1 = 2.4 + 6.3; i2 = 5; |
L3: movl $3, i3 fldl .LC0 fstpl flt_1 movl $5, i2 |
fldl .LC0 fstpl flt_1 movl $3, i3 movl $5, i2 |
Производится свертка констант (независимо от выбора оптимизации). |
|
Алгебраические тождества и излишние операции загрузки/сохранения |
||||
j2 = i + 0; k2 = i / 1; i4 = i * 1; i5 = i * 0; flt_3 = 2.4 / 1.0; flt_4 = 1.0 + 0.0000001; flt_5 = flt_6 * 0.0; flt_6 = flt_2 * flt_3; |
movl i, %eax movl %eax, j2 movl i, %eax movl %eax, k2 movl i, %eax movl %eax, i4 movl $0, i5 fldl .LC1 fstpl flt_3 fldl .LC2 fstpl flt_4 fldl flt_6 fldz fmulp %st, %st(1) fstpl flt_5 fldl flt_2 fldl flt_3 fmulp %st, %st(1) fstpl flt_6 |
movl i, %eax fldl .LC1 fstl flt_3 fldl .LC2 fstpl flt_4 fldz fmull flt_6 movl %eax, j2 movl %eax, i4 fstpl flt_5 fmull flt_2 movl %eax, k2 fstpl flt_6 |
Исключено многократное помещение переменной i в регистр eax (исключены излишние операции загрузки). Вместо арифметических операций выполняется простое присваивание. |
|
Деление на ноль |
||||
i2 = i / 0; flt_2 = flt_1 / 0.0; |
- |
- |
Компилятор gcc версии 4.4.3 выдает ошибку деления на ноль и не генерирует объектный код. |
|
Лишнее присваивание |
||||
k3 = 1; k3 = 1; |
movl $1, k3 movl $1, k3 |
movl $1, k3 |
Исключается повторное присваивание значения переменной k3. |
|
Снижение мощности |
||||
k2 = 4 * j5; for( i = 0; i <= 5; i++ ) ivector4[ i ] = i * 2; |
movl j5, %eax sall $2, %eax movl %eax, k2 movl $0, i jmp .L4 .L5: movl i, %eax movl i, %edx addl %edx, %edx movw %dx, ivector4(%eax,%eax) movl i, %eax addl $1, %eax movl %eax, i .L4: movl i, %eax cmpl $5, %eax jle .L5 |
movl j5, %eax movl $ivector4, %edx sall $2, %eax movl %eax, k2 xorl %eax, %eax L24: movw %ax, (%edx) addl $2, %eax addl $2, %edx cmpw $12, %ax jne .L24 |
Операция умножения заменяется...
Другие файлы:
Исследование системы контроля в компании "Яр" Автоматизация научных исследований в машиностроении и приборостроении Разработка резидентной программы для сохранения в файле копии текстового экрана дисплея Разработка и исследование технологии геодезического обеспечения строительства и установки технологического оборудования ускорительно-накопительного комплекса (УНК) Airbus A320 Flight Crew Check List. Буклет справочно - технического материала о работах выполняемых в транзитных аэропортах. Ground Handling A319/320 |