CSAPP第五次实验(cahce) 局部性对矩阵乘法的影响

CSAPP 专栏收录该内容
4 篇文章 0 订阅

         因为要考试了,所以就不再写一遍了,而是直接把我的实验报告的word分段以图片的形式发上来,因为涉及到的程序代码并不长,所以如果有必要,我会把一部分程序贴出来让大家方便复制。文章较长,其中第三部分和第四部分较相像。

1. 获取本机cache信息

2. 观察二维数组 Array[][] 的存放 ,对行优先、列两种访问情况 的 cache命中情况进行说明,并对两种方式遍历数组时间进行比较。 

            注意:默认栈大小可能不足,尽量在Linux下运行,运行之前用 ulimit -s 102400 改变程序栈大小为100M再运行。ulimit -a可查询到栈此时大小(stack size)。

#include<time.h>
#include<stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#define N 1000

int main(void)
{
	struct timeval startTime,endTime;
	float Timeuse;
	int i,j,k;
	
	int array[1000][1000];
	gettimeofday(&startTime,NULL);
	
	for(i=0;i<1000;i++)
	    for(j=0;j<1000;j++)
	        array[i][j]=0x1234+i;
	        
	gettimeofday(&endTime,NULL);
	
	Timeuse = 1000000*(endTime.tv_sec - startTime.tv_sec) 
	                     + (endTime.tv_usec - startTime.tv_usec);
	
	Timeuse /= 1000000;
	
	printf("Timeuse = %f\n",Timeuse);
} 
         
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	int *r = (int*)calloc(64,sizeof(int));
	int a = 0xbc0;
	int b = 0xfa0;
	int c = 0xfc0;
	int i, j, k;
	
	for(i=0;i<1000;i++)
	{
		j = (a&c) >> 6;
		r[j]++;
		a += b;
	} 
	j = 0;
	k = 0;
	for(i=0;i<64;i++)
	{
		printf("S[%d]: %d\n",i,r[i]);
		if(r[i]==15)
		    j++;
        else if(r[i]==16)
        	k++;
	}
	printf("15: %d  16: %d\n",j,k);
	
	return 0;
} 



3.矩阵乘法优化



#include <time.h>
#include <stdio.h>
#include<sys/time.h>
#include<stdlib.h>
#define N 1000

int main(void)
{

    struct timeval startTime,endTime;
    float Timeuse;
    int i,j,k;
    double index;

    double mul1[N][N], mul2[N][N], res[N][N];

    gettimeofday(&startTime,NULL);

    for(i=0;i<N;i++)
        for(j=0;j<N;j++){
            for(k=0;k<N;k++)
                res[i][j] += mul1[i][k] * mul2[k][j];
	}

    gettimeofday(&endTime,NULL);

    Timeuse = 1000000*(endTime.tv_sec - startTime.tv_sec) 
                       + (endTime.tv_usec - startTime.tv_usec);

    Timeuse /= 1000000;

    printf("Timeuse = %f\n",Timeuse);

}


4. 运行A B程序,分析其运行时间并解释原因

A程序如下:
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.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); 
	} 

	size=atoi(argv[1]);
	m =size*size;
 
	a=(float*)malloc(sizeof(float)*m); 
	b=(float*)malloc(sizeof(float)*m); 
	c=(float*)calloc(m,sizeof(float));
 
	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++) 
	    {
		    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.%6ld seconds\n",time2.tv_sec,time2.tv_usec); 
	

	return(0); 
}<span style="font-family:Microsoft YaHei;">
</span>

B程序:

#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.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); 
    } 

    size=atoi(argv[1]); 
    m=size*size; 
    a=(float*)malloc(sizeof(float)*m); 
    b=(float*)malloc(sizeof(float)*m); 
    c=(float*)calloc(m,sizeof(float)); 

    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(k=0;k<size;k++) 
                {
                    temp = a[i*size+k]; 
                    for (j=0;j<size;j++) 
                        c[i*size+j] += temp * 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.%6ld seconds\n",time2.tv_sec,time2.tv_usec); 

    return 0; 
}


5. 堆栈矩阵乘法对比


  • 0
    点赞
  • 1
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值