Лучшее  🚀
26.09.2014 в 08:48 ★ Макклаус ★

Работа с компилятором 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;

}


Ссылка для скачивание TDM-GCC

Читать далее