ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识

缓存维护策略

  • 一,分配策略 Allocation policy
    • 1.1 写分配 Write allocation (WA)
      • ARMv8
      • ARMv7
    • 1.2 Read allocation (RA)
  • 二,替换策略 Replacement policy
    • 2.1 循环替换策略:Round-robin or cyclic replacement
    • 2.2 伪随机替换策略:Pseudo-random replacement
    • 2.3 最近最少使用替换策略:Least Recently Used (LRU)
  • 三,写策略 Write policy
    • 3.1 写回法-Write-back (WB)
    • 3.2 写通法-Write-through (WT)
  • 四,缓存维护策略的组合方式
  • 五,分析,影响cache性能的因素
  • 六,参考文档

针对不同的使用场景,有不同的cache 策略来影响cache的操作。缓存策略使我们能够描述何时应该将一个cache line写入给data cache,以及当执行store指令并发生cache hit时应该发生什么。cache 策略(policy)主要分为:

  • 分配策略 Allocation policy:控制什么操作可以导致 linefill (将外部内存的一个cache line大小的数据拷贝到cache中)。
  • 替换策略 Replacement policy:针对组相联cache,当发生linefill时,用于选择将数据放入哪个cache line。如果被选中的cache line上有数据,旧数据将会被替换出去。
  • 写策略 Write policy :当CPU 进行写操作时,在cache 中命中,用于决定写入cache 的行为。

一,分配策略 Allocation policy

当CPU 发起一个read/write 请求后,首先会进行 cache look-up,如果出现了 cache miss,即读写的地址不在cache 当中。这时候就要考虑是否要进行 cache linefill,将该地址上的数据从外部内存中拷贝到cache中了。所以分配策略就是用来决定当发生miss时,是否要进行cache linefill的策略。miss 也分为 read miss 和 write miss,所以分配策略也分为WA和RA。

1.1 写分配 Write allocation (WA)

写分配策略ARMv8 和 ARMv7略有不同:

ARMv8

在ARMv8中,一个write miss 将会触发 linefill。这意味着CPU执行一个 store指令的时候,会导致一个读操作发生。在写操作发生前,一个linefill将会相关数据从外部内存中读取,填充到cache line中。cache line是cache 的最小可加载单元,就算CPU写入只写一个byte的数据,也会加载一个cache line size的数据到cache中。

ARMv7

在ARMv7下,写分配 Write allocation (WA)实际上应该叫做读写分配策略(read-write cache allocate policy)。因为在写分配策略下,无论是read miss 还是 write miss都会造成 cache linefill。一般和 写回(write-back)策略组合起来使用(WA+WB)。

1.2 Read allocation (RA)

当read miss的时候才会发生linefill。在RA策略下,如果发生了write miss,cache 不会受影响,并且该write miss的结果和动作会被传递到下一级内存当中。

二,替换策略 Replacement policy

当发生cache miss的时候,cache controler将会在set中选择一个cache line位置用于放置linefill时即将写入的数据。被选中的cache line称为victim。如果victim中包含有效的、dirty的数据,在为新数据腾出空间之前,该victim cache line上的数据必须先写回到下一级内存当中。这个过程也成为 eviction。替换策略主要是决定哪个cache line会被当做victim。

2.1 循环替换策略:Round-robin or cyclic replacement

循环替换策略意味着有个计数器(victim counter)来记录可用的 way number,当计数器到了最大的way number,就会回到0,从头开始。

2.2 伪随机替换策略:Pseudo-random replacement

使用伪随机的方式随机选择victim cache line。victim counter会以伪随机的方式递增,并且可以指向set中的任意一个cache line。

2.3 最近最少使用替换策略:Least Recently Used (LRU)

将最近最少使用的cache line作为victim,替换出去。

ARM的绝大部分处理器都支持循环替换策略和伪随机替换策略。Cortex-A15也支持LRU策略。循环替换策略通常更容易预测下一个victim,但是如果频繁读写固定pattern的地址数据(cache line固定)循环策略很容易将经常使用的cache line替换出去,而LRU替换策略设计成本较高,所以更推荐使用伪随机替换策略。
比如常见的cortex-A53,Cortex-R4, Cortex-R5和 Cortex-R7 都使用伪随机替换策略。

三,写策略 Write policy

