0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

cpu与cache内存交互的过程

嵌入式情报局 来源:人人极客社区 作者:人人极客社区 2022-10-21 09:10 次阅读

What is cache?

CPU缓存(Cache Memory)位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度,又有内存的大容量的存储系统了。缓存对CPU的性能影响很大,主要是因为CPU的数据交换顺序和CPU与缓存间的带宽引起的。

下图是一个典型的存储器层次结构,我们可以看到一共使用了三级缓存:

ba63465c-50d7-11ed-a3b6-dac502259ad0.png

Why should I care about cache?

ba71dab4-50d7-11ed-a3b6-dac502259ad0.png

从延迟上看,做一次乘法一般只要三个周期,而做一次CPU的内存访问需要167个cycle,如果需要提升程序性能,减少CPU的memory访问至关重要。因此,需要采用容量小但是更快的存储器(cache)。

为什么要有多级CPU Cache

随着科技发展,热点数据的体积越来越大,单纯的增加一级缓存大小的性价比已经很低了二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。

同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。另外需要注意的是,L3 Cache和L1,L2 Cache有着本质的区别。,L1和L2 Cache都是每个CPU core独立拥有一个,而L3 Cache是几个Cores共享的,可以认为是一个更小但是更快的内存。

baa1a67c-50d7-11ed-a3b6-dac502259ad0.png

使用dmidecode命令查看cache size:

babfb3c4-50d7-11ed-a3b6-dac502259ad0.png

cpu与cache 内存交互的过程

CPU接收到指令后,它会最先向CPU中的一级缓存(L1 Cache)去寻找相关的数据,然一级缓存是与CPU同频运行的,但是由于容量较小,所以不可能每次都命中。这时CPU会继续向下一级的二级缓存(L2 Cache)寻找,同样的道理,当所需要的数据在二级缓存中也没有的话,会继续转向L3 Cache、内存(主存)和硬盘。

程序运行时可以使用perf工具观察cache-miss的rate

什么是cache line

Cache Line可以简单的理解为CPU Cache中的最小缓存单位。内存和高速缓存之间或高速缓存之间的数据移动不是以单个字节或甚至word完成的。相反,移动的最小数据单位称为缓存行,有时称为缓存块。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存,那么按照64B的缓存单位大小来算,这个一级缓存所能存放的缓存个数就是512/64 = 8个。

查看cache line大小:

cat /sys/devices/system/cpu/cpu1/cache/index0/coherency_line_size

cache line的影响:

for(inti=0;i< N; i+=k) 
    arr[i] *= 3;
bae98c8a-50d7-11ed-a3b6-dac502259ad0.png

注意当步长在1到16范围内,循环运行时间几乎不变。但从16开始,每次步长加倍,运行时间减半。由于16个整型数占用64字节(一个缓存行),for循环步长在1到16之间必定接触到相同数目的缓存行:即数组中所有的缓存行。当步长为32,我们只有大约每两个缓存行接触一次,当步长为64,只有每四个接触一次。

cache写机制

Cache写机制分为write through和write back两种。

Write-through- Write is done synchronously both to the cache and to the backing store.

Write-back (or Write-behind) - Writing is done only to the cache. A modified cache block is written back to the store, just before it is replaced.

Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。

