zabika.ru 1

Фамилия: Свиридов В.


Группа: 8201
Программа: вариант №1, вычисление числа π через ряд Лейбница.
Исходный код:


  1. #include

  2. #include



  3. struct timeval tv1,tv2,dtv;



  4. struct timezone tz;



  5. void time_start() { gettimeofday(&tv1, &tz); }



  6. long time_stop() {

  7. gettimeofday(&tv2, &tz);



  8. dtv.tv_sec= tv2.tv_sec -tv1.tv_sec;



  9. dtv.tv_usec=tv2.tv_usec-tv1.tv_usec;



  10. if(dtv.tv_usec<0) { dtv.tv_sec--; dtv.tv_usec+=1000000; }

  11. return dtv.tv_sec*1000+dtv.tv_usec/1000;

  12. }





  13. int main()

  14. {

  15. long i, j;

  16. float res;



  17. i = 112358; // just for

  18. j = 1491625; // fun



  19. res = 4;



  20. time_start();

  21. for(i=1, j=1;i<100000000;i++)

  22. {

  23. j*=-1;

  24. res += j*4.0/(2*i+1);

  25. }

  26. printf("Время выполнения: %ld \n pi = %f\n", time_stop(),res);

  27. return 0;

  28. }


Результаты:


icc keys

Description

-O0

Обращений в память:

~14 * n

Переменные и регистры:

ebp хранит адрес начала локальных переменных.

eax используются в качестве основного регистра для счетчика цикла, вычисления простых целочисленных коэффицентов (например, i = 2i + 1; и j *= -1;).


«Промежуточные» переменные помещаются не в регистры, а обратно в стековую память.

Для операций с плавающей точкой выполняются в x87 FPU.


-O1

Обращений в память:

~13 * n/3

Переменные и регистры:

esp хранит адрес для обращения к локальным переменным.

3 пользовательских регистра (ecx, edx, eax) отведены под хранение последовательности нечетных чисел (вычисляются с каждой новой итерацией).

Результат вычислений накапливается в стеке FPU.

Роль счетчика цикла выполняет один из регистров с нечетным числом.

Дополнительные изменения:

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

-O2

Совпадает с предыдущим, т.к. icc.

-O3

Разницы нет, строка в строку повторение -O1

-O3 -march=
pentiumiii

Обращений в память:

~ 23 * n / 3

Переменные и регистры:

Адресация стека через esp. Пользовательские регистры (esi, ecx, edi, eax) используются под хранение счетчика и последовательности нечетных чисел, вычисляемых в цикле итеративно.

Дополнительные изменения:


Использование XMM