一个例子,我们来看看矩阵乘法中不同循环顺序对程序性能的影响:
我们知道,改变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结构;某些结果的计算依赖于前面计算的结果,在前面结果未出时,某些计算就开始排队等待。计算顺序的不合理安排,导致了计算时间的不必要增加。并行计算就是基于这个理念进行程序性能的优化的。
新闻热点
疑难解答