计算机系统(2) 实验五 Cache实验

简介: 计算机系统(2) 实验五 Cache实验

一、实验目标:


了解Cache对系统性能的影响


二、实验环境:


个人电脑(Intel CPU)

Fedora 13 Linux 操作系统


三、实验内容与步骤


编译并运行程序A,记录相关数据。

不改变矩阵大小时,编译并运行程序B,记录相关数据。

改变矩阵大小,重复1和2两步。

通过以上的实验现象,分析出现这种现象的原因。

程序A:

#include <sys/time.h> 
#include <unistd.h> 
#include <stdlib.h>
#include <stdio.h> 
int main(int argc,char *argv[]) 
{
    float *a,*b,*c, temp;
    long int i, j, k, size, m;
    struct timeval time1,time2; 
    if(argc<2) { 
        printf("\n\tUsage:%s <Row of square matrix>\n",argv[0]); 
        exit(-1); 
    } //if
    size = atoi(argv[1]);
    m = size*size; 
    a = (float*)malloc(sizeof(float)*m); 
    b = (float*)malloc(sizeof(float)*m); 
    c = (float*)malloc(sizeof(float)*m); 
    for(i=0;i<size;i++) { 
        for(j=0;j<size;j++) { 
            a[i*size+j] = (float)(rand()%1000/100.0); 
            b[i*size+j] = (float)(rand()%1000/100.0); 
        } 
    }
    gettimeofday(&time1,NULL);
    for(i=0;i<size;i++) { 
        for(j=0;j<size;j++)  {
            c[i*size+j] = 0; 
            for (k=0;k<size;k++) 
                c[i*size+j] += a[i*size+k]*b[k*size+j];
        }
    }
    gettimeofday(&time2,NULL); 
    time2.tv_sec-=time1.tv_sec; 
    time2.tv_usec-=time1.tv_usec; 
    if (time2.tv_usec<0L) { 
        time2.tv_usec+=1000000L; 
        time2.tv_sec-=1; 
    } 
    printf("Executiontime=%ld.%06ld seconds\n",time2.tv_sec,time2.tv_usec); 
    return(0); 
}//main

程序B:

#include <sys/time.h> 
#include <unistd.h> 
#include <stdlib.h>
#include <stdio.h> 
int main(int argc,char *argv[]) 
{
    float *a,*b,*c, temp;
    long int i, j, k, size, m;
    struct timeval time1,time2; 
    if(argc<2) { 
        printf("\n\tUsage:%s <Row of square matrix>\n",argv[0]); 
        exit(-1); 
    } //if
    size = atoi(argv[1]);
    m = size*size; 
    a = (float*)malloc(sizeof(float)*m); 
    b = (float*)malloc(sizeof(float)*m); 
    c = (float*)malloc(sizeof(float)*m); 
    for(i=0;i<size;i++) { 
        for(j=0;j<size;j++) { 
            a[i*size+j] = (float)(rand()%1000/100.0); 
            c[i*size+j] = (float)(rand()%1000/100.0); 
        } 
    }
    gettimeofday(&time1,NULL);
    for(i=0;i<size;i++) {
        for(j=0;j<size;j++) {
            b[i*size+j] = c[j*size+i];
        }
    }
    for(i=0;i<size;i++) { 
        for(j=0;j<size;j++)  {
            c[i*size+j] = 0; 
            for (k=0;k<size;k++) 
                c[i*size+j] += a[i*size+k]*b[j*size+k];
        }
    }
    gettimeofday(&time2,NULL); 
    time2.tv_sec-=time1.tv_sec; 
    time2.tv_usec-=time1.tv_usec; 
    if (time2.tv_usec<0L) { 
        time2.tv_usec+=1000000L; 
        time2.tv_sec-=1; 
    } 
    printf("Executiontime=%ld.%06ld seconds\n",time2.tv_sec,time2.tv_usec); 
    return(0); 
}//main

四、实验结果及分析


  1. 用C语言实现矩阵(方阵)乘积一般算法(程序A),填写下表:


ef7561f975ea4eb3858e33bb06e01647.png

分析:


c14903d5ad344064958058c3281b4f47.png

aaafa666ce4c4b15bdbdcbf061d5676c.png

通过对代码进行分析,可以发现,代码中对数组中的每个元素进行的是以列为顺序的访问(行优先)


      for(i=0;i<size;i++) { 
          for(j=0;j<size;j++)  {
              c[i*size+j] = 0; 
              for (k=0;k<size;k++) 
                  c[i*size+j] += a[i*size+k]*b[k*size+j];
          }
    }

这有很差的空间局部性,也不能够高效借助Cache完成数据传递,效率很低。


程序B是基于Cache的矩阵(方阵)乘积优化算法,填写下表:


