分块矩阵乘法的程序性能

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四分块矩阵乘法的程序性能

一、实验目的

本次实验比较分块矩阵乘法与普通矩阵乘法的性能,并考察分块大小对分块矩阵乘法性能的影响。

二、实验原理

1、矩阵相乘

为简单起见,本次实验矩阵相乘中的矩阵都是方阵,行数和列数都为 n 。

2、程序性能

本次实验中考察的程序性能指的是程序的CPU执行时间。在C语言程序中,可以考虑利用clock()函数来计算某段代码执行的CPU时间。

注意,clock()的精度为1ms,对于比较小的矩阵相乘,可能精度不够。如果需要使用高精度的计时方法,可以考虑利用CPU内的实时时钟计数器(RTSC),或性能计数器(Performance Counter)。

3、分块矩阵乘法

1、普通矩阵乘法是采用三层循环完成,如下图所示。

2、分块的矩阵乘法为了利用局部性提高Cache(高速缓存)利用率,采用了如下所示代码。

请编写普通矩阵乘法和分块矩阵乘法的实验和测试代码,记录实验结果。

另外,本次实验还需要研究不同分块大小对性能的影响,请编写相应的实验和测试代码,并记录实验结果。

三、实验步骤

void mmm(double*a,double*b,double*c,int n)

{

int i,j,k;

for(i=0;i

for(j=0;j

for(k=0;k

c[i*n+j]+=a[i*n+k]*b[k*n+j];

}

}

}

}

void mmm2(double*a,double*b,double*c,int n)

{

const int B=10;

int i,j,k;

int i1,j1,k1;

for(i=0;i

for(j=0;j

for(k=0;k

for(i1=i;i1

for(j1=j;j1

for(k1=k;k1

c[i1*n+j1]+=a[i1*n+k1]*b[k1*n+j1];

}

}

}

}

}

}

}

inline double compute_time(clock_t begin,clock_t end)

{

return static_cast(static_cast((end-begin))/ static_cast(CLOCKS_PER_SEC));

}

int main()

{

double*a=(double*)malloc(sizeof(double)*n*n);

double*b=(double*)malloc(sizeof(double)*n*n);

double*c=(double*)malloc(sizeof(double)*n*n);

memset(a,0,sizeof(double)*n*n);

memset(b,0,sizeof(double)*n*n);

memset(c,0,sizeof(double)*n*n);

clock_t start=clock();

mmm(a,b,c,n);

std::cout<

start=clock();

mmm2(a,b,c,n);

std::cout<

}

四、实验结果

1、N = 50和N=100时,结果如下图所示:

2、N = 150和N=200时,结果如下图所示:

3、N=250和N=300时,结果如下图所示:

4、N=350和N=400时,结果如下图所示:

5、N=450和N=500时,结果如下图所示:

6、N=550和N=600时,结果如下图所示:

7、N=650和N=700时,结果如下图所示:

8、N=750和N=800时,结果如下图所示:

9、N=850和N=900时,结果如下图所示:

10、N=950和N=1000时,结果如下图所示:

五、结果分析

1、数据列表如下:

N50100150200250300350400450500

未分

0.0010.0060.0190.0450.1140.1840.3730.4460.866 1.375块

分块00.0070.0180.0440.0920.1450.2350.3310.5230.69

N5506006507007508008509009501000

未分

2.258 1.819 4.213

3.957 6.745 5.2599.8638.6539.8639.801块

分块0.895 1.115 1.627 1.872 2.466 2.742 3.686 4.204 3.686 5.448

2、数据散点图如下:

3、由上图可看出,分块算法比普通算法执行的CPU时间明显缩短了,分块算法更为实用。

六、实验感想

通过本次实验了解了不同算法执行的CPU时间之间的差别。

相关文档
最新文档