什么是cache?为什么需要cache?cache存在的合理性


为什么需要cache?

..这里用一句话概括,CPU的数据处理速度,远远高于从内存中读取数据的速度,也就是说,如果CPU直接从内存中读取数据进行处理,CPU很长一段时间会用在等待数据读取完毕,这显示十分浪费CPU资源的。所以通过cache来缓存一部分数据,CPU读取数据时,先从cache里面找,从而提高数据处理的效率

为什么从cache里面读取就能提高cpu的数据处理效率?

..这是由于这个内存和cache本身的存储性能有关:
  我们常说的内存指的是DRAM,SRAM的是目前最快的存储设备,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。

cache存在的合理性

从上面的知识,我们可以知道,从cache读取数据要比内存中读取块,但是cache终究只有很小一块存储空间,那凭什么通过这么一小块空间,就能大幅度提高数据读取的能力呢?

程序的局部性原理


#include <stdio.h>
int main(){
    int i,j;
    for(i=1;i<=9;i++){        
        for(j=1;j<=i;j++){
            printf("%d*%d=%2d  ",i,j,i*j);
        }
        printf("\n");
    }
    return 0;
}

..从上面程序可以看到,这个代码大数时间在执行一个乘法计算和调用一个 printf 函数,而程序一旦编译装载进内存中,它的地址就确定了。也就是说,CPU 大多数时间在访问相同或者与此相邻的地址,换句话说就是:CPU 大多数时间在执行相同的指令或者与此相邻的指令。这就是大名鼎鼎的程序局部性原理。
  CPU 大多数时间在访问相同或者与此相邻的地址。那么,我们立马就可以想到用一块小而快的储存器,放在 CPU 和内存之间,就可以利用程序的局部性原理来缓解 CPU 和内存之间的性能瓶颈。这块小而快的储存器就是 Cache,即高速缓存。

什么是cache?

..Cache 中存放了内存中的一部分数据,CPU 在访问内存时要先访问 Cache,若 Cache 中有需要的数据就直接从 Cache 中取出,若没有则需要从内存中读取数据,并同时把这块数据放入 Cache 中。但是由于程序的局部性原理,在一段时间内,CPU 总是能从 Cache 中读取到自己想要的数据。
  Cache 可以集成在 CPU 内部,也可以做成独立的芯片放在总线上,现在 x86 CPU 和 ARM CPU 都是集成在 CPU 内部的。其逻辑结构如下图所示。

img

Cache 主要由高速的静态储存器、地址转换模块和 Cache 行替换模块组成。

Cache 会把自己的高速静态储存器和内存分成大小相同的行,一行大小通常为 32 字节或者 64 字节。Cache 和内存交换数据的最小单位是一行,为方便管理,在 Cache 内部的高速储存器中,多个行又会形成一组。

除了正常的数据空间外,Cache 行中还有一些标志位,如脏位、回写位,访问位等,这些位会被 Cache 的替换模块所使用。

cache的工作流程

1.CPU 发出的地址由 Cache 的地址转换模块分成 3 段:组号,行号,行内偏移。

2.Cache 会根据组号、行号查找高速静态储存器中对应的行。如果找到即命中,用行内偏移读取并返回数据给 CPU,否则就分配一个新行并访问内存,把内存中对应的数据加载到 Cache 行并返回给 CPU。写入操作则比较直接,分为回写和直通写,回写是写入对应的 Cache 行就结束了,直通写则是在写入 Cache 行的同时写入内存。

3.如果没有新行了,就要进入行替换逻辑,即找出一个 Cache 行写回内存,腾出空间,替换行有相关的算法,替换算法是为了让替换的代价最小化。例如,找出一个没有修改的 Cache 行,这样就不用把它其中的数据回写到内存中了,还有找出存在时间最久远的那个 Cache 行,因为它大概率不会再访问了。

以上这些逻辑都由 Cache 硬件独立实现,软件不用做任何工作,对软件是透明的

如何写出提高 Cache 命中率的代码?

1、遵从80-20法则,程序80%的时间在运行20%或更少的代码,针对热代码进行优化,才容易产出效果;

2、遵从数据访问的局部性法则,按数据存放顺序访问内存效率远高于乱序访问内存效率,也就是尽量帮助CPU做好数据Cache的预测工作。同样根据Cache大小,做好数据结构的优化工作,进行数据压缩或数据填充,也是提升Cache效率的好方式;

3、遵从指令访问的局部性法则,减少跳转指令,同样是尽量帮助CPU做好数据Cache的预测工作;现代CPU都有一些预测功能【如分支预测】,利用好CPU的这些功能,也会提升Cache命中率;

4、避免计算线程在多个核心之间漂移,避免缓存重复加载,可以绑定核心【物理核即可,不用到逻辑核】,提高效率;

5、去除伪共享缓存:在多核环境下,减少多个核心对同一区域内存的读写并发操作,减少内存失效的情况的发生;

6、合理提高进程优先级,减少进程间切换,可以变相提供Cache提速的效果 7、关闭Swap,可以变相提供内存提速、Cache提速的效果;

8、使用Intel自家的编译器,开启性能优化,很多时候可以提速运算效率;

9、使用C语言,而不是更高级的语言,很多时候可以提速运算效率;

10、直接使用昂贵的寄存器作为变量,可以变相提供加速效果;

结尾

cache会存在数据一致性的问题,由多进程,多CPU引起,具体可查看相关博客

  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在计算机科学中,"cache"(缓存)是一种用于存储临时数据的高速存储器。它位于CPU和主内存之间,目的是提供更快的数据访问速度,以加快计算机系统的整体性能。 Cache属性指的是缓存的特性或参数,用于描述缓存的行为和工作方式。常见的缓存属性包括: 1. 容量(Capacity):指缓存可以存储的数据量。通常以字节或位为单位进行衡量。 2. 关联度(Associativity):指一个缓存块可以映射到多少个缓存行的方式。常见的关联度包括直接映射、全相联映射和组相联映射。 3. 块大小(Block Size):指缓存中每个缓存块的大小。较大的块大小可以提高空间局部性和数据重用,但可能会增加冷启动和容量问题。 4. 替换策略(Replacement Policy):指当缓存已满时,如何选择要替换的缓存块。常见的替换策略包括最近最少使用(LRU)、随机替换等。 5. 写策略(Write Policy):指当数据被修改时,如何处理缓存中对应的数据。常见的写策略包括写回(Write Back)和写直通(Write Through)。 6. 缓存层级(Cache Hierarchy):指计算机系统中多个级别的缓存之间的层次结构。例如,L1缓存、L2缓存、L3缓存等。 这些缓存属性可以根据具体的处理器架构和设计需求而有所不同。通过合理选择和配置这些属性,可以优化缓存的性能,提高计算机系统的整体效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值