litceysel.ru
добавить свой файл
  1 ... 5 6 7 8

Приложение

Приложение 1. “Минимальное использование оперативной памяти”

Ниже представлен текст программы-теста, которая должна производить некоторые вычисления, не использующие оперативную память. Промежуточные результаты будут храниться в регистрах или кеше.

В качестве параметра программе передается целое число – количество итераций, которое должен совершить главный цикл в программе. Встроенный параметр z – постоянный параметр для отдельного профайлера. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходный код программы:


#include

const int z = 1024 << 8; // ratio factor


int main(int argc, char *argv[]){

int n = atoi(argv[1]);

int s = 0;

for (int j = 0; j < z; j++) {

for (int i = 0; i < n; i++) {

s += i;

}

}

std::cout << s;

return 0;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test01-no-memory/Main.cpp

Приложение 2. “Активное использование оперативной памяти”

Ниже представлен текст программы-теста, которая должна производить некоторые вычисления, использующие оперативную память.

В качестве параметра программе передается целое число n. Сначала в программе создается массив размерности n и заполняется произвольными числами. Затем с этим массивом производятся некоторые вычисления. Также в программе определен встроенный параметр z. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходный код программы:


#include

const int z = 2048; // ratio factor

int main(int argc, char *argv[]){

int n = atoi(argv[1]);

int *a = new int[n];

for (int i = 0; i < n; i++) a[i] = i;

int s = 0;

for (int j = 0; j < z; j++) {

for (int i = 0; i < n; i++) {

s += a[i];

a[i] += s;

}

}

std::cout << s;

return 0;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test02-memory/Main.cpp

Приложение 3. “Использование оперативной памяти с частыми промахами кеша”

Ниже представлен текст программы-теста, которая должна производить некоторые вычисления, использующие оперативную память. При этом должны происходить частые промахи кеша.

В качестве параметра программе передается целое число n. Программа создает прямоугольный массив из n строк, для каждой из которых выделено по странице оперативной памяти. Массив заполняется произвольными числами, и производятся некоторые вычисления над ним так, что каждая операция обращается к новой странице памяти. Также в программе определен встроенный параметр z, который нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.

Исходный код программы:


#include

const int m = 1024;

const int z = 64;


int main(int argc, char *argv[]){

int n = atoi(argv[1]);

int **a = new int*[n];

for (int i = 0; i < n; i++){

a[i] = new int[m];

for (int j = 0; j < m; j++) {

a[i][j] = i + j;

}

}

int s = 0;

for (int t = 0; t < z; t++) {

for (int j = 0; j < m; j++) {

for (int i = 0; i < n; i++) {

s += a[i][j];


a[i][j] += s;

}

}

}

std::cout << s;

return 0;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test03-extra-memory/Main.cpp

Приложение 4. “Вариация длины цикла”

Ниже представлен код программы-теста, суть которой заключена в двух циклах. Общее количество итераций вложенного цикла фиксировано. Варьируется количество итераций вложенного цикла за одну итерацию внешнего.

Также в программе определен встроенный параметр z. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходный код программы:


#include

const int n = 1 << 24;

const int z = 256; // ratio factor


void main(int argc, char *argv[]) {

int k = atoi(argv[1]);

int m = n / k;

int s = 0;

for (int t = 0; t < z; t++) {

for (int i = 0; i < m; i++) {

for (int j = 0; j < k; j++) {

s++;

}

}

}

std::cout << s;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test11-cycle/Main.cpp

Приложение 5. “Периодически выполняемые операции”

Ниже представлен код программы-теста, смысл которого схож с предыдущим тестом. Реализация использует один цикл и счетчик, обнуление которого влечет за собой выполнение некоторого действия.

В программе определен встроенный параметр z. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходный код программы:

#include


const int n = 1 << 22;

const int z = 256; // ratio factor


void main(int argc, char *argv[]) {

int k = atoi(argv[1]);

int s = 0;

for (int t = 0; t < z; t++) {

int j = k;

for (int i = 0; i < n; i++) {

if (!j) {

s += i;

j = k;

}

j--;

}

}

std::cout << s;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test12-divisibility/Main.cpp

Приложение 6. “Вынужденная потеря контекста”

Ниже представлен код программы-теста, цель которого будет найти проблемы в методе семплирования. Функия Sleep выступает здесь как команда передать контекст.


Исходный код программы:


#include

#include

const int z = 1000;


void main(int argc, char *argv[]) {

int n = atoi(argv[1]);

int s = 0;

for (int t = 0; t < z; t++) {

for (int i = 0; i < n; i++) {

s += i;

}

Sleep(1);

}

std::cout << s;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test21-sleep/Main.cpp

Приложение 7. “Выравнивание данных”

Ниже представлен код программы-теста, цель которого проверить как ведет себя профайлер на программе, в которой часто возникают проблемы с выравниванием данных.

В программе определен встроенный параметр z. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходный код программы:

#include


const int z = 1024;


int main(int argc, char *argv[]) {

int n = atoi(argv[1]);

char *a = new char[n * 4];

for (int i = 0; i < n; i++) ((int *)a)[i] = i;

int s = 0;

n = n * 4 - 3;

for (int j = 0; j < z; j++) {

for (int i = 0; i < n; i++) {

int *p = (int *)(a + i);

s += *p;

*p += s;

}

}

std::cout << s;

return 0;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test31-mem-misalign/Main.cpp

Приложение 8. “Вызовы процедур”

Ниже представлен код программы-теста, цель которого проверить, производит ли профайлер внедрение собственного кода в функции исследуемой программы.

В программе определен встроенный параметр z. Он нужен для того, чтобы иметь возможность скомпенсировать накладные расходы, возникающие при работе с профайлером.


Исходый код программы:


#include

const int z = 1024 << 4;


#pragma auto_inline(off)

int foo(int a) {

return a + (a >> 8) + (a << 1);

}

#pragma auto_inline()


void main(int argc, char *argv[]) {

int n = atoi(argv[1]);

int s = 0;

for (int t = 0; t < z; t++) {

for (int i = 0; i < n; i++) {

s += i ^ foo(s);

}

}

std::cout << s;

}


Адрес в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/test41-proc-call/Main.cpp

Приложение 9. “Результаты тестирования”

Полную таблицу результатов тестирования можно найти по адресу:


http://willzyx-edu-project.googlecode.com/svn/trunk/Proj2/tests/results.xls

Файл представляет собой электронную талицу. Для каждого теста создан отдельный лист. В верхней части каждого листа собраны в таблицу полученные в результате тестирования показания. Ниже таблица дублируется только уже с приведенными к секундам единицами измерений. В нижней части листа добавлены графики, построенные по приведенным данным.



<< предыдущая страница