Определение максимального числа локальных переменных, которое может полностью проецироваться на регистры общего назначения

Страницы работы

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

Содержание работы

Министерство Образования Российской Федерации

Новосибирский Государственный Технический Университет

Лабораторные работы

По дисциплине: Архитектура ЭВМ и ВС

Выполнил: студент ПМ-22

Савлюк В.И.

Проверила:

Маркова В.П.

Новосибирск

2003


Введение.

Программирование нижеследующих задач производилось с учетом архитектуры процессора и в частности кэш-памяти. Тестирование производилось на Intel P-Celeron 1100A(0.13мк).

  • Процессор включает интегрированный на плату 256-килобайтный множественно-ассоциативный кэш второго уровня с поддержкой технологии ATC(Advanced Transfer Cache – архитектура, осуществляющая доступ к кэшу  на полной внутренней частоте процессора, с шириной шины 256 бит, и имеющая улучшенную технологию кэширования).
  •  Кроме того, туда же интегрирован кэш первого уровня (16КВ для инструкций и 16КВ для данных).
  • Процессор создан на базе компоновки PGA370, он имеет выделенную шину доступа к кэшу второго уровня, основанную на архитектуре двух независимых шин, для повышения пропускной способности и производительности.
  • Память кэшируется до 64GB адресуемой области.
  • Внутренняя частота процессора 1100 Mhz
  • Частота шины 100Mhz

Замеры производились после компиляции программ компилятором ‘gcc’ с ключом –О3 (полная оптимизация по времени) под управлением ОС Linux Redhat 7.3 в чистом консольном режиме с наивысшим приоритетом.


Задача 1

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

Задание. Построить тестовую программу для решения поставленной задачи. По результатам работы программы построить таблицу или график в осях X-число локальных переменных, Y-время доступа к ним. На основании анализа таблицы или графика сделать выводы о числе доступных для подпрограмм тестовой программы регистров. Сверить полученный результат с приведенным в документации при ее наличии.

Решение.

Для решения поставленной задачи напишем программу, которая будет последовательно обращаться к некоторому количеству переменных. Если все эти переменные смогут занять свободные регистры процессора, то время доступа к ним будет минимальным, иначе время доступа возрастет. Каждый раз увеличивая на 1 число переменных, найдем такое n, начиная с которого время доступа к переменным увеличиться с некоторым скачком. Так как время доступа к одной переменной ничтожно мало и не поддается замерам программными средствами, будем сравнивать время многократного доступа к переменным. Кроме того, учтем, что процессор технологии Intel Celeron A позволяет работать с группой регистров, как с массивом.

Листинг 1.

#include <stdio.h>

#include <sys/timeb.h>

 

void main() {

FILE * out = fopen("local.csv","wt");

int * a = new int[50];

      timeb start, end;

      int i,j,n;

      long int measured =0;

      for(n=1;n<50;n++) {

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

            ftime(&start);

            for(i=0;i<10000000;i++) {

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

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

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

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

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

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

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

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

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

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

            }

            ftime(&end);

            measured=(end.time*1000+end.millitm)-(start.time*1000+ start.millitm);

            fprintf(out,"%i;%i\n",n,measured);

            printf("Measured: %i - %i\n",n,measured);

      }

      fclose(out);

}

 

 

 

Т.е. наша программа открывает файл local.csv и сливает в него результаты замеров времени в формате “a;b”, где а - число локальных переменных, b-время затраченное на 100 млн. обращений к ним в миллисекундах. Программа сохраняет файл  в формате csv с соответствующим форматом данных для более удобной обработки данных в пакете для работы с таблицами и графиками (в данном случае MSExcel). Анализируя результаты работы программы можно построить такой график.

График1. Время доступа к локальным переменным.

График2. Среднее время доступа к одной переменной.

Итак, мы явно увидели, что в процессе перехода от 5 переменных к 6 наблюдается значительный скачок времени доступа. Следовательно, программе реально доступно 5 регистров процессора.


Задача 2

Задача. Определить максимальный размер массива, целиком умещающегося в кэше, в оперативной памяти.

Задание. Построить тестовую программу для решения поставленной задачи. По результатам работы программы построить графики в осях X-размер блока памяти, Y-время доступа. На основании анализа графиков сделать выводы о размере доступных для тестовой программы размерах кэша и оперативной памяти.

Решение. Тестирование заключается в следующем. Мы выделяем определенный блок памяти размера N и замеряем время доступа к нему. В данном случае мы определяем массив некоторого размера и осуществляем доступ ко всем его переменным. В случае, если массив целиком умещается в кэш-память, время доступа к нему будет минимально, как только он перестает там умещаться, наблюдается резкий скачок во времени доступа.

Листинг 2.

#include <stdio.h>

#include <sys/timeb.h>

#include <stdlib.h>

 

void main() {

      FILE * out = fopen("mem.csv","wt");

timeb start, end;

int S = 1024*1024;

      void * ptr = malloc(S);

      unsigned char * p = (unsigned char*)ptr;

      int i,times;

      long int measured=0;

      for(int size = 0;size<=S;size+=512) {

            ftime(&start);

            for(i = 0; i < size; i++) {

                  p[i] = 0;

            }

            for(times = 0;times<1000;times++) {

Похожие материалы

Информация о работе

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.