Скачиваний:
12
Добавлен:
01.05.2014
Размер:
83.46 Кб
Скачать

Министерство Образования Российской Федерации

Санкт-Петербургский Государственный Электротехнический Университет «ЛЭТИ»

_________________________

кафедра МО ЭВМ

Отчет

по лабораторной работе № 3

вариант 6

Выполнила: Кононова В.М.

гр. 3351

Проверила: Боханова Е.В.

Санкт-Петербург, 2007г.

1. Формулировка задания

1. Ознакомиться с документацией на SAMPLER и выполнить под его

управлением тестовые программы test_cyc.c и test_sub.c c анализом

параметров повторения циклов и проверкой их влияния на точность и

чувствительность профилирования.

2. Скомпилировать и выполнить под управлением SAMPLER'а

программы на Паскале и С, разработанные в 1-ой лабораторной работе.

Выполнить разбиение программы на функциональные участки и снять

профили для двух режимов: 1 - измерение только полного времени

выполения программы; 2 - измерение времен выполнения функциональных

участков.

3. Выявить "узкие места", ввести в программы усовершенствования

и получить новые профили.

Сравнить результаты, полученные для Паскаля и С, с аналогичными

результатами, полученными с помощью Turboprofiler'а.

2. Профилирование программы test_cyc.c

2.1. Текст программы

#define ArSize 10000

#include "Sampler.h"

int i, tmp, dim[ArSize];

void main()

{

SAMPLE;

for(i=0;i<ArSize/10;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/5;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/2;i++){ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize;i++) { tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/10;i++)

{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/5;i++)

{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/2;i++)

{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize;i++)

{ tmp=dim[0]; dim[0]=dim[i]; dim[i]=tmp; };

SAMPLE;

for(i=0;i<ArSize/10;i++)

{ tmp=dim[0];

dim[0]=dim[i];

dim[i]=tmp;

};

SAMPLE;

for(i=0;i<ArSize/5;i++)

{ tmp=dim[0];

dim[0]=dim[i];

dim[i]=tmp;

};

SAMPLE;

for(i=0;i<ArSize/2;i++)

{ tmp=dim[0];

dim[0]=dim[i];

dim[i]=tmp;

};

SAMPLE;

for(i=0;i<ArSize;i++)

{ tmp=dim[0];

dim[0]=dim[i];

dim[i]=tmp;

};

SAMPLE;

}

2.2. Результаты профилирования

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 8 1 : 10 10.90 1 10.90

----------------------------------------------------------------------

1 : 10 1 : 12 22.63 1 22.63

----------------------------------------------------------------------

1 : 12 1 : 14 56.15 1 56.15

----------------------------------------------------------------------

1 : 14 1 : 16 122.36 1 122.36

----------------------------------------------------------------------

1 : 16 1 : 19 11.73 1 11.73

----------------------------------------------------------------------

1 : 19 1 : 22 22.63 1 22.63

----------------------------------------------------------------------

1 : 22 1 : 25 60.34 1 60.34

----------------------------------------------------------------------

1 : 25 1 : 28 119.85 1 119.85

----------------------------------------------------------------------

1 : 28 1 : 34 11.73 1 11.73

----------------------------------------------------------------------

1 : 34 1 : 40 32.69 1 32.69

----------------------------------------------------------------------

1 : 40 1 : 46 57.83 1 57.83

----------------------------------------------------------------------

1 : 46 1 : 52 114.82 1 114.82

----------------------------------------------------------------------

Как видно из полученных результатов профилирования, способ записи циклов не влияет на время их выполнения. Для выполнения циклов, записанных тремя различными способами, получены примерно одинаковые времена выполнения.

3. Профилирование программы test_sub.c

3.1. Текст программы

#include "Sampler.h"

const unsigned Size = 10000;

void TestLoop(int nTimes)

{

static int TestDim[Size];

int tmp;

int iLoop;

while (nTimes > 0)

{

nTimes --;

iLoop = Size;

while (iLoop > 0)

{

iLoop -- ;

tmp = TestDim[0];

TestDim[0] = TestDim[nTimes];

TestDim[nTimes] = tmp;

}

}

} /* TestLoop */

void main()

{

SAMPLE;

TestLoop(Size / 10); // 1000 * 10000 повторений

SAMPLE;

TestLoop(Size / 5); // 2000 * 10000 повторений

SAMPLE;

TestLoop(Size / 2); // 5000 * 10000 повторений

SAMPLE;

TestLoop(Size / 1); // 10000* 10000 повторений

SAMPLE;

}

3.2. Результаты профилирования

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 29 1 : 31 171772.91 1 171772.91

----------------------------------------------------------------------

