分块矩阵乘法的程序性能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 } 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时间之间的差别。