- •Постановка задачи
- •Выполнение работы
- •Профилирование программы porost0.C
- •Профилирование программы test_cyc.C
- •Профилирование программы test_sub.C
- •1000*1000 Повторений
- •2000*1000 Повторений
- •5000*1000 Повторений
- •10000*1000 Повторений
- •Профилирование программы QuickSort.Cpp
- •Профилирование программы QuickSort.Pas
Санкт-Петербургский государственный электротехнический университет
Кафедра МОЭВМ
Отчет по лабораторной работе №2.
Измерение характеристик динамической сложности программ с помощью профилировщика VTune
Выполнил:
Студент гр.3351
Сергеев М.В.
Санкт-Петербург
2007г.
-
Постановка задачи
1. Ознакомиться с документацией на VTune и выполнить
для программы prost0.c следующее задание:
- компиляция с использованием автономного отладчика;
- профилирование по времени;
- профилирование по частоте;
- профилирование по средним временам на 1 вызов;
- запись результатов профилирования в файл для печати.
2. Выполнить тестовые программs test_cy1.c, test_cyc.c,
test_sub.c c анализом параметров повторения циклов и проверкой
их влияния на точность и чувствительность профилирования.
3. Скомпилировать и выполнить под управлением профилировщика VTune
программы на Паскале и С, разработанные в 1-ой лабораторной работе.
Снять все виды профилей, выявить "узкие места", ввести в
программы усовершенствования и получить новые профили. Если
времена выполнения рассматриваемых при профилировании фрагментов
программы малы для учета VTun'ом, ввести вспомогательное зацикливание
программы.
-
Выполнение работы
В качестве используемого профилировщика был использован пакет Intel Vtune 7.0. Программa на Pascal откомпилирована в среде Borland Delphi 7, на C – в MS VisualStudio 2003.
Для всех программ в данной работе проводились 2 вида профилирования:
TBS (Time Based Sampling) - произведение измерений через регулярные промежутки времени с использованием обычного таймера;
EBS (Event Based Sampling) - в данном режиме моменты измерений определяются событиями, которые генерируются процессором. По умолчанию профилировщик реагирует только на событие Clockticks.
Те программы, в которых это было необходимо, модифицировались:
-
Удалены все операции ввода/вывода, т.к. они будут занимать несравнимо большее время, нежели операции, относящиеся непосредственно к вычислительному алгоритму программы;
-
Введено дополнительное зацикливание, если времени работы программы было не достаточно для профилирования.
-
Профилирование программы porost0.C
Line |
Source |
Clockticks (EBS) |
Timer (TBS) |
1 |
#include "stdio.h"; |
|
|
2 |
|
|
|
3 |
int primes[1000]; |
|
|
4 |
#define MAXPRIMES 1000 |
|
|
5 |
|
|
|
6 |
main() |
|
|
7 |
{ |
|
|
8 |
int j; |
|
|
9 |
int lastprime, curprime; |
|
|
10 |
|
|
|
11 |
primes[0] = 2; |
|
|
12 |
primes[1] = 3; |
|
|
13 |
lastprime = 1; |
|
|
14 |
curprime = 3; |
|
|
15 |
|
|
|
16 |
printf("prime %d = %d\n", 0, primes[0]); |
|
|
17 |
printf("prime %d = %d\n", 1, primes[1]); |
|
|
18 |
|
|
|
19 |
while(curprime < MAXPRIMES) |
|
|
20 |
{ |
|
|
21 |
for(j = 0; j <= lastprime; j++) |
2 |
1 |
22 |
if((curprime % primes[j]) == 0) |
45 |
23 |
23 |
{ |
|
|
24 |
curprime += 2; |
|
|
25 |
|
|
|
26 |
break; |
|
|
27 |
} |
|
|
28 |
if(j <= lastprime) |
|
1 |
29 |
continue; |
|
|
30 |
lastprime++; |
|
|
31 |
printf("prime %d = %d\n", lastprime, curprime); |
|
|
32 |
primes[lastprime] = curprime; |
|
|
33 |
curprime += 2; |
|
|
34 |
} |
|
|
35 |
} |
|
|
36 |
|
|
|
Из анализа результатов видно, что узкое место программы - строка 22: доступ к элементу массива, операция взятия по модулю, условный оператор.