CPU缓存学习

cpu缓存分为L1cache,L2cache,L3cache

L1为每个cpu独有缓存,L3为几个cpu的共有缓存,所以内存大小L3也是最大
相应的L1,L2,L3速度也是由快到慢

cpu cache从内存读取数据的单位是缓存块(Cache Line),大小取决于coherency_line_size

访问cpucache,需要从cpu line中读取,地址索引由组标记,cpuline索引,偏移量组成

cpu在cache中查询数据:直接映射(还有其他方式)

1.根据内存地址中索引信息,计算在 CPU Cahe 中的索引,也就是找出对应的 CPU Line 的地址;

2.找到对应 CPU Line 后,判断 CPU Line 中的有效位,确认 CPU Line 中数据是否是有效的,如果是无效的,CPU 就会直接访问内存,并重新加载数据,如果数据有效,则往下执行;

3.对比内存地址中组标记和 CPU Line 中的组标记,确认 CPU Line 中的数据是我们要访问的内存数据,如果不是的话,CPU 就会直接访问内存,并重新加载数据,如果是的话,则往下执行;

4.根据内存地址中偏移量信息,从 CPU Line 的数据块中,读取对应的字。


想让代码运行的更快,就是尽量多的命中cpucache
比如二维数组在内存中的布局:int[2][2] ========> a[0][0] a[0][1] a[1][0] a[1][1]

两种使用方法:

1.
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
a[i][j]
}
}

2.
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
a[j][i]
}
}


明显方法1访问数据的顺序是按序的,因为cpucache的取数据是一块一块取得,方法二的话就得跳转,如果行列数比较大的话还得重新读取内存

怎么提升多核cpu的效率:当执行计算密集型任务时,l1和l2因为是cpu独有的cache,缓存命中率就会降低,可以绑定到一个核心进行操作

posted @ 2023-04-13 20:13  山野村夫01  阅读(49)  评论(0编辑  收藏  举报