419f3d084f3b4b84bfc6a91be165cb88.png

分析:

d00174c306b045fc9bd61c041a77a8ba.png

612cd408a2ea45399f1dc5c71db72541.png


通过对代码进行分析,可以发现,代码中对数组中的每个元素进行的是以行为顺序的访问(列优先)

      for(i=0;i<size;i++) { 
          for(j=0;j<size;j++)  {
              c[i*size+j] = 0; 
              for (k=0;k<size;k++) 
                  c[i*size+j] += a[i*size+k]*b[j*size+k];
          }
      }

即按顺序对数组元素进行访问,有比较好的空间局部性,比较高效的借助了Cache进行数据传递。因此效率比较高。


  1. 优化后的加速比(speedup)


d89c6470673446b8805ec4effc800a99.png

加速比定义:加速比=优化前系统耗时/优化后系统耗时;

所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。

分析:


cdefab6aec15436e95ceae726f49f94c.png

可以看到,加速比随着数据量的增大而增大,即数据越多,利用Cache进行优化得越明显。这说明,Cache对大数据量下的优化效果比小数据量下好。


五、实验总结与体会


       通过本次实验,我借助两份代码,借助矩阵乘法对C语言程序运行中Cache对程序运行的影响进行了探究。可以看到,Cache对大数据下的程序运行有比较明显的优化效果。这说明具有良好空间局部性的代码运行起来往往较快,在实际编程中,我们也要尽量写出具有空间局部性的代码,以缩短程序运行时间。

相关文章
|
9月前
|
芯片
计算机组成原理实验二 存储器实验(上)
计算机组成原理实验二 存储器实验
256 0
|
9月前
计算机组成原理实验二 存储器实验(下)
计算机组成原理实验二 存储器实验(下)
58 0
|
存储
计算机系统(1)实验二 LC-3机器码编程试验
计算机系统(1)实验二 LC-3机器码编程试验
369 0
计算机系统(1)实验二 LC-3机器码编程试验
|
12月前
|
人工智能 编解码 网络协议
计算机实验基础要点
第一台计算机ENIAC 1946年 计算机发展:电子管计算机,晶体管计算机,集成电路计算机,大规模集成电路计算机 计算机分类:超级计算机,大型计算机,小型计算机,微型计算机,嵌入式计算机, 计算机特点:速度快,精度高,存储容量大,具有逻辑判断能力,自动化程度高,可与通信网络互联 计算机应用:1科学计算2数据处理3辅助技术4过程控制5人工智能 计算机系统组成:1硬件2指令3程序4软件
66 0
计算机组成原理实验五:CPU组成与机器指令执行实验
本篇博文主要是讲述一下计算机组成原理实验中CPU组成与机器指令执行实验,因为很多同学在刚学习计算机组成原理实验的时候对于调试的一些步骤还是有些懵懵懂懂,每个步骤之间的连接做的不是很连贯,故有了写此篇博文的初衷,笔者会在近期分享计算机组成原理实验的五个实验,希望对有学习此课程的同学能够有一些帮助!
341 1
计算机组成原理实验五:CPU组成与机器指令执行实验
|
存储
计算机组成原理实验二:双端口存储器原理实验
本篇博文主要是讲述一下计算机组成原理实验中双端口存储器原理实验,因为很多同学在刚学习计算机组成原理实验的时候对于调试的一些步骤还是有些懵懵懂懂,每个步骤之间的连接做的不是很连贯,故有了写此篇博文的初衷,笔者会在近期分享计算机组成原理实验的五个实验,希望对有学习此课程的同学能够有一些帮助!(第一篇博文所写的前缀)
510 3
计算机组成原理实验二:双端口存储器原理实验
|
内存技术
计算机系统(1)实验五 中断实验
计算机系统(1)实验五 中断实验
99 0
计算机系统(1)实验五 中断实验
|
Ubuntu Linux C语言
计算机系统(2) 实验二 数据表示实验(上)
计算机系统(2) 实验二 数据表示实验(上)
327 0
计算机系统(2) 实验二 数据表示实验(上)
|
算法 Linux
计算机系统(2) 实验二 数据表示实验(下)
计算机系统(2) 实验二 数据表示实验(下)
359 0
计算机系统(2) 实验二 数据表示实验(下)
计算机组成原理实验三:数据通路组成的实验
本篇博文主要是讲述一下计算机组成原理实验中数据通路组成的实验,因为很多同学在刚学习计算机组成原理实验的时候对于调试的一些步骤还是有些懵懵懂懂,每个步骤之间的连接做的不是很连贯,故有了写此篇博文的初衷,笔者会在近期分享计算机组成原理实验的五个实验,希望对有学习此课程的同学能够有一些帮助!
330 2
计算机组成原理实验三:数据通路组成的实验