Лабораторная Работа №2 «Оценка производительности процессора». Архитектура вычислительных систем
Скачать 67.18 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ образовательное учреждение высшего образования «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» _________________________________________________________________ Кафедра Вычислительной техники ОТЧЁТ по лабораторной работе № 2 «Оценка производительности процессора» по дисциплине: «Архитектура вычислительных систем» Выполнил:Проверил: Студент гр. «АММ2-21», «АВТФ» «Абдрашитов Д.Ш.» «Перышкова E.Н.» _________________ _________________ (подпись) (подпись) Новосибирск 2021 Цель лабораторной работы: Оценка производительности процессора. Задание: реализовать программу для оценки производительности процессора (benchmark). 1. Написать программу(ы) (benchmark) на языке С/С++/C# для оценки производительности процессора. В качестве набора типовых задач использовать либо минимум 3 функции выполняющих математические вычисления, либо одну функцию по работе с матрицами и векторами данных с несколькими типами данных. Можно использовать готовые функции из математической библиотеки (math.h) [3], библиотеки BLAS [4] (англ. Basic Linear Algebra Subprograms — базовые подпрограммы линейной алгебры) и/или библиотеки LAPACK [5] (Linear Algebra PACKage). Обеспечить возможность в качестве аргумента при вызове программы указать общее число испытаний для каждой типовой задачи (минимум 10). Входные данные для типовой задачи сгенерировать случайным образом. 2. С помощью системного таймера (библиотека time.h, функции clock() илиgettimeofday()) или с помощью процессорного регистра счетчика TSC реализовать оценку в секундах среднего времени испытания каждой типовой задачи. Оценить точность и погрешность (абсолютную и относительную) измерения времени (рассчитать дисперсию и среднеквадратическое отклонение). 3. Результаты испытаний в самой программе (или с помощью скрипта) сохранить в файл в формате CSV со следующей структурой: [PModel;Task;OpType;Opt;InsCount;Timer;Time;LNum;AvTime;AbsErr;RelErr;TaskPerf], где PModel – Processor Model, модель процессора, на котором проводятся испытания; Task – название выбранной типовой задачи (например, sin, log, saxpy, dgemv, sgemm и др.); OpType – Operand Type, тип операндов используемых при вычислениях типовой задачи; Opt – Optimisations, используемы ключи оптимизации (None, O1, O2 и др.); InsCount – Instruction Count, оценка числа инструкций при выполнении типовой задачи; Timer – название функции обращения к таймеру (для измерения времени); Time – время выполнения отдельного испытания; LNum – Launch Numer, номер испытания типовой задачи. AvTime –Average Time, среднее время выполнения типовой задачи из всех испытаний[секунды]; AbsError – Absolute Error, абсолютная погрешность измерения времени в секундах; RelError – Relative Error, относительная погрешность измерения времени в %; TaskPerf – Task Performance, производительность (быстродействие) процессора при выполнении типовой задачи. 3. * Оценить среднее время испытания каждой типовой задачи с разным типом входных данных (целочисленные, с одинарной и двойной точностью). 3. ** Оценить среднее время испытания каждой типовой задачи с оптимизирующими преобразования исходного кода компилятором (ключи –O1, O2, O3 и др.). 3. *** Оценить и постараться минимизировать накладные расходы(время на вызов функций, влияние загрузки системы и т.п.) при испытании, то есть добиться максимальной точности измерений. 4. Построить сводную диаграмму производительности в зависимости от задач и выбранных исходных параметров испытаний. Оценить среднее быстродействие (производительность) для равновероятного использования типовых задач. Результат вывода программы: Скомпилируем программу при помощи команды: gcc lab2.c -o lab2 -lm Результат команды записывается в файл results.csv, посмотрим файл при помощи команды cat results.csv, пример вывод показан на рисунке 1. Рисунок 1 – Результаты вычислений для типа double Проведем серию испытаний для разных типов и составим сводный график, результаты на рисунке 2. Рис. 2 Сравнение вычисления разных типов данных Приложение 1 – Листинг программы. #include <stdlib.h> #include #include #include #define m 1000 #define n 1000 double lNum = 10.0; void Vector(float *matrix, float *vector, float *vectorIt) { for (int i = 0; i < m; i++) { vectorIt[i] = 0.0; for (int j = 0; j < n; j++) vectorIt[i] += matrix[i * n + j] * vector[j]; } } /*void Vector(double *matrix, double *vector, double *vectorIt) { for (int i = 0; i < m; i++) { vectorIt[i] = 0.0; for (int j = 0; j < n; j++) vectorIt[i] += matrix[i * n + j] * vector[j]; } }*/ double wtime() { struct timeval t; gettimeofday(&t, NULL); return (double)t.tv_sec + (double)t.tv_usec * 1E-6; } void Vector(int *matrix, int *vector, int *vectorIt) { for (int i = 0; i < m; i++) { vectorIt[i] = 0.0; for (int j = 0; j < n; j++) vectorIt[i] += matrix[i * n + j] * vector[j]; } }*/ double test() { srand(time(0)); float *matrix, *vector, *vectorIt; matrix = malloc(sizeof(*matrix) * m * n); vector = malloc(sizeof(*vector) * n ); vectorIt = malloc(sizeof(*vectorIt) * n); double t; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) matrix[i * n + j] = rand() % 1000; } for (int j = 0; j < n; j++) vector[j] =rand() % 1000; t = wtime(); Vector(matrix, vector, vectorIt); t = (wtime() - t) ; //printf("Elapsed time (serial): %.6f sec.\n", t); free(matrix); free(vector); free(vectorIt); return t; } void Math() { double dispersion =0, average = 0, deviation = 0, taskPerf = 0, absError = 0, relError = 0; int insCount = n*(m+(n-1)) + m; double testAr[10]; double t = test(); for (int i = 0; i < 10; i++) { testAr[i] += test(); average += testAr[i]; } for (int i = 0; i < 10; i++) { testAr[i] = test(); average += testAr[i]; taskPerf += (insCount / testAr[i]); dispersion += pow(testAr[i] - average, 2); } taskPerf = pow((1 / taskPerf), -1); deviation = sqrt (dispersion / lNum); average /= lNum; absError = average - t; relError = (absError / average)*100; FILE *file; file = fopen("results.cvs", "a"); fprintf (file, "PModel: AMD Ryzen 5 3600 6-Core Processor 3.59 GHz\n"); fprintf( file, "Task: multiplying a matrix by a vector OpType: -O \nOpt float\nInsCount %d \n", insCount); fprintf (file, "Timer: time()\nTime: %.6f \nLNum: 10 \nAvTime: %.6f \nAbsErr: %.6f \n", t, average, absError); fprintf (file, "RelErr: %.6f \nTaskPer: %.2f % \n\n", relError, taskPerf); fclose(file); } int main () { Math(); return 0; } |