CSI-S2:编写高速缓存友好的代码

本文深入分析了缓存在存储系统中的作用,通过矩阵转置、颜色设置和矩阵乘法的代码实例,阐述了如何编写高速缓存友好的代码。文章指出,优化缓存不命中率能显著提升程序性能,建议关注核心函数中的循环,选择步长为1的引用,以及利用分块技术增强时间局部性。
摘要由CSDN通过智能技术生成

       在CSI-VII一篇中,我们了解了存储器系统的层次结构,并知道了层次结构自上而下使用了缓存(cashing)技术,因此我们着重介绍了存储系统中高速缓存的工作原理。本篇内容,我们通过分析几个代码实例来分析高速缓存如何影响程序,并提出如何编写高速缓存友好代码的方法。

代码实例

1. 首先让我们看第一个方法transpose,这是一个矩阵转置函数,定义如下:

 Typedef int array[2][2];
 Void transpose(array dst,array src)
{
         Int I,j;
         For(i=0;i<2;i++)
             For(j=0;j<2;j++){
                  Dst[j][i]=src[i][j];
             }
}

通过这个方法我们先看如何分析缓存的命中情况,在这之前我们假设代码运行的机器具有如下属性:

         Sizeof(int)=4。

         只有一个L1数据高速缓存,它是直接映射、直写、写分配的,块大小为8字节。

         缓存大小为16个数据字节,初始为空。

         Src数组地址从开始,dSt数组地址从16开始。

据此我们可以给出内存和缓存的映射关系:


根据这样的映射关系,我们可以看出每次对于读src或者写Dst数组,都会加载数据到缓存,并且刚好每行只能够放2个元素。例如当我们读元素src[0][0]时,会加载src[0][0],src[0][1]到同一高速缓存行中,这是有其在主存中的地址所决定的。同样,加载dst[0][0]时,也会将dst[0][1]加载进来。对于两个数组中的每个元素,下面的表格给出了其命中情况,m代表不命中,h代表命中。

Dst 数组

列1

列2

行1

m

m

行2

m

                                  

src 数组

1

2

行1

m

m

行2

m

h


        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值