Главная страница
Навигация по странице:

  • ОТЧЁТ по лабораторной работе № 2 «Оценка производительности процессора» по дисциплине: «

  • Цель лабораторной работы

  • Результат вывода программы

  • Лабораторная Работа №2 «Оценка производительности процессора». Архитектура вычислительных систем


    Скачать 67.18 Kb.
    НазваниеАрхитектура вычислительных систем
    Анкор Лабораторная Работа №2 «Оценка производительности процессора
    Дата26.12.2021
    Размер67.18 Kb.
    Формат файлаdocx
    Имя файла1640337772368_laboratornayarabota2otsenkaproizvoditelnosti.docx
    ТипДокументы
    #319104

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
    ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ

    образовательное учреждение

    высшего образования

    «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

    _________________________________________________________________

    Кафедра Вычислительной техники



    ОТЧЁТ

    по лабораторной работе № 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;

    }


    написать администратору сайта