Цель работы.
- Изучить основные принципы построения тестов, использующихся для оценки производительности вычислительных систем.
- Разбор проблем, возникающих при попытке измерения производительности вычислительных систем.
- Исследовать уже существующие тесты и научиться разрабатывать свои тесты, оценивающие производительность вычислительных систем.
Основные положения.
Пакет «Ливерморские циклы» — это набор из 24 DO-циклов на языке FORTRAN (The Livermore Fortran Kernels, LFK) взятые из операционных кодов, используемых в Лоуренсовской Национальной Лаборатории в Ливерморе – одном из крупнейших в мире научных вычислительных центров США. Эти цикли используются с начала семидесятых годов, для оценки производительности компьютеров и компиляторов при выполнении арифметических операций.
(Сюда можно вставить весь текст из методички, но я не буду это делать.)
Основная цель этого теста — разброс производительности, демонстрирующийся в этом тесте. Он дополняет набор циклов, тестируемых в LINPAC.
Нестабильность производительности (специализация вычислительного средства) — это отношение максимальной и минимальной производительности. Оно показывает, насколько специализировано вычислительное средство и насколько трудно получить большую производительность на нём.
«Лучший компьютер – тот компьютер, у которого выше минимальная производительность».
Задание на лабораторную работу.
- Изучить общую структуру бенчмарка «Ливерморские циклы», его программную реализацию на Си приведенную ниже.
- Выделить из общего пакета-бенчмарка часть — программу реализации теста-ядра согласно варианту. Снабдить ее интерфейсом пользователя для задания параметров и представления результатов тестирования.
- Рассчитать число операций с плавающей запятой в данном тесте-ядре.
- Транслировать и отладить программу заданного теста-ядра.
- Измерить производительность не менее 3-х ВС с помощью данного теста-ядра (в Mflops –миллионах операций с плавающей запятой в секунду).
- Оформить результаты оценки производительности в отчете.
Выполнение
В соответствии с заданием была составлена программа на языке C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
//Лабораторная работа №1 по дисциплине "Архитектура вычислительных систем" //Оценка производительности вычислительных систем //Copyright (2007) //site: https://urvanov.ru #include <stdio.h> #include <stdlib.h> #include <time.h> double test(long int, int); int main(int argc,char *argv[]) { if (argc!=3) { fprintf(stderr,"USAGE:\n lab1 <loop> <n>\n"); fprintf(stderr," loop, n - integer parameters.\n"); } else { double result=test(atol(argv[1]),atol(argv[2])); printf("Your computer have %f Mflops\n",result/1000000); } return 0; } double test(long int loop,int n) { clock_t clock_start,clock_end; double *x=(double*)malloc((n+1)*sizeof(double)); double *y=(double*)malloc((n+1)*sizeof(double)); double time_in_sec; int k; long int l; long operations; float cps=CLOCKS_PER_SEC; if ((!x)||(!y)) { printf("Not enought memory\n"); free(x); free(y); exit(1); } srand(time(NULL)); for (l=0;l<n;l++) { x[l]=rand()/100; y[l]=rand()/100; } clock_start=clock(); for ( l=1 ; l<=loop ; l++ ) { x[0] = y[0]; for ( k=1 ; k<n ; k++ ) { x[k] = x[k-1] + y[k]; } } clock_end=clock(); operations=(long int)(n-1)*(long int)(loop); time_in_sec=(double)clock_end-clock_start; time_in_sec=time_in_sec/((double)CLOCKS_PER_SEC); printf("CLOCKS_PER_SEC=%f\n",(float)cps); printf("time_in_sec=%f\n",time_in_sec); free(x); free(y); return ((double)operations)/time_in_sec; } |
Результаты оценки производительности
Номер компьютера | Результат (Mflops) |
Компьютер номер 1 | 101.522840 |
Компьютер номер 2 | 64.020486 |
Компьютер номер 3 | 206.504904 |