1 : 31 1 : 33 270949.90 1 270949.90

----------------------------------------------------------------------

1 : 33 1 : 35 654435.21 1 654435.21

----------------------------------------------------------------------

1 : 35 1 : 37 1319906.47 1 1319906.47

----------------------------------------------------------------------

Время выполнения растет примерно пропорционально количеству итераций цикла:

1). 270949.90/171772.90=1.58 (для увеличения числа итераций в 2 раза)

2). 654435.21/270949.90=2.41 (для увеличения числа итераций в 2.5 раза)

3). 1319906.47/654435.21=2.01 (для увеличения числа итераций в 2 раза)

Отличие от ожидаемого результата в п.1 можно объяснить тем, что для меньшего числа итераций точность профилировки меньше.

4. Профилирование программы из ЛР №1

4.1. Профилирование программы на языке С

4.1.1. Текст программы

#include <stdlib.h>

#include <stdio.h>

#include "Sampler.h"

const int Size = 1000;

void swap(float& p, float& q)

{

float hold=p;

p=q;

q=hold;

}

void sort(float* a, int n)

{

int done;

int jump=n,i,j;

while (jump>1)

{

jump/=2;

do

{

done=1;

for (j=0; j<n-jump; ++j)

{

i=j+jump;

if (a[j]>a[i])

{

swap(a[j],a[i]);

done=0;

}

}

}while(!done);

}

}

int main()

{

SAMPLE;

float list[Size];

srand(0);

for(int i=0; i<Size; ++i)

list[i]=rand();

sort(list, Size);

SAMPLE;

return 0;

}

4.1.2. Результат профилирования

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 39 1 : 45 869.11 1 869.11

----------------------------------------------------------------------

4.1.3. Текст программы

1 #include <stdlib.h>

2 #include <stdio.h>

3 #include "Sampler.h"

4

5 const int Size = 1000;

6

7 void swap(float& p, float& q)

8 {

9 SAMPLE;

10 float hold=p;

11 p=q;

12 q=hold;

13 SAMPLE;

14 }

15

16 void sort(float* a, int n)

17 {

18 SAMPLE;

19 int done;

20 int jump=n,i,j;

21 SAMPLE;

22 while (jump>1)

23 {

24 jump/=2;

25 SAMPLE;

26 do

27 {

28 done=1;

29 SAMPLE;

30 for (j=0; j<n-jump; ++j)

31 {

32 i=j+jump;

33 SAMPLE;

34 if (a[j]>a[i])

35 {

36 SAMPLE;

37 swap(a[j],a[i]);

38 SAMPLE;

39 done=0;

40 SAMPLE;

41 }

42 }

43 }while(!done);

44 }

45 SAMPLE;

46 }

47

48 int main()

49 {

50 SAMPLE;

51 float list[Size];

52 srand(0);

53 for(int i=0; i<Size; ++i)

54 list[i]=rand();

55 SAMPLE;

56 sort(list, Size);

57 SAMPLE;

58 return 0;

59 }

4.1.4. Результат профилирования

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

1 : 9 1 : 13 62365.28 7043 8.85

----------------------------------------------------------------------

1 : 13 1 : 38 97416.15 7043 13.83

----------------------------------------------------------------------

1 : 18 1 : 21 0.00 1 0.00

----------------------------------------------------------------------

1 : 21 1 : 25 0.84 1 0.84

----------------------------------------------------------------------

1 : 25 1 : 29 2.51 9 0.28

----------------------------------------------------------------------

1 : 29 1 : 33 22.63 57 0.40

----------------------------------------------------------------------

1 : 33 1 : 33 330255.28 46616 7.08

1 : 33 1 : 36 263584.71 7043 37.43

1 : 33 1 : 25 5.03 8 0.63

1 : 33 1 : 29 61.18 40 1.53

1 : 33 1 : 45 0.00 1 0.00

----------------------------------------------------------------------

1 : 36 1 : 9 41412.86 7043 5.88

----------------------------------------------------------------------

1 : 38 1 : 40 0.00 7043 0.00

----------------------------------------------------------------------

1 : 40 1 : 33 124901.52 7035 17.75

1 : 40 1 : 29 10.06 8 1.26

----------------------------------------------------------------------

1 : 45 1 : 57 0.84 1 0.84

----------------------------------------------------------------------

1 : 50 1 : 55 31.01 1 31.01

----------------------------------------------------------------------

1 : 55 1 : 18 0.84 1 0.84

----------------------------------------------------------------------

Основные узкие места: рандомизация массива, условный оператор, включающий в себя оператор сравнения и доступ к элементам массива.

4.2. Профилирование программы на языке Pascal

Соседние файлы в папке Лабораторная работа №21