当CPU执行一个store指令的时候,首先进行cache look-up,如果发生了cache write hit,那接下来将有两种选择:

3.1 写回法-Write-back (WB)

在写回策略下,写操作只会发生在cache 中,而不是主存中。这意味着cache 里的数据和主存里的数据将会出现不一致的现象:cache 里保存的是最新的数据,而主存中保存的是旧数据(stale data)。所以为了区分新旧数据,cache line里有个dirty标志位,来表明该cache line里的数据是否与下一级内存中的数据保持一致。当新数据写入cache line中而不是主存的时候,该cachle line的dirty bit将会被置位。
ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识_第1张图片

什么时候cache里的数据才会被写回到主存呢?主要有两种方式:

  • 当发生cache line eviction时,victim cache line将会被写回到下一级内存。
  • 软件使用显式的cache 维护指令时,比如clean/invalidate.
    WB的优势:可以显著地提高性能和节省能耗,因为在WB策略下,CPU写操作大部分时间都是与cache 进行交互,只有在需要的时候,数据才会写回到主存中,极大地减少了向主存搬运数据的动作。
    WB的劣势:cache里的数据和主存中的不一致,尤其是在多核场景下,数据一致性问题(coherency issues)尤为重要。此外,要实现WB,其硬件结构也比WT更复杂。
    ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识_第2张图片

3.2 写通法-Write-through (WT)

与WB策略不一样,在WB策略下,每次写操作都会写入cache 和主存中。这意味着不需要考虑cache和主存之间的数据一致性问题,所以也不会将cache line的dirty bit置位。但是因为每次写操作都要写到主存中,所以通常情况下WT的性能是要显著低于WB的,尤其是当频繁更新一些相同地址上的数据的时候。如果一大块连续的内存被写入,并且写入的数据进入buffer中,WT策略可能有帮助。另外,如果这些数据在写完后就不再被使用、不会被立刻使用或者很少被使用(大规模的数据拷贝或者内存初始化),对于这种写操作,最好就不用填充到cache当中了,使用WT直接写入内存可能更有帮助。
WT的优势在于硬件结构简单,不存在数据一致性问题。但是其劣势在于放弃了部分cache带来的高性能以及便捷性。
ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识_第3张图片
ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识_第4张图片

四,缓存维护策略的组合方式

首先replacement policy根据不同的架构实现,可以选择支持不同的的策略,不会影响到write policy和allocate policy。而write policy和allocate policy之间却有很深的关联性,首先Write-Through策略和Write-allocate策略就不该组合使用,因为WT策略每一次写,不仅写入cache 中,还会写入主存中,当发生write miss时,不需要进行allocation。所以WA策略通常会搭配Write-back使用。常见的缓存维护策略的组合方式有如下三种:

  • 写回+读分配+写分配,Write-Back, Read-Allocate, Write-Allocate. (WB-RA-WA)
  • 写回+读分配,Write-Back, Read-Allocate only. (WB-RA)
  • 写通+读分配,Write-Through, Read-Allocate only. (WT-RA)

五,分析,影响cache性能的因素

通过上文关于缓存策略的描述,我们可以得到缓存性能的关键指标:

  • hit/miss ratio:命中率,或者说时miss的概率。
  • miss penalty:当发生miss时,系统需要额外进行哪些操作(associated costs of a miss penalty)。
  • time for hit :发生hit/miss所需的时间,cache controler收到一个地址,需要进行cache look-up(cache 遍历查找),才能确定是否hit或者miss,而这个查找的时间与cache的结构(组相联、直接映射、全相联映射)有关。

miss penalty和time for hit 与ARM架构的具体实现紧密相关,作为软件层,如果想提高缓存的性能以及系统性能,我们唯一能做的就是提高命中率或者减小miss的概率。

六,参考文档

https://developer.arm.com/documentation/den0042/a/Caches/Cache-policies
https://developer.arm.com/documentation/den0013/d/Caches/Cache-policies
http://users.ece.northwestern.edu/~kcoloma/ece361/lectures/Lec14-cache.pdf
https://blog.feabhas.com/2020/10/introduction-to-the-arm-cortex-m7-cache-part-2-cache-replacement-policy/#D-Cache_Replacement_Policy

你可能感兴趣的:(ARM,arm开发,缓存,嵌入式,写通,写回,读分配,写分配)