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

一、实验目标:

了解Cache对系统性能的影响

二、实验环境:

  1. 个人电脑(Intel CPU)
  2. Fedora 13 Linux 操作系统

三、实验内容与步骤

  1. 编译并运行程序A,记录相关数据。
  2. 不改变矩阵大小时,编译并运行程序B,记录相关数据。
  3. 改变矩阵大小,重复1和2两步。
  4. 通过以上的实验现象,分析出现这种现象的原因。

程序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),填写下表:
矩阵大小10050010001500200025003000
一般算法执行时间0.0035110.5119475.78549526.95363285.128116187.514837320.786085

分析:
在这里插入图片描述
在这里插入图片描述
通过对代码进行分析,可以发现,代码中对数组中的每个元素进行的是以列为顺序的访问(行优先)

	    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完成数据传递,效率很低。

  1. 程序B是基于Cache的矩阵(方阵)乘积优化算法,填写下表:
矩阵大小10050010001500200025003000
优化算法执行时间0.0037680.4309973.47538911.83870628.08337954.4308197.124569

分析:
在这里插入图片描述
在这里插入图片描述
通过对代码进行分析,可以发现,代码中对数组中的每个元素进行的是以行为顺序的访问(列优先)

	    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)
矩阵大小10050010001500200025003000
加速比0.9317940551.1878203331.6647042962.2767380153.0312632963.4450127973.302831491

加速比定义:加速比=优化前系统耗时/优化后系统耗时;
所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。

分析:
在这里插入图片描述

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

五、实验总结与体会

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上山打老虎D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值