首页 > 学院 > 开发设计 > 正文

Cache 结构对程序性能的影响

2019-11-06 07:58:19
字体:
来源:转载
供稿:网友

Cache结构对程序性能的影响

一个例子,我们来看看矩阵乘法中不同循环顺序对程序性能的影响:

这里写图片描述

写一个c代码,很简单#include <stdio.h>#include <stdlib.h>#define m 1000float a[m][m];float b[m][m];float c[m][m];main() { int i,j,k,i0,j0; srand((unsigned)time(NULL)); for(i0=0;i0<m;i0++) { for(j0=0;j0<m;j0++) { a[i0][j0] = (float)rand()/(RAND_MAX); b[i0][j0] = (float)rand()/(RAND_MAX);// PRintf("%f ",a[i0][j0]);// if(j0==m-1)// {// printf("/n");// } } } for(i=0;i<m;i++) for(j=0;j<m;j++){ c[i][j]=0.; } for(i=0;i<m;i++) { for(j=0;j<m;j++) {// printf("%d,%d/n",i,j); for(k=0;k<m;k++) { c[i][j] = c[i][j] + a[i][k]*b[k][j] ; }/* printf("%.2f ",c[i][j]); if (j == m-1) { printf("/n"); }*/ } } return 0;}

我们知道,改变i、j、k循环的先后顺序,不影响程序的结果,我们来看看改变后所用时间的变化,在程序中对下面一段代码修改i、j、k的循环顺序:

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

结果如下:

顺序 时间
i j k 9.798s
i k j 4.934s
k i j 4.831s
j i k 7.996s

出乎意料的是,以我们线性代数常性思维的方式所认同的i、j、k循环排序方式所用的时间最长,而将k循环提到外面去能大大缩短时间。当矩阵规模比较大时,这也为我们程序改进提供了方向。

反思与总结

微处理器的存储结构如下: 这里写图片描述

从一级缓存中提取中间结果的速度远大于低级的缓存,某些循环顺序巧妙利用了计算机的这种Cache结构;某些结果的计算依赖于前面计算的结果,在前面结果未出时,某些计算就开始排队等待。计算顺序的不合理安排,导致了计算时间的不必要增加。并行计算就是基于这个理念进行程序性能的优化的。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表