Работа с компилятором GCC в командной строке.Урок 1.
Цель
Приобрести практические навыки работы с компилятором GCC командной строки. Исследовать различные опции компилятора для оптимизации программы. Определить их влияние на скорость работы программы и точность вычислений.
Кстати, на сайте читать удобнее
Исходные данные
• Количество итераций: N=100000, 1000000, 10000000, 100000000
• Опции компилятора: -Е, -S, -c, -o, -shared, -O0, -O1, -O2, -O3, -ffast-math, -msse, -mfpmath=sse, -mfpmath=387
Используемые строки для компиляции
• Создание файла с исходным текстом на языке С, после прохождения стадии обработки препроцессором: GCC –E app.c –o app.i
• Создание файла с исходным текстом на языке ASSEMBLER: GCC –S app.c –o app.s
• Создание объектного файла: GCC –o app.c –o app.o
• Создание библиотеки: GCC -shared app.c –o app.dll –lm
• Cоздание исполнимого файла с различными опциями оптимищации:
GCC –s –O0 app.c –o app.exe –lm
GCC –s –O2 app.c –o app.exe –lm
GCC –s –O3 –mfpmath=387 app.c –o app.exe –lm
GCC –s –O3 –ffast-math app.c –o app.exe –lm
GCC –s –O3 –ffast-math –mfpmath=sse -msse app.c –o app.exe –lm
Фрагменты содержимого файлов app.i
Фрагменты содержимого файлов app.s
Измерение времени исполнения программы
Точность аппроксимации числа PI
Строка компиляции программы: GCC –s –O2 app.c –o app.exe –lm
Вывод:
В результате проведенных опытов можно понять, что программа с опцией O0 работает в разы медленнее, чем программа с опцией O3. А вот с точность при вычислении числа PI всё гораздо сложнее. Итерация равная 1000000 имеет более точный ответ при вычислении числа PI, так ещё самую малую разность в расчетах. В отличие от итерации с 100000000 , которая имеет самый долгий алгоритм работы, да ещё и погрешность в вычислениях не самая маленькая.
Исходный текст программы
Файл app.c
#include
#include
#include
#include
#define N 10000000
int main(int argc, char **argv)
{
const clock_t t0 = clock();
int n=0;
int i;
for(i=0; i
{
const float r=(float)rand() / (float) RAND_MAX;
const float x=(float)rand() / (float) RAND_MAX;
const float y=(float)rand() / (float) RAND_MAX;
if(sqrtf(powf(x*r, 2.0f) + powf(y*r, 2.0f)) <=r) n++;
}
const float pi = (float) n / (float) N*4.0f;
const float err = fabsf(pi - M_PI);
const clock_t t1 = clock();
const float t = (float)(t1 - t0) / (float)CLOCKS_PER_SEC;
printf("result: %f, delta: %f, iterations: %d, time: %f sec.\n", pi, err, N, t);
getchar(); // Для остановки приложение при запуске через проводник
return EXIT_SUCCESS;
}