储器层次结|「计算机组成原理」:高速缓存存储器( 六 )
第四轮:读取src[1][1]时,其地址为...01100,需要访问组1,可以发现标志位相同,缓存命中了。对dest[1][1]写时,其地址为...11100,需要访问组1,发现标志位不相同,出现写不命中,就会将包含dest[1][0]和dest[1][1]的数据块保存到组1中。
2 存储器山
一个程序从存储器系统中读取数据的速率称为读吞吐量(Read Throughput)或读带宽(Read Bandwidth),单位为MB/s。 我们通过以下代码来衡量空间局部性和时间局部性对程序吞吐量的影响
文章插图
第37行我们首先对高速缓存进行暖身,然后在第38行计算程序运行的时钟周期个数。
- 时间局部性:通过size来控制我们工作集的大小,由此来控制工作集存放的高速缓存的级别。假设工作集很小,则工作集会全部存放在L1高速缓存中,模拟了时间局部性优异的程序反复读取之前访问过的数据,则都是从L1高速缓存读取数据的。假设工作集很大,则工作集会存放到L3高速缓存中,模拟了时间局部性很差的程序,不断读取新的数据,则会出现缓存不命中,而不断从L3高速缓存中取数据的过程。所以通过控制工作集大小,来模拟程序局部性。
- 空间局部性:通过stride来控制读取的步长,来控制程序的空间局部性。

文章插图
可以保持stride不变,观察高速缓存的大小和时间局部性对性能的影响

文章插图
可以发现,当工作集大小小于L1高速缓存的大小时,模拟了时间局部性很好的程序,所有都都是直接在L1高速缓存中进行的,则吞吐量较高;当工作集大小较大时,模拟了时间局部性较差的程序,读操作需要从更高的高速缓存中加载,则吞吐量下降了。
可以保持工作集为4MB,沿着L3山脊查看空间局部性对性能的影响

文章插图
可以发现,步长越小越能充分利用L1高速缓存,使得吞吐量较高。当步长为8字节时,会跨越64字节,而当前高速缓存的块大小只有64字节,说明每次读取都无法在L2高速缓存中命中,都需要从L3高速缓存读取,所以后续保持不变。
综上所述:需要利用时间局部性来访问L1高速缓存,还需要利用空间局部性,使得尽可能多的字从一个高速缓存行中读取到。
3 改善程序
3.1 重新排列循环来改善空间局部性
我们可以有不同的循环方式来实现矩阵乘法
- 多年养花总结:大蒜能治蚜虫、浇水要控温、换盆可美化株型
- 辅食添加|6月辅食添加总结,最真实的反馈来啦!
- 君王|此人把怀孕妻子送给皇帝,结果却被妻子极其哥哥处死
- 就是|此人想学自己老爹造反称帝,结果却被活活烤死,下场极其悲催
- 女儿|吕布被曹操斩首后,把赤兔马送给关羽,吕布之女结局如何?
- 恭喜!他们结婚了!
- 金弹子不结果,这3大原因造成的,对症下药提高座果率
- 美女带满绿翡翠观音进行鉴宝,纠结嫁妆选观音还是房产?
- 伯温|刘伯温智比诸葛亮,才比萧何张良,可结局却是那么地悲凉!
- 此皇帝因偷国库中的钱,结果朝会时被群臣从龙椅上拖下来痛打20棍
