Исследование кэш-памяти (Лабораторная работа № 1)

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

6 страниц (Word-файл)

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

Министерство образования и науки РФ

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

Кафедра ПВТ

Лабораторная работа №1

Тема

«Исследование кэш-памяти»

Факультет: ПМИ

Группа: ПМ-52

Студент: Тлеукенов Т.Б.

Новосибирск 2006г.


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

Processor

AMD Athlon 64 3000+

Frequency 2010.3 MHz

HTT 201.0 MHz

L1 Cache

64 Kbytes

Associativity 2-way

Line Size 64 Bytes

L2 Cache

512 Kbytes

Associativity 16-way

Line Size 64 Bytes

Frequency 2010.3 MHz

Bus Width 128 bits

Memory

Size 768 Mbytes

DDR-SDRAM

Frequency 167.5 MHz

ОС

Microsoft Windows XP Professional SP2

Комрилятор

Borland C++ Compiler v5.6


Задание 1. Сравнение способов обхода памяти


#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 262144

unsigned long tick()

__asm rdtsc

}

void main()

{

double t;

unsigned long n,i,k,*mass;

FILE *dir,*inv,*ran;

dir=fopen("D:\\direct.xls","w");

inv=fopen("D:\\inverse.xls","w");

ran=fopen("D:\\random.xls","w");

randomize();

fprintf(dir,"direct pass-by:\n");

for (n=256;n<N;n+=256)

{      mass=new unsigned long[n];

        for (i=0;i<n-1;i++)  mass[i]=i+1; mass[n-1]=0;

        t=tick();

        for (i=0,k=0;i<n*100;i++) k=mass[k];

        t=tick()-t;

        t=(double)t/(n*100);

        fprintf(dir,"%lf\n",t );

        if (k==12345) printf("");

        delete[] mass;

}

fprintf(inv,"inverse pass-by:\n");

for (n=256;n<N;n+=256)

{      mass=new unsigned long[n];

        mass[0]=n-1; for (i=1;i<n;i++) mass[i]=n-1-i;

        t=tick();

        for (i=0,k=0;i<n*100;i++) k=mass[k];

        t=tick()-t;

        t=(double)t/(n*100);

        fprintf(inv,"%lf\n ",t );

        if (k==12345) printf("");

        delete[] mass;

}

fprintf(ran,"random pass-by\n");

for (n=256;n<N;n+=256)

{      mass=new unsigned long[n];

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

        t=tick();

        for (i=0,k=0;i<n*100;i++) k=mass[k];

        t=tick()-t;

        t=(double)t/(n*100);

        fprintf(ran,"%lf\n",t );

        if (k==12345) printf("");

        delete[] mass;

}

fclose(dir); fclose(inv); fclose(ran);

}


Результат работы программы представлен на графике 1.

 Прямой     Обратный     Случайный

По графику видно, что наиболее быстрым является прямой обход. Это происходит благодаря механизмам кэширования и аппаратной предвыборки. Медленнее выполняется обратный обход, потому как кэширование для него по-прежнему эффективно, в отличие от аппаратной предвыборки, которая не приносит пользы. График случайного обхода хаотичен, т.к. при случайном обращении вероятность кэш-промаха стремится к 1, а механизм аппаратной предвыборки не работает (минимальные пики на графике соответствуют операции обращения к элементу, уже положенному в кэш).

Так же на графиках прямого и обратного обходов прослеживаются ситуации выхода массива за пределы кэш-памяти первого (64Кб) и второго уровней (512Кб).


Задание 2. Определение степени ассоциативности кэш-памяти

#include<stdio.h>

unsigned int const BlockSize=16384; //64*256

unsigned int const Offset=262144;    //1024*256

unsigned long tick()

{

__asm rdtsc

}

void main()

{

unsigned int *mass,i,j,k,n,t;

FILE*fp,*fp1;

fp=fopen("D:\\obhod2.xls","w");

for(n=1;n<=20;n++)

{

        mass=new unsigned int[Offset*n];

        for(i=0;i<Offset*n;i++) mass[i]=i+1; mass[i]=0;

        for(i=0;i<n-1;i++)

        {

            for(j=0;j<BlockSize/n;j++)

            {

                mass[i*Offset+j]=(i+1)*Offset+j;

            }

        }

        for(j=0;j<BlockSize/n-1;j++)

        {

            mass[(n-1)*Offset+j]=j+1;

        }

        mass[(n-1)*Offset+j]=0;

        k=0;

        for(t=tick(),i=0;i<BlockSize;i++)

        {

            k=mass[k];

        }

        t=tick()-t;

        if(k==12345) printf("");

        fprintf(fp,"%f\n",(float)t/BlockSize);

        delete[]mass;

    }

    fclose(fp);

}


Результат работы программы представлен на графике 2.

На графике представлена зависимость времени обработки одного элемента массива от количества фрагментов. По графику видно, что увеличение времени обработки одного элемента происходит при изменении количества фрагментов с 2 до 3. Следовательно ассоциативность Сache L1 равна 2. Это соответствует действительной ассоциативности кэша данных 1 уровня процессора.

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

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