Write-back(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。

cache 一致性

多个处理器对某个内存块同时读写,会引起冲突的问题,这也被称为Cache一致性问题。

Cache一致性问题出现的原因是在一个多处理器系统中,多个处理器核心都能够独立地执行计算机指令,从而有可能同时对某个内存块进行读写操作,并且由于我们之前提到的回写和直写的Cache策略,导致一个内存块同时可能有多个备份,有的已经写回到内存中,有的在不同的处理器核心的一级、二级Cache中。由于Cache缓存的原因,我们不知道数据写入的时序性,因而也不知道哪个备份是最新的。还有另外一个一种可能,假设有两个线程A和B共享一个变量,当线程A处理完一个数据之后,通过这个变量通知线程B,然后线程B对这个数据接着进行处理,如果两个线程运行在不同的处理器核心上,那么运行线程B的处理器就会不停地检查这个变量,而这个变量存储在本地的Cache中,因此就会发现这个值总也不会发生变化。

为了正确性,一旦一个核心更新了内存中的内容,硬件就必须要保证其他的核心能够读到更新后的数据。目前大多数硬件采用的策略或协议是MESI或基于MESI的变种:

M代表更改(modified),表示缓存中的数据已经更改,在未来的某个时刻将会写入内存;

E代表排除(exclusive),表示缓存的数据只被当前的核心所缓存;

S代表共享(shared),表示缓存的数据还被其他核心缓存;

I代表无效(invalid),表示缓存中的数据已经失效,即其他核心更改了数据。

cache的局部性

程序在一段时间内访问的数据通常具有局部性,比如对一维数组来说,访问了地址x上的元素,那么以后访问地址x+1、x+2上元素的可能性就比较高;现在访问的数据,在不久之后再次被访问的可能性也比较高。局部性分为“时间局部性”和“空间局部性”,时间局部性是指当前被访问的数据随后有可能访问到;空间局部性是指当前访问地址附近的地址可能随后被访问。处理器通过在内存和核心之间增加缓存以利用局部性增强程序性能,这样可以用远低于缓存的价格换取接近缓存的速度。

时间局部性:

代码1:

for(loop=0;loop<10; loop++) {
    for (i=0; i

代码2:

for(i=0;i

代码2的性能优于代码1,x的元素现在被重复使用,因此更有可能留在缓存中。这个重新排列的代码在使用x[i]时显示更好的时间局部性。

空间局部性:

一个矩阵乘法的例子:

代码1:

fori=1..n
forj=1..n
fork=1..n
c[i,j]+=a[i,k]*b[k,j]

代码2:

fori=1..n
fork=1..n
forj=1..n
c[i,j]+=a[i,k]*b[k,j]

代码2的性能优于代码一的性能。

两者实现上的差异:

baf3c4b6-50d7-11ed-a3b6-dac502259ad0.png

代码2的b[k,j]是按行访问的,所以存在良好的空间局部性,cache line被充分利用。代码1中,b [k,j]由列访问。由于行的存储矩阵,因此对于每个缓存行加载,只有一个元素用于遍历。

cache替换策略

Cache工作原理要求它尽量保存最新数据,当从主存向Cache传送一个新块,而Cache中可用位置已被占满时,就会产生Cache替换的问题。

常用的替换算法有下面三种。

LFU

LFU(Least Frequently Used,最不经常使用)算法将一段时间内被访问次数最少的那个块替换出去。每块设置一个计数器,从0开始计数,每访问一次,被访块的计数器就增1。当需要替换时,将计数值最小的块换出,同时将所有块的计数器都清零。这种算法将计数周期限定在对这些特定块两次替换之间的间隔时间内,不能严格反映近期访问情况,新调入的块很容易被替换出去。

LRU

LRU(Least Recently Used,近期最少使用)算法是把CPU近期最少使用的块替换出去。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。每块也设置一个计数器,Cache每命中一次,命中块计数器清零,其他各块计数器增1。当需要替换时,将计数值最大的块换出。LRU算法相对合理,但实现起来比较复杂,系统开销较大。这种算法保护了刚调入Cache的新数据块,具有较高的命中率。LRU算法不能肯定调出去的块近期不会再被使用,所以这种替换算法不能算作最合理、最优秀的算法。但是研究表明,采用这种算法可使Cache的命中率达到90%左右。

随机替换

最简单的替换算法是随机替换。随机替换算法完全不管Cache的情况,简单地根据一个随机数选择一块替换出去。随机替换算法在硬件上容易实现,且速度也比前两种算法快。缺点则是降低了命中率和Cache工作效率。

cache的映射

主存与cache的地址映射方式有全相联方式、直接方式和组相联方式三种。

直接映射:将一个主存块存储到唯一的一个Cache行。

多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。cache的行号i和主存的块号j有如下函数关系:i=j mod m(m为cache中的总行数)。

bafe4a30-50d7-11ed-a3b6-dac502259ad0.png

优点:硬件简单,容易实现。缺点:命中率低, Cache的存储空间利用率低。

全相联映射:将一个主存块存储到任意一个Cache行。

主存的一个块直接拷贝到cache中的任意一行上。

bb76532c-50d7-11ed-a3b6-dac502259ad0.png

优点:命中率较高,Cache的存储空间利用率高。缺点:线路复杂,成本高,速度低。

组相联映射:将一个主存块存储到唯一的一个Cache组中任意一个行。

将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的,即有如下函数关系:cache总行数m=u×v 组号q=j mod u

bba37406-50d7-11ed-a3b6-dac502259ad0.png

组间采用直接映射,组内为全相联。硬件较简单,速度较快,命中率较高。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211098
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73870
  • Cache
    +关注

    关注

    0

    文章

    129

    浏览量

    28296

原文标题:CPU中cache那些事,太重要了!

文章出处:【微信号:嵌入式情报局,微信公众号:嵌入式情报局】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    通过内存地址映射能否禁用MSMC上的cache

    请教:         在程序设计时,有时涉及MSMC内存上的频繁交互时,cache一致性维护相当令人头疼。C6678不允许禁止MSMC上的cache,但是我们了解到TI提供了机制将某
    发表于 06-21 06:25

    处理器在读内存过程中,CPU核、cache、MMU如何协同工作?

    处理器中断处理的过程是怎样的?处理器在读内存过程中,CPU核、cache、MMU如何协同工作?
    发表于 10-18 08:57

    嵌入式CPU指令Cache的设计与实现

    针对嵌入式CPU 指令处理速度与存储器指令存取速度不匹配问题,本文基于FPGA 设计并实现了可以有效解决这一问题的指令Cache。根据嵌入式五级流水线CPU 特性,所设计指令Cache
    发表于 08-05 14:27 36次下载

    什么是缓存Cache

    什么是缓存Cache 即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存
    发表于 01-23 10:57 886次阅读

    什么是Cache/SIMD?

    什么是Cache/SIMD?   Cache :即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度
    发表于 02-04 11:29 533次阅读

    什么是Instructions Cache/IMM/ID

    什么是Instructions Cache/IMM/ID  Instructions Cache: (指令缓存)由于系统主内存的速度较慢,当CPU读取指令的时候,会导致
    发表于 02-04 11:51 626次阅读

    Buffer和Cache之间区别是什么?

    cpu在执行程序所用的指令和读数据都是针对内存的,也就是从内存中取得的。由于内存读写速度慢,为了提高cpu
    的头像 发表于 04-02 10:35 6731次阅读

    cache结构与工作原理

    更详细的讲,cache的结构其实和内存的结构类似,也包含地址和内容,只是cache的内容除了存的数据(data)之外,还包含存的数据的物理内存的地址信息(tag),因为
    发表于 06-03 14:24 1.2w次阅读
    <b class='flag-5'>cache</b>结构与工作原理

    cache的排布与CPU的典型分布

    cache的掌握,对于Linux工程师(其他的非Linux工程师也一样)写出高效能代码,以及优化Linux系统的性能是至关重要的。简单来说,cache快,内存慢,硬盘更慢。在一个典型的现代C
    的头像 发表于 10-18 09:01 1863次阅读

    CPU Cache伪共享问题

    CPU想要访问主存中的元素时,会先查看Cache中是否存在,如果存在(称为Cache Hit),直接从Cache中获取,如果不存在(称为Cache
    的头像 发表于 12-12 09:17 650次阅读

    CPU设计之Cache存储器

    Cache存储器也被称为高速缓冲存储器,位于CPU和主存储器之间。之所以在CPU和主存之间要加cache是因为现代的CPU频率大大提高,
    的头像 发表于 03-21 14:34 1172次阅读
    <b class='flag-5'>CPU</b>设计之<b class='flag-5'>Cache</b>存储器

    CPU CACHE策略的初始化

    build_mem_type_table()函数的功能是获取当前CPUCACHE类型,据此初始化mem_type。
    的头像 发表于 06-05 15:03 1360次阅读
    <b class='flag-5'>CPU</b> <b class='flag-5'>CACHE</b>策略的初始化

    多个CPU各自的cache同步问题

      CACHE 的一致性 Cache的一致性有这么几个层面 1.     一个CPU的icache和dcache的同步问题 2.     多个CPU各自的
    的头像 发表于 06-17 10:38 1953次阅读
    多个<b class='flag-5'>CPU</b>各自的<b class='flag-5'>cache</b>同步问题

    Linux性能优化:Cache对性能的影响

    Cache对性能的影响首先我们要知道,CPU访问内存时,不是直接去访问内存的,而是先访问缓存(cache)。 当缓存中已经有了我们要的数据时
    的头像 发表于 10-04 15:31 852次阅读
    Linux性能优化:<b class='flag-5'>Cache</b>对性能的影响

    Cache内存有什么区别

    Cache(高速缓存)和内存(Memory,通常指主存储器或RAM)是计算机存储系统中两个重要的组成部分,它们在计算机的性能和数据处理中扮演着不同的角色。以下是对Cache内存之间区
    的头像 发表于 09-26 15:28 989次阅读